我面临着一个与此极其相似的问题。
- 我正在使用Expo(SDK38(和托管工作流
- 我正在CI上使用Turtle CLI创建独立的APK构建
- 我有一个FCM项目,几乎可以完美地与独立应用程序配合使用。我的意思是:
- 我已成功获得设备FCM令牌,其代码如下:
import { Notifications } from 'expo'; await Notifications.getDevicePushTokenAsync(); // Gives the token successfully
- 我在运行以下NodeJS脚本时发送了推送通知,但是:
const admin = require('firebase-admin'); admin.initializeApp({ credential: require('./my-credentials.json'), databaseURL: 'https://MY_URL_HERE' }); admin.messaging.send({ notification: { title: 'Foo', body: 'Bar' }, android: { ttl: 86400 }, token: 'THE_FCM_TOKEN_HERE' });
- [次要问题1]如果应用程序在前台,设备不会显示任何通知
- [次要问题2]如果应用程序不在前台,设备会显示重复的通知
- 我已成功获得设备FCM令牌,其代码如下:
为了完整性,我已经提到了上面的小问题,但我现在面临的主要问题是我的应用程序不会注意到通知到达。听众不会开火。
我尝试了传统通知模块和新通知模块:
// Attempt using Legacy Notifications
// https://docs.expo.io/versions/v38.0.0/sdk/legacy-notifications/
import { Notifications as LegacyNotificationsModule } from 'expo';
// Attempt using New Notifications Module
// https://docs.expo.io/versions/v38.0.0/sdk/notifications/
import * as NewNotificationsModule from 'expo-notifications';
LegacyNotificationsModule.addListener(() => {
// Make any UI change just for we to see it happening
});
NewNotificationsModule.addNotificationReceivedListener(() => {
// Make any UI change just for we to see it happening
});
// I also tried commenting and uncommenting the code below
NewNotificationsModule.setNotificationHandler({
handleNotification: async () => ({
shouldShowAlert: true,
shouldPlaySound: false,
shouldSetBadge: false,
}),
});
回想一下,就像我在上面链接的类似问题中一样,我不是使用Expo通知令牌(形式为ExponentPushToken[xxxxxx]
(。我使用的是通过Notifications.getDevicePushTokenAsync()
获得的标准FCM代币。
我怎样才能做到这一点?
我终于想通了。
我已经向世博会发送了一份PR,以改进这方面的文件。
简而言之,引用我对GitHub:的评论
为了让应用程序对通知做出正确反应,它必须附带一个名为
experienceId
的特殊字段。我找不到通过Firebase控制台接口发送测试消息的方法;相反,我用执行HTTP POST
调用
- 标题:
- 授权:
key=${FIREBASE_SERVER_KEY_TOKEN}
(在我的Firebase项目Settings > Cloud Messaging
中获得(- 内容类型:
application/json
- 正文:
{ "to": "<DEVICE_PUSH_NOTIFICATION_TOKEN>", "priority": "normal", "data": { "experienceId": "@anonymous/my-project-slug", "title": "Hello", "message": "World" } }
一个没有记录的关键信息是,对于像我这样没有expo帐户(并且正在独立于expo构建一切(的人来说,体验ID应该以@anonymous
开头。@awinograd在GitHub中完全理解了这一点。