You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:18:02