使用 Maven Android 项目配置 Firebase 推送消息
Configure Firebase push messages with Maven Android project
有没有办法在不使用 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>
此外,添加了字符串资源(由 gradle 插件从配置 json 文件自动设置)
<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....
感谢任何帮助...
谢谢
您的自定义实现几乎是正确的。
你错过了这个:
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
但是..我必须警告您,手动修改 AndroidManifest 的方法非常不鼓励。由于清单由 Gradle 自动配置,我们将其视为 内部实现细节 并且不受官方支持 API.
长话短说:清单配置可能会在任何版本中更改,如果您不相应地更新您的清单,您的应用程序就会崩溃。
问题已解决,谢谢 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>
有没有办法在不使用 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>
此外,添加了字符串资源(由 gradle 插件从配置 json 文件自动设置)
<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....
感谢任何帮助... 谢谢
您的自定义实现几乎是正确的。 你错过了这个:
<receiver
android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver"
android:exported="false" />
但是..我必须警告您,手动修改 AndroidManifest 的方法非常不鼓励。由于清单由 Gradle 自动配置,我们将其视为 内部实现细节 并且不受官方支持 API.
长话短说:清单配置可能会在任何版本中更改,如果您不相应地更新您的清单,您的应用程序就会崩溃。
问题已解决,谢谢 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>