web-dev-qa-db-fra.com

Implémenter Firebase à l'intérieur d'une bibliothèque

Je souhaite implémenter le système de notifications Friebase dans une bibliothèque que je souhaite utiliser comme SDK dans de nombreuses applications. 

Firebase demande maintenant un identifiant d'application, mais je l'implémente dans une bibliothèque, donc pas d'identifiant d'application. 

Comment pourrais-je atteindre mon objectif de pouvoir envoyer des notifications aux applications qui utilisent ma bibliothèque? 

Merci d'avance.

20
Sekai

Oui, vous pouvez réellement faire cela, dans votre bibliothèque build.gradle, mettez ceci dans le champ defaultConfig

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

Puis dans le gradle.properties de votre projet

firebaseAppKey = <yourFirebaseAppSecret>;

Pour each project/app, vous devez définir cette variable sur votre gradle.properties

Vous devrez créer une application Firebase pour chaque projet , mais votre bibliothèque peut désormais disposer du SDK Firebase.

Lorsque vous souhaitez accéder à cette valeur de variable d’environnement, utilisez BuildConfig.FIREBASE_APP_KEY (Par exemple, instancier Firebase).

9
Joaquim Ley

Une option consiste à demander à l'utilisateur de votre bibliothèque de créer un projet Firebase, puis de transférer le fichier google-services.json résultant dans leur application, votre bibliothèque pouvant en dépendre.

5
Arthur Thompson

C’est un peu un travail fastidieux, c’est un exemple simple et gentil (ironique cependant, car c’est un long post - mais qui en vaut la peine).

Il est possible d'utiliser du code FireBase dans votre projet de bibliothèque. Bien entendu, l'application consommatrice devra enregistrer l'application et obtenir le fichier ID/google-services.json de l'application. 

Mais votre bibliothèque ne le fait pas et ne devrait pas s’inquiéter de cela, c’est le travail consommant pour les applications, et non votre bibliothèque. 

Voici un bref exemple utilisant le module firebase-messaging à l’intérieur d’un projet de bibliothèque.

Build.gradle du module YourLibrary

// 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.

C'est tout ce que vous devez faire dans votre projet de bibliothèque. NE PAS appliquer le plug-in gms ici, et ne pas ajouter le chemin de classe google-services aux bibliothèques build.gradle.

Voici comment configurer votre application consommatrice:

build.gradle de niveau supérieur de MyClientApp :

// 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()
    }
}

Maintenant, nous devons configurer le module des applications consommatrices build.gradle, c’est simple. Nous avons à peu près juste besoin d'appliquer le plug-in, et dépendons du module de bibliothèque que nous créons qui contient tout le code FireBase.

Build.gradle du niveau de module de MyClientApp :

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:1.0@aar') {
        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'

Quelques points à noter: 

  • Doit appliquer le plug-in google-services en bas (uniquement dans le module client build.gradle).
  • Comptez sur le module de bibliothèque contenant le code FireBase, mais excluez sa version du module FireBase au lieu de votre propre version de dépendance.
  • L'application dépend de sa propre version FireBase.
  • classpath 'com.google.gms:google-services:3.1.1’ va uniquement dans le niveau supérieur de build.gradle de l'application cliente.
  • Bien sûr, vous devrez enregistrer l’application cliente et insérer le google-services.json dans le projet de celle-ci.
  • Définissez les FirebaseServices nécessaires dans le manifeste de votre application (ou utilisez la fusion de manifestes et fusionnez-les à partir de votre projet de bibliothèque).
  • Ajoutez la balise de méta-données google_play_services_version au manifeste de votre application client.
  • La bibliothèque peut/devrait utiliser compileOnly lors de la déclaration de la dépendance FireBase.

Vous pourrez désormais utiliser le code FireBase dans votre application que vous avez définie dans votre bibliothèque et qui utilise FireBase. Ou vous pouvez laisser votre module de bibliothèque faire tout le travail FireBase!

