web-dev-qa-db-ja.com

ライブラリ内にFirebaseを実装する

多くのアプリでSDKとして使用したいライブラリ内にFriebase通知システムを実装したいと思います。

FirebaseがアプリIDを要求していますが、ライブラリ内に実装しているため、アプリIDはありません。

ライブラリを使用するアプリに通知を送信できるようにするにはどうすればよいですか。

前もって感謝します。

26
Aysennoussi

はい、実際にこれを行うことができます。ライブラリでbuild.gradleこれをdefaultConfigフィールドに入れます

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

次に、プロジェクトのgradle.properties

firebaseAppKey = <yourFirebaseAppSecret>;

each project/appの場合、gradle.propertiesでこの変数を定義する必要があります。

プロジェクトごとにFirebaseアプリを作成する必要があります、ただしライブラリにFirebase SDKを含めることができます。

この環境変数の値にアクセスする場合は、BuildConfig.FIREBASE_APP_KEYを使用します(たとえば、firebaseをインスタンス化します)。

9
Joaquim Ley

これらはすべてちょっとハックであるか、あまりにも多くの作業です。ここでは、Nice nの簡単な例を示します(ただし、無作法ですが、長い投稿になるため価値があります)。

ライブラリプロジェクトでFireBaseコードを使用することは可能です。もちろん、使用するアプリケーションはアプリを登録し、アプリID/google-services.jsonファイルを取得する必要があります。

しかし、ライブラリはそうではなく、それについて気にする必要もありません。それを行うのはライブラリではなく、アプリケーションを使用する仕事です。

これは、ライブラリプロジェクト内でfirebase-messagingモジュールを使用した簡単な例です。

YourLibraryモジュールの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.

これは、ライブラリプロジェクトで行う必要があるすべてです。 DO N’Tここにgmsプラグインを適用しますDo n’t google-servicesクラスパスをライブラリbuild.gradleに追加します。

次に、消費型アプリを設定する方法を示します。

MyClientAppの最上位の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()
    }
}

次に、使用するアプリケーションモジュールbuild.gradleをセットアップする必要があります。これは簡単です。プラグインを適用するだけでよく、すべてのFireBaseコードを含む、作成するライブラリモジュールに依存します。

MyClientAppのモジュールレベルの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: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'

注意すべき点:

  • 下部にgoogle-servicesプラグインを適用する必要があります(クライアントモジュールbuild.gradleのみ)。
  • FireBaseコードが含まれているライブラリモジュールに依存しますが、独自の依存関係バージョンを優先して、FireBaseモジュールのバージョンを除外します。
  • アプリはそれ自身のFireBaseバージョンに依存しています。
  • classpath 'com.google.gms:google-services:3.1.1’は、クライアントアプリのトップレベルbuild.gradleにのみ含まれます。
  • もちろん、クライアントアプリを登録し、google-services.jsonをクライアントアプリのプロジェクトに配置する必要があります。
  • アプリのマニフェストで必要なFirebaseServicesを定義します(またはマニフェストマージを使用してライブラリプロジェクトからマージします)
  • google_play_services_versionメタデータタグをクライアントアプリのマニフェストに追加します。
  • ライブラリは、compileOnly依存関係を宣言するときにFireBaseを使用できます/使用する必要があります。

これで、FireBaseを使用するライブラリで定義したFireBaseコードをアプリで使用できるようになります。または、ライブラリモジュールにFireBaseのすべての作業を任せることもできます。

もちろん、これは、Firebaseのようなフレームワークがライブラリモジュールに実装されるように設計されていないため、通常は内部ライブラリに使用されますが、場合によっては実装する必要があります。 。 Mavenを介して配布されるプロジェクトで使用できます。私のライブラリはこれを使用しており、問題が発生することはありません。

更新:

ライブラリモジュールのcompileOnly依存関係を宣言するときは、Firebaseを使用する必要があります。そうすることで、依存関係はビルド出力に追加されません。ただし、ライブラリで依存関係を使用することは許可されます。使用するアプリがFirebaseを使用したい場合、手動で(implementationを使用して)依存する必要があります。これは、アプリケーションでの不要な依存関係/膨張を削減し、このような依存関係を宣言するための「正しい」方法を支援します。 注:モジュールでコードを使用する前に、ランタイムチェックを実行してライブラリが使用可能であることを確認する必要がある場合があります。

7
Sakiboy

1つのオプションは、ライブラリのユーザーにFirebaseプロジェクトを作成させ、結果のgoogle-services.jsonファイルをアプリケーションに渡して、ライブラリがそれに依存するようにすることです。

5
Arthur Thompson

私はこれが受け入れられた回答の古い質問であることを知っていますが、すべての回答には大きな不満があります。ライブラリにユーザーを追加して、アプリケーションをライブラリに追加する必要があります。それを行う方法がありますライブラリのユーザーをまったく悩ませることなくライブラリがMavenリポジトリからダウンロードされている場合。

注:このメソッドはハックであり、Firebaseではサポートされていません。 Firebaseサポートに尋ねられたとき、私は次の返答を受け取りました:

Firebase SDKはライブラリプロジェクト用ではありません。 Firebaseで利用可能な機能は、モジュールごとやライブラリごとではなく、アプリケーションレベルで統合されていたため、これをライブラリプロジェクトに統合するためのユースケースは不可能であるか、サポートされていません。

それにもかかわらず、私はそれを行う方法を見つけました、そして誰かがそれが役に立つと思うので、ここにそれがあります:

これはRealtime Databaseの使用例ですが、すべてのFirebase SDKで機能するはずです。

プロジェクトのメインbuild.gradleにmavenCentralリポジトリを追加します。

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

ライブラリプロジェクトのbuild.gradleに、Google Play開発者サービスを(プラグインとしてではなく、依存関係として)追加します。

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

関連するFirebase SDKを追加します(Google Play開発者サービスと同じバージョン):

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

SDKをFirebasのプロジェクトとして登録し、google-services.jsonをダウンロードして、任意のテキストエディターで開きます。

ライブラリのstrings.xmlに次の行を追加し、これらの行に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>

これだよ。 libarayでFirebase Realtime Databaseを使用し、それをビルドしてMavenに公開できます(Mavenへの公開は不可欠です。それ以外の場合、ライブラリのユーザーは依存関係を手動で追加する必要があります)。アプリケーション内からアクティブ化すると、データベースが使用されます。

ライブラリのユーザーがGoogle Play ServicesまたはFirebaseを使用する場合、このメソッドは例外や予期しない動作を引き起こす可能性があることに注意してください自己責任で使用してください

5
Sir Codesalot

私の知る限りではできません。

各Firebaseプロジェクトには、アプリを1つずつ一意に識別するためにパッケージIDが必要です。

また、各IDごとに特別に生成される独自のgoogle-services.jsonを使用して、すべてのモジュールを構成する必要があります。

すべてのアプリに同じパッケージを使用できる場合は、デバイスまたはPlayストア自体が互いに区別できないため、オプションはありません。

すべてのFirebaseロジックをライブラリに抽出できますが、固有のパッケージIDを提供するためにすべてのアプリを構成する必要があり、すべてのIDにも通知を送信する必要があります。

0
josemigallas