14

Ich möchte das Friebase-Benachrichtigungssystem in einer Bibliothek implementieren, die ich in vielen Apps als SDK verwenden möchte.Implementieren von Firebase innerhalb einer Bibliothek

Firebase fragt jetzt nach einer App-ID, aber ich implementiere sie in einer Bibliothek, also keine App-ID.

Wie konnte ich mein Ziel erreichen, Benachrichtigungen an meine Apps senden zu können, die meine Bibliothek verwenden?

Vielen Dank im Voraus.

+0

Ich würde dies denken, indem Sie die App-ID in die Bibliothek über eine Initialisierung der Bibliothek von Ihrem Haupt-App übergeben. –

+0

Hey @Sekai, wenn meine Antwort Ihr Problem gelöst hat, bitte markieren Sie es als akzeptiert (SO-Richtlinie) –

Antwort

6

Ja, Sie können dies tatsächlich tun, auf Ihrer Bibliothek build.gradle diese in das Feld

DefaultConfig setzen
buildConfigField("String", "FIREBASE_APP_KEY", "\"${firebaseAppKey}\"") 

Dann in Ihrem Projekt gradle.properties

firebaseAppKey = <yourFirebaseAppSecret>;

Für jedes Projekt/app Sie muss diese Variable auf Ihrem gradle.properties definieren.

Sie müssen für jedes Projekt eine Firebase-App erstellen, aber Ihre Bibliothek kann jetzt das Firebase SDK haben.

Wenn Sie auf diesen Umgebungsvariablenwert zugreifen möchten, verwenden Sie BuildConfig.FIREBASE_APP_KEY (z. B. Instanziierung Firebase).

+0

Ich hoffte auf eine Lösung, die minimale Manipulation von Entwicklern erfordert. Wir werden dies versuchen und wenn es nicht funktioniert, werden wir versuchen, Sockets Benachrichtigungen zu implementieren – Sekai

+0

@Sekai Ich denke, nur die Gradle-Dateien zu konfigurieren ist durchaus akzeptabel. Wenn Sie Ihre Bibliothek so voreinstellen, wäre ich als Entwickler sehr zufrieden. Das einzige, was Ihr "Client" tun muss, ist, seine eigene Firebase-App zu erstellen (umsonst) und seinen eigenen Schlüssel zu verwenden. Auf diese Weise wird der Schlüssel nirgends verfügbar gemacht, vorausgesetzt, Sie laden nicht Ihren 'Gradle' hoch. Eigenschaften "(was Sie nicht sollten). –

5

Eine Option ist, dass der Benutzer Ihrer Bibliothek ein Firebase-Projekt erstellt und dann die resultierende Datei google-services.json in ihre Anwendung eingibt, von der Ihre Bibliothek abhängig sein kann.

0

Soweit ich weiß, können Sie nicht.

Jedes Firebase-Projekt benötigt Paket-IDs, um jede seiner Apps eindeutig zu identifizieren.

Sie müssen auch jedes Modul mit seinem eigenen google-services.json konfigurieren, das speziell für jede ID generiert wird.

Wenn Sie das gleiche Paket für alle Ihre Apps verwenden könnten, wäre ein Gerät oder der Play Store nicht in der Lage, voneinander zu unterscheiden, also keine Option.

Sie könnten die gesamte Firebase-Logik in Ihre Bibliothek extrahieren, aber Sie müssten dennoch jede App konfigurieren, um eine eindeutige Paket-ID bereitzustellen, und Sie müssten auch eine Benachrichtigung an jede ID senden.

2

Ich weiß, das ist eine alte Frage mit einer akzeptierten Antwort, aber alle Antworten haben eine große disadventage - sie den Benutzer Ihrer Bibliothek erfordern Arbeit zu tun, außer Ihrer Bibliothek zu ihrer Anwendung hinzufügen. Es gibt einen Weg, es ohne beunruhigend den Benutzer Ihrer Bibliothek an allen zu tun, wenn Ihre Bibliothek aus einer Maven-Repository heruntergeladen wird.

Hinweis: Diese Methode ist ein Hack und wird von Firebase nicht unterstützt. Wenn Firebase Unterstützung bat, bekam ich folgende Antwort:

Firebase SDKs sind nicht für Bibliotheksprojekte vorgesehen.Die auf Firebase verfügbaren Funktionen wurden in eine Anwendungsebene integriert und nicht pro Modul oder pro Bibliotheksbasis auf , so dass der Anwendungsfall, diese in ein Bibliotheksprojekt integriert zu haben, nicht möglich oder nicht unterstützt wird.