Bien sûr, cela est généralement utilisé pour les bibliothèques internes, car des frameworks tels que Firebase n’ont pas été conçus pour être implémentés dans des modules de bibliothèque, mais il est parfois nécessaire de le faire. Il s’agit donc d’une solution simple, sans problème. Il peut être utilisé sur des projets distribués via maven - ma bibliothèque l’utilise, et il n’a jamais causé de problèmes. 

Mettre à jour:  

Vous devez utiliser compileOnly lorsque vous déclarez la dépendance Firebase du module de bibliothèque. Ce faisant, la dépendance ne sera pas ajoutée à la sortie de la construction. Mais vous serez autorisé à utiliser la dépendance dans votre bibliothèque. Si l'application consommatrice souhaite utiliser Firebase, elle doit en dépendre manuellement (à l'aide de implementation). Cela aidera à réduire le nombre de dépendances inutiles/de problèmes dans les applications et la «bonne» façon de déclarer une dépendance comme celle-ci. Remarque: Vous devrez peut-être effectuer des vérifications à l'exécution pour vous assurer que la bibliothèque est disponible avant d'utiliser son code dans votre module.

5
Sakiboy

Je sais que c’est une vieille question avec une réponse acceptée, mais toutes les réponses ont un gros inconvénient: elles exigent que l’utilisateur de votre bibliothèque fasse le travail en plus d’ajouter votre bibliothèque à leur application. Il existe un moyen de le faire sans déranger l'utilisateur de votre bibliothèque si votre bibliothèque est en cours de téléchargement à partir d'un référentiel Maven.

Remarque: cette méthode est un hack et n'est pas prise en charge par Firebase. Lorsque le support technique de Firebase a été interrogé, j'ai obtenu la réponse suivante:

Les SDK Firebase ne sont pas destinés aux projets de bibliothèque . Les fonctionnalités disponibles sur Firebase ont été intégrées au niveau de l'application et non Par module ou par bibliothèque, de sorte que le cas d'utilisation de l'intégration de ce Dans un projet de bibliothèque est impossible ou non pris en charge. .

Néanmoins, j'ai trouvé un moyen de le faire et peut-être que quelqu'un le trouvera utile alors le voici:

Ceci est un exemple d'utilisation de la base de données Realtime, mais il devrait fonctionner pour tous les SDK Firebase.

Dans le build.gradle principal de votre projet, ajoutez le référentiel mavenCentral:

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

Dans le build.gradle de votre projet de bibliothèque, ajoutez les services Google Play (en tant que dépendance et non en tant que plug-in):

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

Ajoutez les kits de développement logiciel (SDK) Firebase appropriés (avec la même version que les services Google Play):

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

Enregistrez votre SDK en tant que projet sur Firebas, téléchargez le google-services.json et ouvrez-le avec n’importe quel éditeur de texte.

Dans strings.xml de votre bibliothèque, ajoutez les lignes suivantes et remplissez-les avec les données de 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>

Ça y est. Vous pouvez utiliser la base de données en temps réel Firebase dans votre bibliothèque, puis la construire et la publier sur Maven (la publication sur Maven est essentielle, sinon l'utilisateur de votre bibliothèque devra ajouter les dépendances manuellement). Lorsqu'elle est activée depuis une application, votre base de données sera utilisée.

Notez que cette méthode peut provoquer des exceptions et un comportement inattendu si l'utilisateur de votre bibliothèque utilise les services Google Play ou Firebase afin de l'utiliser à vos risques et périls!

4
Sir Codesalot

Autant que je sache, vous ne pouvez pas. 

Chaque projet Firebase a besoin d’identifiants de paquet afin d’identifier de manière unique chacune de ses applications. 

Vous devez également configurer chaque module avec son propre google-services.json, qui est généré spécifiquement pour chaque identifiant.

Si vous pouviez utiliser le même package pour toutes vos applications, un appareil ou le même Play Store ne pourrait pas se différencier les uns des autres et ne constituerait donc pas une option.

Vous pouvez extraire toute la logique Firebase dans votre bibliothèque, mais vous devez tout de même configurer chaque application pour fournir un identifiant de package unique. Vous devez également envoyer une notification à chaque identifiant.

0
josemigallas