C#学习教程:FCM-AndroidXamarinNotRegisterederrorwhensendingmessageafterre-debuggingapplication通知我正在使用FCM预发布包:https://www.nuget.org/packages/Xamarin.Firebase.Messaging/现在一切正常,如果我清理应用程序数据,将触发OnTokenRefresh事件并生成一个新令牌-当我在此令牌上发送新通知时,设备会在OnMessageReceived()中发送和接收通知-问题是当我更改代码并再次运行应用程序时,如果我使用旧令牌,则在发送通知时会收到NotRegistered错误,但是如果我去清理应用程序数据,则会触发OnTokenRefresh()以生成一个新令牌-并且新令牌有效。此处有类似问题,但这是针对GCM(我正在使用FCM):Google云消息“未注册”失败并取消订阅最佳实践?https://stackoverflow.com/a/36856867/1910735https://forums.xamarin.com/discussion/65205/google-cloud-messaging-issues#latest我的FCMInstanceIdService[Service,IntentFilter(new[]{"com.google.firebase.INSTANCE_ID_EVENT"})]publicclassFCMInstanceIdService:FirebaseInstanceIdService{privatestringTag="FCMInstanceIdService";publicoverridevoidOnTokenRefresh(){varfcmDeviceId=FirebaseInstanceId.Instance.Token;if(Settings.DeviceId=fcmId!varoldDeviceId=Settings.DeviceId;Settings.DeviceId=fcmDeviceId;//TODO:更新DB上的令牌-目前OnTokenRefresh仅在以下情况下调用:1.应用程序数据已清理,2.应用程序重新启动-installed//_usersProvider.UpdateUserDeviceId(oldDeviceId,fcmDeviceId);}base.OnTokenRefresh();}}我的消息接收服务:[Service,IntentFilter(new[]{"com.google.firebase.MESSAGING_EVENT"})]publicclassFCMListenerService:FirebaseMessagingService{privatestringTag="FCM_Listener_Service";publicoverridevoidOnMessageReceived(RemoteMessagemessage){base.OnMessageReceived(message);varnotification=message.GetNotification();vardata=message.Data;vartitle=notification.Title;正文=通知。正文;SendNotification(标题,正文);}privatevoidSendNotification(stringtitle,stringbody){//TODO:向用户显示通知}}性能:如何在DEBUG模式下强制刷新FCM令牌,这样我就不必在每次运行时都删除应用程序数据应用程序?由于此问题仅在调试应用程序时从VisualStudio运行应用程序时发生(不是在部署到PlayStore的版本中),我临时解决该问题的方法是创建以下服务:[Service]publicclassFCMRegistrationService:IntentService{privateconststringTag="FCMRegistrationService";静态对象储物柜=新对象();protectedoverridevoidOnHandleIntent(Intentintent){try{lock(locker){varinstanceId=FirebaseInstanceId.Instance;vartoken=instanceId.Token;如果(字符串.IsNullOrEmpty(令牌))返回;#ifDEBUGinstanceId.DeleteToken(token,"");插件tanceId.DeleteInstanceId();#endif}}catch(Exceptione){Log.Debug(Tag,e.Message);然后在我的启动活动(应用程序打开时加载的活动)中执行以下操作:#ifDEBUGif(!IsMyServiceRunning("FCMRegistrationService")){varintent=newIntent(this,typeof(FCMRegistrationService));启动服务(意图);}//仅适用于调试模式-将接受测试/开发服务器的HTTPS证书,因为HTTPS证书无效/不受信任ServicePointManager.ServerCertificateValidationCallback+=(o,certificate,chain,errors)=>true;#endif}这将取消注册您现有的FCMToken并刷新令牌,因此将调用OnTokenRefresh方法,然后您必须编写一些逻辑来更新服务器上的FCMToken[Service,IntentFilter(new[]{"com.google.firebase.INSTANCE_ID_EVENT"})]publicclassFCMInstanceIdService:FirebaseInstanceIdService{//privatestringLogTag="FCMInstanceIdService";publicoverridevoidOnTokenRefresh(){varfcmDeviceId=FirebaseInstanceId.Instance.Token;//设置(是共享首选项)-我将FCMTokenId保存在共享首选项中//如果FCMTokenId与旧令牌不同,则在服务器上更新varvalidationContainer=newValidationContainer();//在这里更新服务器上的令牌TBApp.Current._usersProvider.UpdateFcmTokenOnServer(oldFcmId,fcmDeviceId,validationContainer);Settings.FcmTokenId=fcmDeviceId;}base.OnTokenRefresh();我正在尝试像这种初始化varoptions=newFirebaseOptions.Builder().SetApplicationId("YOURAPPID").SetApiKey("YOURAPIKEY")//.SetDatabaseUrl(Keys.Firebase.Database_Url)//我不使用它.SetGcmSenderId("YOURSENDERID")//.SetStorageBucket(Keys.Firebase.StorageBucket)//我不使用它.Build();try{//尝试初始化firebase应用程序以获取令牌FirebaseApp.InitializeApp(Forms.Context,options);//初始化以获取令牌}catch{//如果应用程序已经初始化,它将抛出异常,因此获取先前的活动令牌并发送到您的服务器数据库等varinstanceId=FirebaseInstanceId.Instance;vartoken=instanceId.Token;服务.MyFirebaseMessagingService.RegisterForAndroid(令牌);//此方法将令牌发送到我的服务器应用程序,您必须自己编写}因此,当用户打开该应用程序时,我将尝试重新初始化Firebase应用程序,如果它已经被初始化,则会抛出异常:)我在那里得到了令牌,所以它给了我有效的注册令牌。如果应用程序未初始化,一切都会正常工作,因此您的OnTokenRefresh方法将按预期触发。希望这对你有帮助。以上就是《FCM-AndroidXamarinNotRegisterederrorwhensendingamessageafterre-debuggingapplication》C#学习教程的全部内容。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