Trotzdem habe ich einen Weg gefunden, es zu tun und baybe jemand findet es sinnvoll, so ist es hier:

Dies ist ein Beispiel für die Verwendung von Echtzeit-Datenbank, aber es sollte für alle Firebase SDKs arbeitet .

in Ihrem Projekt Haupt build.gradle mavenCentral Repository hinzufügen:

allprojects { 
    repositories { 
     ... 
     mavenCentral() 
    } 
} 

In Ihrer Bibliothek Projekt build.gradle, fügen Sie Google Play-Dienste (als Abhängigkeit, nicht als Plugin):

compile 'com.google.android.gms:play-services-gcm:11.0.4' 

speichern relevante Firebase SDKs (mit derselben Version wie Google Play Services):

compile 'com.google.firebase:firebase-core:11.0.4' 
compile 'com.google.firebase:firebase-database:11.0.4' 

Registrieren Sie Ihr SDK als ein Projekt auf Firebas, laden Sie es google-services.json herunter und öffnen Sie es mit einem beliebigen Texteditor. es

In Ihrer Bibliothek strings.xml die folgenden Zeilen hinzufügen und diese Zeilen mit Daten aus google-services.json

<string name="gcm_defaultSenderId">project_number</string> 
<string name="google_api_key">current_key</string> 
<string name="google_app_id">mobilesdk_app_id</string> 
<string name="google_crash_reporting_api_key">current_key</string> 
<string name="google_storage_bucket">storage_bucket</string> 
<string name="firebase_database_url">firebase_url</string> 
<string name="default_web_client_id">client_id</string> 
<string name="project_id">project_id</string> 

Dies ist zu füllen. Sie können Firebase Realtime Database in Ihrem libaray verwenden, es dann erstellen und es in Maven veröffentlichen (die Veröffentlichung in Maven ist wesentlich, andernfalls muss der Benutzer Ihrer Bibliothek die Abhängigkeiten manuell hinzufügen). Wenn sie innerhalb einer Anwendung aktiviert wird, wird Ihre Datenbank verwendet.

Beachten Sie, dass diese Methode zu Ausnahmen und unerwartetem Verhalten führen kann, wenn der Benutzer Ihrer Bibliothek Google Play Services oder Firebase verwendet. Verwenden Sie daher auf eigenes Risiko !

1

Das sind alle irgendwie hacky oder zu viel Arbeit, hier ist ein schönes n einfaches Beispiel (ironisch, denn es ist ein langer Post - aber es lohnt sich).

Es ist möglich, FireBase Code in Ihrem Bibliotheksprojekt zu verwenden, natürlich muss die verbrauchende Anwendung die App registrieren und die App ID/google-services.json Datei erhalten.

Aber Ihre Bibliothek ist nicht, und sollte nicht darum kümmern, es ist die aufwendige Anwendungen Job, nicht Ihre Bibliothek.

Hier ist ein kurzes Beispiel mit dem firebase-messaging Modul in einem Bibliotheksprojekt.

Yourlibrary Moduls build.gradle:

// Other typical library set up 
apply plugin: 'com.android.library' 

android { 
    compileSdkVersion 27 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 27 
     versionCode 1 
     versionName '1.0' 

     // Don’t for get your library’s proguard file! 
     consumerProguardFiles 'proguard-rules.pro' 
    } 
} 

ext { 
    currentFirebaseVersion = "11.8.0" 
} 

dependencies { 
    /* 
    Here we depend on the firebase messaging dependency (via compileOnly), 
    allowing us to use the FireBase API within our library module. 

    I exclude that org.json module because it may cause build warnings, this 
    step isn’t totally necessary. 

    NOTE: You should use `compileOnly` here so the dependency is 
    not added to the build output You will be allowed to use the 
    dependency in your library. If the consuming app wants to use firebase 
    they’ll need to depend on it (using `implementation`). 
    */ 
    compileOnly("com.google.firebase:firebase-messaging:$currentFirebaseVersion") { 
     exclude group: 'org.json', module: 'json' 
    } 
} 

// Other typical library set up. But nothing else relating Firebase. 

Das ist alles, was Sie brauchen in Ihrer Bibliothek Projekt zu tun. NICHT wenden Sie das Gms-Plug-In hier an, und nicht Fügen Sie den Klassenpfad google-services zu den Bibliotheken build.gradle hinzu.

Jetzt ist hier, wie Sie Ihre raubend App einrichten:

