Xamarin.Forms接入Azure通知中心后推送通知送达不稳定如何解决
问题成因
安卓端送达异常
- 国产安卓系统推送限制:MIUI、ColorOS等定制系统对非白名单应用的推送做了进程保活、分发优先级限制,会出现延迟分发、直接拦截的情况
- FCM消息优先级配置错误:未设置高优先级的推送会被FCM归类为低优先级通知,仅在设备空闲时分发,最长延迟可达数小时
- 设备注册信息失效:设备端绑定Azure通知中心的token过期、标签绑定失败,会导致推送完全无法送达
iOS端单设备无法接收
- 标签/Token绑定异常:iPhone 8注册推送时未正确绑定你发送时所用的标签,或是APNs返回的device token更新后未同步到Azure通知中心
- 环境权限不匹配:若Azure通知中心配置的是APNs开发证书,而iPhone 8安装的是生产环境的应用包,推送会被APNs直接拒收,iPhone SE可能刚好是开发环境包因此可以正常接收
- 系统隐式拦截:即使通知设置界面显示配置一致,也可能存在iPhone 8开启了针对该应用的专注模式拦截、或是系统误判应用为风险应用限制了通知权限
修复方案
代码逻辑优化
你当前的发送逻辑存在明显冗余,循环给单个标签发通知会触发Azure通知中心限流,直接替换为多标签批量发送逻辑,同时添加发送结果校验:
NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(NotificationDispatcherConstants.FullAccessConnectionString, NotificationDispatcherConstants.NotificationHubName); Dictionary<string, string> templateParameters = new Dictionary<string, string> { ["messageParam"] = json }; try { // 直接传入标签数组批量发送,无需循环调用 var sendResult = await hub.SendTemplateNotificationAsync(templateParameters, NotificationDispatcherConstants.SubscriptionTags.ToArray()); // 记录发送结果排查错误 if (sendResult.State == NotificationOutcomeState.Failed) { foreach (var errorDetail in sendResult.Results) { Console.WriteLine($"设备{errorDetail.DeviceId}推送失败,原因:{errorDetail.Error}"); } } } catch (Exception ex) { Console.WriteLine($"推送请求异常:{ex.Message}"); }
安卓端专项修复
- 在安卓的推送模板中添加
"priority":"high"配置,要求FCM按高优先级分发推送,避免空闲延迟 - 针对国内安卓用户,配置小米、华为、OPPO等厂商的独立推送通道到Azure通知中心,规避FCM在国内网络的可用性问题以及系统拦截问题
- 每次应用冷启动时,重新向Azure通知中心注册设备token和绑定的标签,避免注册信息过期失效
iOS端专项修复
- 在Azure通知中心的设备管理列表中,确认iPhone 8对应的device token是否存在、是否绑定了发送所用的标签,若不存在重新触发客户端的推送注册逻辑
- 统一应用的打包环境和通知中心的APNs配置:测试环境统一使用开发证书和开发环境包,生产环境统一使用生产证书和生产环境包,避免环境不匹配导致推送被拒收
- 重置iPhone 8的通知配置:关闭专注模式,删除应用重新安装后再次授予通知权限,排除系统隐式拦截的问题
内容的提问来源于stack exchange,提问作者David Shochet
相关产品推荐
相关产品推荐

