iOS环境下Shiny NotificationDelegate OnReceived未触发相关问题咨询
问题根因说明
这两个问题属于同一类冲突:Shiny的UseNotifications扩展方法在iOS端执行时,会自动注册自身的通知生命周期拦截器,接管系统所有本地/远程通知的回调入口,因此:
- 你自定义的
INotificationDelegate如果没有正确注册或者生命周期和Shiny容器不匹配,就会出现OnReceived方法不触发的问题 - 你在AppDelegate中重写的
ReceivedRemoteNotification方法会被Shiny的拦截器优先消费,不会透传到你重写的实现中
排查&解决步骤
1. 先修复INotificationDelegate不触发的问题
- 确认你的委托实现类已经注册到Shiny的服务容器中,不要用原生的DI容器注册,必须在
ShinyStartup.ConfigureServices中通过services.AddSingleton<INotificationDelegate, 你的实现类>()的方式注册,要放在UseNotifications调用之前 - 检查iOS项目的Info.plist中是否已经正确添加通知权限声明:
NSLocalNotificationUsageDescription、NSRemoteNotificationUsageDescription,缺少权限声明会导致通知回调链提前中断
2. 解决自定义远程通知回调无法触发的问题
两种方案可以二选一,按需选择:
方案1:使用Shiny提供的远程通知回调入口,不需要保留自己的AppDelegate重写逻辑
Shiny接管回调后,所有远程通知的接收事件都会透传到你实现的INotificationDelegate的OnReceived方法中,你可以在该方法中区分通知来源(本地/远程),分别处理埋点统计和自有推送的业务逻辑,不需要再单独在AppDelegate中重写ReceivedRemoteNotification。
方案2:配置Shiny不劫持远程通知回调,保留自己的AppDelegate实现
在调用UseNotifications的时候传入配置参数,关闭远程通知的接管逻辑:
services.UseNotifications(new Shiny.Notifications.NotificationOptions { iOSDisableAutoRemoteNotificationRegistration = true });
配置完成后,Shiny只会处理本地通知的相关逻辑,不会拦截远程通知的回调,你在AppDelegate中重写的ReceivedRemoteNotification方法就可以正常触发。
3. 验证步骤
- 先触发本地通知,确认
INotificationDelegate.OnReceived可以正常触发,埋点统计逻辑正常执行 - 再触发测试远程推送,确认自有推送的处理逻辑可以正常执行
- 最后验证本地通知的展示、点击跳转能力没有被影响
内容的提问来源于stack exchange,提问作者Pat Long - Munkii Yebee
相关产品推荐
相关产品推荐

