多くのアプリでSDKとして使用したいライブラリ内にFriebase通知システムを実装したいと思います。
FirebaseがアプリIDを要求していますが、ライブラリ内に実装しているため、アプリIDはありません。
ライブラリを使用するアプリに通知を送信できるようにするにはどうすればよいですか。
前もって感謝します。
はい、実際にこれを行うことができます。ライブラリで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をインスタンス化します)。
これらはすべてちょっとハックであるか、あまりにも多くの作業です。ここでは、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'
注意すべき点:
build.gradle
のみ)。FireBase
コードが含まれているライブラリモジュールに依存しますが、独自の依存関係バージョンを優先して、FireBase
モジュールのバージョンを除外します。FireBase
バージョンに依存しています。classpath 'com.google.gms:google-services:3.1.1’
は、クライアントアプリのトップレベルbuild.gradle
にのみ含まれます。google-services.json
をクライアントアプリのプロジェクトに配置する必要があります。Firebase
Service
sを定義します(またはマニフェストマージを使用してライブラリプロジェクトからマージします)google_play_services_version
メタデータタグをクライアントアプリのマニフェストに追加します。compileOnly
依存関係を宣言するときにFireBase
を使用できます/使用する必要があります。これで、FireBase
を使用するライブラリで定義したFireBase
コードをアプリで使用できるようになります。または、ライブラリモジュールにFireBase
のすべての作業を任せることもできます。
もちろん、これは、Firebase
のようなフレームワークがライブラリモジュールに実装されるように設計されていないため、通常は内部ライブラリに使用されますが、場合によっては実装する必要があります。 。 Mavenを介して配布されるプロジェクトで使用できます。私のライブラリはこれを使用しており、問題が発生することはありません。
更新:
ライブラリモジュールのcompileOnly
依存関係を宣言するときは、Firebase
を使用する必要があります。そうすることで、依存関係はビルド出力に追加されません。ただし、ライブラリで依存関係を使用することは許可されます。使用するアプリがFirebaseを使用したい場合、手動で(implementation
を使用して)依存する必要があります。これは、アプリケーションでの不要な依存関係/膨張を削減し、このような依存関係を宣言するための「正しい」方法を支援します。 注:モジュールでコードを使用する前に、ランタイムチェックを実行してライブラリが使用可能であることを確認する必要がある場合があります。
1つのオプションは、ライブラリのユーザーにFirebaseプロジェクトを作成させ、結果のgoogle-services.jsonファイルをアプリケーションに渡して、ライブラリがそれに依存するようにすることです。
私はこれが受け入れられた回答の古い質問であることを知っていますが、すべての回答には大きな不満があります。ライブラリにユーザーを追加して、アプリケーションをライブラリに追加する必要があります。それを行う方法がありますライブラリのユーザーをまったく悩ませることなくライブラリが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を使用する場合、このメソッドは例外や予期しない動作を引き起こす可能性があることに注意してください自己責任で使用してください
私の知る限りではできません。
各Firebaseプロジェクトには、アプリを1つずつ一意に識別するためにパッケージIDが必要です。
また、各IDごとに特別に生成される独自のgoogle-services.json
を使用して、すべてのモジュールを構成する必要があります。
すべてのアプリに同じパッケージを使用できる場合は、デバイスまたはPlayストア自体が互いに区別できないため、オプションはありません。
すべてのFirebaseロジックをライブラリに抽出できますが、固有のパッケージIDを提供するためにすべてのアプリを構成する必要があり、すべてのIDにも通知を送信する必要があります。