如何在本地通知(local notification)中实现deep link跳转应用指定页面
本地通知触发DeepLink跳转全状态兼容实现方案
核心思路
所有场景下的通知点击都会把携带的deeplink参数抛给统一的路由处理层,路由层判断应用当前状态后执行对应的跳转逻辑,不需要感知通知来源,实现逻辑收敛避免重复开发。
第一步:通用基础配置
- 先在应用内注册deeplink的scheme和host规则,例如可定义为
myapp://page/{pageName}?params={xxx},提前映射好所有内页和路径的对应关系,比如myapp://page/order_detail对应订单详情页,自定义参数通过query字段携带 - 创建本地通知时,必须在通知的附加payload中固定带上你定义好的deeplink字段,不要用松散的独立参数传递跳转目标
第二步:各端通知点击事件拦截与参数传递
iOS端实现
在AppDelegate或SceneDelegate中适配所有状态的回调:
- 应用未运行(冷启动):点击通知会触发
didFinishLaunchingWithOptions方法,可从launchOptions的UIApplicationLaunchOptionsLocalNotificationKey中拿到通知对象,取出其中的deeplink参数,等应用根控制器初始化完成、首页渲染完毕后,再把deeplink丢给路由层处理,不要在启动流程未走完时执行跳转,避免出现找不到导航栈的问题 - 应用前台活跃/Inactive状态:点击通知会触发
UNUserNotificationCenterDelegate的didReceive response: UNNotificationResponse回调,直接从response.notification.request.content.userInfo中拿到deeplink,传给路由层跳转即可,此时路由层可以直接读取当前导航栈,按需执行push、替换页面等操作 - 应用suspended挂起状态:点击通知会先把应用唤醒到前台,紧接着触发上述
didReceive response回调,逻辑和活跃状态完全一致,不需要额外适配 - 若你的应用使用了
SceneDelegate,还要额外实现scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)方法,从connectionOptions.notificationResponses中拿到通知的deeplink,处理冷启动场景的跳转
Android端实现
- 创建通知时,
PendingIntent的intent要直接携带deeplink数据,同时设置intent的flag为FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP,避免重复启动首页 - 所有通知点击的intent都统一指向应用的中转Activity(一般为启动页/主Activity):
- 应用未运行(冷启动):点击通知会启动主Activity,在
onCreate方法中可从intent.data里拿到deeplink,等首页初始化完成后传给路由层执行跳转 - 应用前台活跃/Inactive状态:点击通知会触发主Activity的
onNewIntent回调,从intent.data中拿到deeplink直接传给路由层跳转即可 - 应用suspended挂起状态:点击通知会把应用唤起到前台,触发主Activity的
onNewIntent或onRestart回调,同样从intent中读取deeplink处理即可
第三步:路由层兼容处理
- 路由层收到deeplink后,首先判断当前应用的导航栈是否存在:如果不存在(冷启动场景还未初始化完成),就先把deeplink存在内存或本地缓存中,等导航栈初始化完成的回调触发后,再取出执行跳转
- 跳转前先判断当前栈顶页面是否已经是目标页面,避免重复push相同页面
- 如果跳转需要登录权限,路由层先跳转到登录页,登录完成后再继续执行之前的deeplink跳转逻辑,不要直接丢弃跳转请求
常见坑点规避
- 冷启动场景不要过早执行跳转,要等应用的初始化逻辑(权限申请、用户状态判断、根控制器渲染)全部完成后再处理,否则会出现跳转失败、崩溃的问题
- 通知payload中的deeplink要做合法性校验,避免恶意构造的deeplink导致应用跳转异常
- 不要在通知点击回调里直接写页面跳转逻辑,全部收敛到统一路由层处理,后续修改跳转规则不需要修改通知相关代码
内容的提问来源于stack exchange,提问作者Amogam
相关产品推荐
相关产品推荐

