FCM - 重新调试应用程序后发送消息时出现 Android Xamarin NotRegistered 错误

2023-12-01

我正在 Xamarin Android 中开发一个应用程序,对于通知,我使用 FCM 预发布包:https://www.nuget.org/packages/Xamarin.Firebase.Messaging/

现在,如果我清理应用程序数据,一切都会正常工作,OnTokenRefresh事件被触发并生成一个新令牌 - 当我在此令牌上发送新通知时,设备将发送和接收通知OnMessageReceived() -

问题是当我更改代码并再次运行应用程序时,如果我使用旧令牌,我会得到NotRegistered发送通知时出错,但如果我去清理应用程序数据,则会触发 OnTokenRefresh() 并生成新令牌 - 新令牌有效。

这里有类似的问题,但这是 GCM(我正在使用 FCM):

Google 云消息“未注册”失败和取消订阅最佳实践?

https://stackoverflow.com/a/36856867/1910735

https://forums.xamarin.com/discussion/65205/google-cloud-messaging-issues#latest

My FCMInstanceIdService

[Service, IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class FCMInstanceIdService : FirebaseInstanceIdService
{
    private string Tag = "FCMInstanceIdService";

    public override void OnTokenRefresh()
    {
        var fcmDeviceId = FirebaseInstanceId.Instance.Token;

        if (Settings.DeviceId != fcmDeviceId)
        {
            var oldDeviceId = Settings.DeviceId;

            Settings.DeviceId = fcmDeviceId;

            //TODO: update token on DB - Currently OnTokenRefresh is only called when: 1. App data is cleaned, 2. The app is re-installed
            //_usersProvider.UpdateUserDeviceId(oldDeviceId, fcmDeviceId);
        }

        base.OnTokenRefresh();
    }
}

我的消息接收服务:

[Service, IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
public class FCMListenerService : FirebaseMessagingService
{
    private string Tag = "FCM_Listener_Service";

    public override void OnMessageReceived(RemoteMessage message)
    {
        base.OnMessageReceived(message);

        var notification = message.GetNotification();
        var data = message.Data;
        var title = notification.Title;
        var body = notification.Body;

        SendNotification(title, body);
    }

    private void SendNotification(string title, string body)
    {
        //TODO: Display notification to user
    }
}

显现:

<application android:label="TBApp" android:theme="@style/TBAppTheme">

<receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
<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="${applicationId}" />
  </intent-filter>
</receiver>
</application>

如何在调试模式下强制刷新 FCM 令牌,以便不必在每次运行应用程序时删除应用程序数据?


由于此问题仅在调试应用程序时从 Visual Studio 运行应用程序时发生(不在部署到 PlayStore 的版本中),因此我暂时解决该问题的方法是创建以下服务:

    [Service]
    public class FCMRegistrationService : IntentService
    {
        private const string Tag = "FCMRegistrationService";
        static object locker = new object();

        protected override void OnHandleIntent(Intent intent)
        {
            try
            {
                lock (locker)
                {
                    var instanceId = FirebaseInstanceId.Instance;
                    var token = instanceId.Token;

                    if (string.IsNullOrEmpty(token))
                        return;

#if DEBUG
                    instanceId.DeleteToken(token, "");
                    instanceId.DeleteInstanceId();

#endif


                }
            }
            catch (Exception e)
            {
                Log.Debug(Tag, e.Message);
            }
        }
    }

然后在我的启动活动(每当打开应用程序时加载的活动)执行以下操作:

protected override void OnCreate(Bundle savedInstanceState)
{
            base.OnCreate(savedInstanceState);


#if DEBUG
            if (!IsMyServiceRunning("FCMRegistrationService"))
            {
                var intent = new Intent(this, typeof(FCMRegistrationService));
                StartService(intent);
            }

            // For debug mode only - will accept the HTTPS certificate of Test/Dev server, as the HTTPS certificate is invalid /not trusted
            ServicePointManager.ServerCertificateValidationCallback += (o, certificate, chain, errors) => true;
#endif

}

这将注销您现有的 FCMToken 并刷新令牌,因此OnTokenRefresh方法将被调用,然后您将必须编写一些逻辑来更新服务器上的 FCMToken。

[Service, IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
public class FCMInstanceIdService : FirebaseInstanceIdService
{
   // private string LogTag = "FCMInstanceIdService";

    public override void OnTokenRefresh()
    {
        var fcmDeviceId = FirebaseInstanceId.Instance.Token;

        // Settings (is Shared Preferences) - I save the FCMToken Id in shared preferences 
       // if FCMTokenId is not the same as old Token then update on the server

        if (Settings.FcmTokenId != fcmDeviceId)
        {
            var oldFcmId = Settings.FcmTokenId;

            var validationContainer = new ValidationContainer();

            // HERE UPDATE THE TOKEN ON THE SERVER
            TBApp.Current._usersProvider.UpdateFcmTokenOnServer(oldFcmId, fcmDeviceId, validationContainer);

            Settings.FcmTokenId = fcmDeviceId;

        }

        base.OnTokenRefresh();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FCM - 重新调试应用程序后发送消息时出现 Android Xamarin NotRegistered 错误 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 使用默认行为将模型绑定到接口

    我正在尝试将控制器操作绑定到接口 但仍保持默认的绑定行为 public class CoolClass ISomeInterface public DoSomething get set ISomeInterface public clas
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com

随机推荐

  • elisp如何检查Shift键是否被按下

    我需要检查是否按下了 Shift 键 更确切地说 我想根据是否按下 Shift 键来设置直接开关 defadvice find file noselect around find file noselect set switches act
  • 如何在 C# 中跳过第一行并从第二行开始读取文件

    如何从第二行开始读取文件跳过第一行 这似乎可行 但这是最好的方法吗 using StreamReader sr new StreamReader varFile Encoding GetEncoding 1250 string string
  • System.Data.SqlClient.SqlException:用户 XXX 登录失败

    我正在 IIS 7 5 上部署一个 Web 应用程序 该 Web 应用程序有三种自行车供用户选择 山地自行车 公路自行车和旅行自行车 当我点击每个它时 我遇到了问题 System Data SqlClient SqlException 用户
  • 如何禁用 jQuery.Mobile.MVC?

    我为我的网站构建了移动视图 并且仍在创建它们的过程中 我想测试它在实时设备上的外观 所以我想禁用 mobile 文件 下面我厌倦了运行一些脚本来禁用但没有运气 也许这对开发人员来说是一个问题 但如果有人能给我指出正确的方向 你需要禁用自动初
  • JAXB 中的解组如何工作?

    我在 jaxb 中有一个元素的 getter setter 对 XmlElementWrapper name requires required true XmlElement name equals required true List
  • AS3 参数

    为什么您认为下面的代码不起作用 您将更改 添加什么以使其正常工作 任何帮助表示赞赏 function TraceIt message String num int trace message num function aa f Functi
  • 如何允许通过 http 匿名推送到 git 存储库?

    我在这里找不到例子 http www kernel org pub software scm git docs git http backend html 是否可以 将其添加到您的 httpd conf 假设 srv git 包含您的存储库
  • 我可以使用 SQLite 作为基于云的网站的数据库存储吗?

    有没有人启动过使用本地 SQLite DB 作为主要数据源的基于云的应用程序 网站 有这方面的警告吗 我的环境 C 3 0 应用程序 目前使用sql server 2008 db 当前数据库大小 30 mb 如果您预计会有大量流量 那么您确
  • Excel 根据名称查找工作表

    这不是一个问题 而是一个解决方案 但我想在这里分享它 因为我在这里得到了我需要的帮助 我想在活动工作簿中查找特定的 Excel 工作表 并按工作表名称进行搜索 我构建这个是为了找到它 这是一个 包含 搜索 如果找到 会自动转到工作表 或者询
  • web2py 中的复合键

    我在 web2py 中定义了一个表 db define table pairing Field user writable True readable True Field uid writable True readable True 该
  • Chart Js V2 在垂直条上绘制水平条(平均)

    我想在垂直条上绘制一个条 绿色条 我正在使用 Chart JS V2 和 Angular 4 我找到了一些画线的代码 但它在 Angular 4 中不起作用 我用过也尝试过使用annotation但它不起作用 添加注释的命令 npm 安装
  • 如何在 Windows XP 上使用 Perl 运行可执行文件?

    如何使用perl运行可执行文件 例如 我想运行一个普通的 notepad exe 我怎样才能做到这一点 这就是我所拥有的 my args system notepad exe system args 0 or die system args
  • 如何实现像uber android一样的可拖动地图,随位置变化而更新

    如何实现像uber一样的可拖动地图 我正在使用谷歌地图 v2 实际上我得到了解决方案这个帖子并在这里分享我的完整解决方案 使用最新代码进行更新还包括使用自动完成功能更改位置 完整的项目可以找到here 逻辑很简单我们需要一个framelay
  • 从文件将用户导入 ASP.NET 成员身份

    我有一个使用 ASP NET 会员资格的网站 我还有一个 Excel 文件 其中包含大约 60 条用户记录 如何将记录导入到成员资格数据库中 而无需在 ASP NET 网站管理工具中键入全部 60 条记录 谢谢 foreach record
  • 使用 App Inventor 2 过滤 url JSON 结果

    我正在尝试使用 App Inventor 2 过滤 JSON url 结果 遵循以下示例代码here1 and here2 但我仍然无法正确完成它 我一次只能得到一个结果 JSON结果为如下图所示形式的数据 field1 alphaNume
  • Z-index 没有覆盖 DOM 中更下方的 div

    我正在尝试创建一个类似工具提示的系统 其中 mouseenter 事件会导致显示一个 div 该 div 将覆盖内容 不幸的是我遇到的问题是内容laterDOM 中的内容在 IE7 中并没有消失 而之前的内容在 z 索引元素后面正确消失 这
  • 查找具有特定字符串的 svn:external 属性的路径?

    我有一个非常大的 Subversion 存储库 大小约为 7 GB 包含来自不同项目的许多文件和目录 现在我对一个项目结构做了一些重大更改 它实际上是一个库 并且我在同一存储库中的很多其他项目中使用它 现在文档很少 我不知道哪个项目实际上真
  • 如何在 REST Assured 中传递默认解析器?

    我正在尝试使用 REST Assured 自动化 API 以下是我在执行 API 测试用例期间遇到的错误 testNotifications com api truValue test notifications Notifications
  • opencv如何在光流后跟踪物体?

    对视频进行光流 lk 后 根据此数据查找对象并跟踪它们的最佳方法是什么 这可能听起来很菜鸟 但我希望能够在物体周围定义清晰的轮廓 所以如果它是一个形状奇怪的瓶子或其他东西 就能够检测边缘 我不确定 LK 是最好的算法 因为它计算一组稀疏的角
  • FCM - 重新调试应用程序后发送消息时出现 Android Xamarin NotRegistered 错误

    我正在 Xamarin Android 中开发一个应用程序 对于通知 我使用 FCM 预发布包 https www nuget org packages Xamarin Firebase Messaging 现在 如果我清理应用程序数据 一