FCM - 发送到主题和“未注册”错误
Posted
技术标签:
【中文标题】FCM - 发送到主题和“未注册”错误【英文标题】:FCM - Send to topics and "Not Registered" error 【发布时间】:2017-06-27 18:41:59 【问题描述】:我开发了一个 android 应用,它订阅了一个主题(subscribeToTopic()
in OnCreate
of main activity),然后接收我的服务器发送到该主题的通知。
问题在于,不时有人抱怨通知停止到达。在这种情况下,我通常会要求用户使用包含在我的应用程序中的函数,该函数读取 Firebase 注册令牌并通过电子邮件将其发送给我(我通常不使用或存储它)。
然后,我尝试向该令牌发送通知,FCM 服务器以Not Registered
错误回答!怎么会是Not Registered
?使用主题订阅时,Firebase 不应该管理整个“token 流程”并照顾它的更新吗?
有没有办法通知应用程序它不再注册并采取适当的措施?谢谢。
【问题讨论】:
交叉发帖时请注明:groups.google.com/forum/#!topic/firebase-talk/nnDDJItxtHQ 您提到您的应用“读取 Firebase 注册令牌”。你从哪里读取令牌?您是从应用程序中存储它的某个位置读取它,还是在调用 getToken()?您是否知道用户是否卸载并重新安装了应用程序,或者他们是否更新了应用程序,因为这些操作会使现有令牌无效。 您是否注意到这是否发生在某些特定设备上?另外,用户过去是否在您的应用设置中使用过“强制停止”按钮? 不应该在客户端处理吗?通过在onTokenRefresh()
中添加另一个subscribeToTopic()
?
累积答案:-我的应用程序从getToken()
中的onTokenRefresh()
中读取令牌并将其存储在首选项中; - 不知道用户是否卸载/重新安装/更新应用程序,但由于在OnCreate
中调用了subscribeToTopic()
,因此在大多数情况下应该不相关; - 我没有关于设备型号或安卓版本的统计信息,但我要创建一个; - onTokenRefresh()
中的 subscribeToTopic()
听起来不错:我要试试;也许需要几天时间才能了解它是否有效
【参考方案1】:
这不完全适合您的情况,但看看它是否有帮助! 我面临着同样的问题。这是我修复它的方法(ios 特定,android 开箱即用)-
-
从您的手机中卸载应用程序
清除存储在数据库中此特定帐户的所有令牌(或者您已在后端设置它。在我的情况下,令牌与帐户相关联)
在componentDidmount-
异步组件DidMount() this.checkPermission(); this.createNotificationListeners();
4.
async checkPermission()
const enabled = await firebase.messaging().hasPermission();
if (enabled)
this.getToken();
else
this.requestPermission();
async requestPermission()
try
await firebase.messaging().requestPermission();
// User has authorised
this.getToken();
catch (error)
// User has rejected permissions
console.log('permission rejected');
async getToken()
try
const enabled = await firebase.messaging().hasPermission();
if (!enabled)
await firebase.messaging().requestPermission();
const fcmToken = await firebase.messaging().getToken();
if (fcmToken)
console.log("got token");
console.log('fcm token:', fcmToken); //-->use this token from the console to send a post request via postman
this.setState( fcmToken );
return fcmToken;
catch (error)
console.warn('notification token error', error);
5.
async createNotificationListeners()
/*
* Triggered when a particular notification has been received in foreground
* */
this.notificationListener = firebase.notifications().onNotification((notification) =>
const title, body = notification;
this.showAlert(title, body);
);
/*
* If your app is in background, you can listen for when a notification is clicked / tapped / opened as follows:
* */
this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen) =>
const title, body = notificationOpen.notification;
this.showAlert(title, body);
);
/*
* If your app is closed, you can check if it was opened by a notification being clicked / tapped / opened as follows:
* */
const notificationOpen = await firebase.notifications().getInitialNotification();
if (notificationOpen)
const title, body = notificationOpen.notification;
this.showAlert(title, body);
/*
* Triggered for data only payload in foreground
* */
this.messageListener = firebase.messaging().onMessage((message) =>
//process data message
console.log(JSON.stringify(message));
);
-
最后,使用您在控制台中看到的令牌作为您发布请求中“to”键的值。您应该不会再看到“notRegistered”错误,并且应该会收到推送通知。
完成!
引用-https://medium.com/@anum.amin/react-native-integrating-push-notifications-using-fcm-349fff071591
【讨论】:
谢谢,但我的问题是关于 Android 的。我对iOS没有任何经验。无论如何,您的建议很难与一些我个人不认识的用户付诸实践,并且可能离我很远;-)以上是关于FCM - 发送到主题和“未注册”错误的主要内容,如果未能解决你的问题,请参考以下文章
FCM android onmessagereceived not called