MyClientApp Top-Level-build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     google() // You know the drill... 
    } 
    // Any other set up you might have... 

    dependencies { 
     classpath 'com.android.tools.build:gradle:3.0.1' 
     /* 
     Here in your client app’s top-level build.gradle you add the 
     google-services to the app’s classpath. 
     */ 
     classpath 'com.google.gms:google-services:3.2.0' 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 
// Other basic stuff... 
allprojects { 
    apply plugin: 'maven' 
    apply plugin: 'maven-publish' 

    repositories { 
     jcenter() 
     google() 
    } 
} 

Jetzt müssen wir die nutzenden Anwendungen Modul build.gradle einzurichten, es ist einfach. Wir müssen lediglich das Plug-in anwenden und hängen von dem von uns erstellten Bibliotheksmodul ab, das den gesamten FireBase-Code enthält.

MyClientApp der Modulebene build.gradle:

buildscript { 
    repositories { 
     google() 
     mavenLocal() 
    } 
} 
apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 27 
    defaultConfig { 
     applicationId "com.your.application.that.can.use.firebase" 
     minSdkVersion 16 
     targetSdkVersion 27 
     versionCode 1 
     versionName '1.0' 
    } 
    //other typical set up 
} 

ext { 
    currentFirebaseVersion = "11.8.0" 
} 

dependencies { 
    implementation('com.your.library:YourLibrary:[email protected]') { 
     transitive = true 
     // Use the consuming application's FireBase module, so exclude it 
     // from the dependency. (not totally necessary if you use compileOnly 
     // when declaring the dependency in the library project). 
     exclude group: 'com.google.firebase' 
     // Exclude the "plain java" json module to fix build warnings. 
     exclude group: 'org.json', module: 'json' 
    } 

    implementation("com.google.firebase:firebase-messaging:$currentFirebaseVersion") { 
     // Exclude the "plain java" json module to fix build warnings. 
     exclude group: 'org.json', module: 'json' 
    } 
} 

// Needs to be at the bottom of file. 
apply plugin: 'com.google.gms.google-services' 

Einige Dinge zu beachten:

  • Muss Google-Dienste Plugin am Boden gilt (nur im Client-Modul build.gradle).
  • Abhängig von dem Bibliotheksmodul, das den Code FireBase enthält, aber es ist die Version des Moduls FireBase zugunsten Ihrer eigenen Abhängigkeitsversion auszuschließen.
  • App hängt von der eigenen FireBase Version ab.
  • classpath 'com.google.gms:google-services:3.1.1’ geht nur in der obersten Ebene der Client-App build.gradle.
  • Natürlich müssen Sie die Client-App registrieren und die google-services.json in das Projekt Ihrer Client-App einfügen.
  • definieren die notwendigen FirebaseService s in Manifest Ihrer App (oder manifest Fusion sie von Ihrem Bibliotheksprojekt in verwenden und fusionieren)
  • Fügen Sie den google_play_services_version Meta-Daten-Tag auf Ihren Client App-Manifest.
  • Die Bibliothek kann/sollte compileOnly bei der Deklaration der FireBase Abhängigkeit verwenden.

Jetzt werden Sie in der Lage sein FireBase Code in Ihrer Anwendung zu verwenden, die Sie in Ihrer Bibliothek definiert, die FireBase verwendet. Oder Sie könnten Ihr Bibliotheksmodul alle FireBase arbeiten lassen!

Natürlich wird dies normalerweise für interne Bibliotheken verwendet, da Frameworks wie Firebase nicht entworfen wurden, um in Bibliotheksmodulen implementiert zu werden, aber manchmal müssen Sie dies tun, also ist dies eine einfache nicht-hacky/vernünftige Lösung für das Problem. Es kann auf Projekten verwendet werden, die über Maven verteilt werden - meine Bibliothek verwendet dies und es hat nie irgendwelche Probleme verursacht.

Update:

sollten Sie compileOnly verwenden, wenn die Bibliothek des Moduls Firebase Abhängigkeit deklarieren. Dadurch wird die Abhängigkeit nicht zur Build-Ausgabe hinzugefügt. Aber Sie können die Abhängigkeit in Ihrer Bibliothek verwenden. Wenn die konsumierende App firebase verwenden möchte, muss sie sich manuell darauf verlassen (unter Verwendung von implementation). Dies wird helfen, unnötige Abhängigkeiten/Aufblähungen in Anwendungen zu reduzieren und den "richtigen" Weg, eine Abhängigkeit wie diese zu deklarieren. Hinweis: Sie müssen möglicherweise Laufzeitprüfungen durchführen, um sicherzustellen, dass die Bibliothek verfügbar ist, bevor Sie den Code in Ihrem Modul verwenden.