在库中实现Firebase

时间:2016-07-26 17:12:54

标签: android firebase google-cloud-messaging firebase-cloud-messaging

我想在我想在许多应用中用作SDK的库中实现Friebase通知系统。

Firebase现在要求提供应用程序ID,但是我在库中实现了它,因此没有应用程序ID。

如何才能实现我的目标,即能够向使用我的图书馆的应用发送通知?

提前致谢。

6 个答案:

答案 0 :(得分:9)

是的,您实际上可以在您的库build.gradle上执行此操作,将其放在defaultConfig字段中

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

然后在你的项目gradle.properties

firebaseAppKey = <yourFirebaseAppSecret>;

对于每个项目/应用,您必须在gradle.properties上定义此变量。

您必须为每个项目创建一个firebase应用,但您的库现在可以拥有Firebase SDK。

如果要访问此环境变量值,请使用BuildConfig.FIREBASE_APP_KEY (例如实例化firebase)。

答案 1 :(得分:6)

这些都是一些hacky或太多的工作,这是一个很好的简单例子(虽然具有讽刺意味,因为它是一个很长的帖子 - 但值得)。

可以在库项目中使用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.

这就是您在图书馆项目中所需要做的一切。 不要在此处应用gms插件,将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放入客户端应用的项目中。
  • 在应用清单中定义必要的Firebase Service(或使用清单合并并将其合并到您的图书馆项目中)
  • google_play_services_version元数据标记添加到客户端应用的清单。
  • 在声明compileOnly依赖项时,库可以/应该使用FireBase

现在,您可以在使用FireBase的库中定义的应用中使用FireBase代码。或者你可以让你的图书馆模块完成所有FireBase工作!

当然这通常用于内部库,因为像Firebase这样的框架并不是设计为在库模块中实现,但有时你需要,所以这是一个简单的非hacky / sane解决方案问题。它可以用于通过maven分发的项目 - 我的库使用它,它从来没有引起任何问题。

更新:

在声明库模块的compileOnly依赖项时,应使用Firebase。通过这样做,依赖项将不会添加到构建输出中。但是您将被允许在库中使用依赖项。如果消费应用程序想要使用firebase,他们需要手动依赖它(使用implementation)。这将有助于减少应用程序中不需要的依赖关系/膨胀,并以“正确”的方式声明这样的依赖关系。 注意:您可能需要执行运行时检查以确保库在模块中使用它之前可用。

答案 2 :(得分:5)

一种选择是让您图书馆的用户创建一个Firebase项目,然后将生成的google-services.json文件传入他们的应用程序,然后您的库可以依赖于此。

答案 3 :(得分:5)

我知道这是一个老问题并且已经接受了答案,但所有答案都有很大的不足之处 - 除了将库添加到应用程序之外,它们还要求您的库的用户继续工作。如果从Maven存储库下载您的库,有一种方法可以完全没有麻烦您的库的用户

注意:此方法是一种黑客攻击,Firebase不支持。当被问及Firebase支持时,我收到了以下回复:

  

Firebase SDK不适用于库项目。 Firebase上提供的功能是集成在应用程序级别而不是   在每个模块或每个库的基础上,所以,具有此的用例   无法或不支持集成在库项目中。

尽管如此,我已经找到了一种方法可以做到这一点,并且有人会觉得它很有用,所以这里是:

这是使用实时数据库的示例,但它应适用于所有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实时数据库,然后构建它并将其发布到Maven(发布到Maven是必不可少的,否则您的库的用户必须手动添加依赖项)。从应用程序内部激活时,将使用您的数据库。

请注意,如果您的图书馆用户使用Google Play服务或Firebase,此方法可能会导致异常和意外行为,因此使用时风险自负!

答案 4 :(得分:0)

据我所知,你不能。

每个Firebase项目都需要包ID,以便唯一标识其每个应用。

您还需要为每个模块配置自己的google-services.json,这是专门为每个ID生成的。

如果您可以为所有应用使用相同的套餐,则设备或Play商店无法区分彼此,因此无法选择。

您可以将所有Firebase逻辑解压缩到您的库中,但仍然需要配置每个应用以提供唯一的包ID,并且您还需要向每个ID发送通知。

答案 5 :(得分:0)

Firebase Multiple Project

请参阅具有所有信息的链接