【问题标题】:Configure Firebase push messages with Maven Android project使用 Maven Android 项目配置 Firebase 推送消息
【发布时间】:2016-07-20 07:58:44
【问题描述】:

有没有办法在不使用 Gradle 的情况下使用 Maven 正确配置 Firebase 消息传递?

我已将此依赖项添加到 pom.xml

<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-messaging</artifactId>
    <version>9.0.2</version>
    <type>aar</type>
</dependency>

并通过从位于 firebase AAR 中的 AndroidManifest.xml 文件中复制配置来修改我的 AndroidManifest.xml。我没有找到在 maven buld 期间使用过滤资源或替换插件(如 gradle 插件)过滤它们的方法。

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="<MY_APP_PACKAGE>.permission.C2D_MESSAGE"  android:protectionLevel="signature" />
<uses-permission android:name="<MY_APP_PACKAGE>.permission.C2D_MESSAGE" />

<!-- copied from firebase common module to be able to set <MY_APP_PACKAGE>
     (that is set during compilation with gradle plugin)  --> 
<provider
        android:authorities="<MY_APP_PACKAGE>.firebaseinitprovider"
        android:name="com.google.firebase.provider.FirebaseInitProvider"
        android:exported="false"
        android:initOrder="99" />
<!-- copied from firebase iid module to be able to set <MY_APP_PACKAGE>
     (that is set during compilation with gradle plugin)  --> 
<receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="<MY_APP_PACKAGE>" />
    </intent-filter>
</receiver>
<service android:name=".service.PushMessageService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".service.GoogleIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

另外,添加了字符串资源(由配置 json 文件中的 gradle 插件自动设置)

<string name="google_app_id" translatable="false">...</string>
<string name="google_api_key" translatable="false">...</string>
<string name="firebase_database_url" translatable="false">...</string>
<string name="ga_trackingId" translatable="false">...</string>
<string name="gcm_defaultSenderId" translatable="false">...</string>
<string name="google_storage_bucket" translatable="false">...</string>

运行应用程序后,我有这些日志

D/FirebaseApp﹕ com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
D/FirebaseApp﹕ Initialized class com.google.firebase.iid.FirebaseInstanceId.
D/FirebaseApp﹕ com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
D/FirebaseApp﹕ com.google.android.gms.measurement.AppMeasurement is not linked. Skipping initialization.
I/FirebaseInitProvider﹕ FirebaseApp initialization successful

文档说 Firebase 会自动请求新令牌,但我从未收到 onTokenRefresh 回调 有什么我错过的吗?

P.S: 请不要建议使用 Gradle....

感谢任何帮助... 谢谢

【问题讨论】:

  • 您必须使用 firebase 登录
  • 看起来 FirebaseApp 正在初始化,但没有引入它的一些(通常是传递的)依赖项。这不一定是个问题。对于onTokenRefresh() 部分:并不是说这个方法只会在 令牌被刷新时被调用。如果您在生成令牌之后添加代码,则不会调用它。要测试是否是这种情况,请在某处记录 `FirebaseInstanceId.getInstance().getToken()` 的值,以查看您的设备/应用程序是否有令牌。

标签: android maven firebase firebase-cloud-messaging


【解决方案1】:

您的自定义实现几乎是正确的。 你错过了这个:

<receiver       
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />

但是.. 我必须警告您,手动修改 AndroidManifest 的方法强烈建议。由于清单是由 Gradle 自动配置的,我们将其视为内部实现细节,而不是官方支持的 API。

长话短说:清单配置可能会在任何版本中发生变化,如果您不相应地更新清单,您的应用就会中断。

【讨论】:

  • 感谢您的帮助。有效!但是我不用Gradle,这只是Maven实现
【解决方案2】:

问题已解决,谢谢 Diego

我只是想为执行相同问题的人添加一些额外的配置到 AndroidManifest.xml

(全部复制自firebase AndroidManifest.xml

<!-- Internal (not exported) receiver used by the app to start its own exported services
     without risk of being spoofed. -->
<receiver
        android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
        android:exported="false" />

<!-- FirebaseInstanceIdService performs security checks at runtime,
     no need for explicit permissions despite exported="true" -->
<service
        android:name="com.google.firebase.iid.FirebaseInstanceIdService"
        android:exported="true">
    <intent-filter android:priority="-500">
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

<!-- FirebaseMessagingService performs security checks at runtime,
     no need for explicit permissions despite exported="true" -->
<service
        android:name="com.google.firebase.messaging.FirebaseMessagingService"
        android:exported="true">
    <intent-filter android:priority="-500">
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 2020-06-05
    • 2020-06-30
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多