iOS推送通知中使用Universal Links实现DeepLinking技术探究
在iOS推送通知中使用Universal Links实现Deep Linking
嘿,我懂你的需求——大多数教程都聚焦于从网站跳转App的Universal Links场景,但用推送通知里的Universal Links替代URL Scheme,同时兼顾Web端兼容,确实是个更优的方案。下面一步步拆解实现方法,顺便聊聊容易踩的坑。
第一步:搞定Universal Links的基础配置
在对接推送之前,必须先确保你的App已经正确配置了Universal Links,这是一切的前提:
- 部署
apple-app-site-association文件:在你的域名根目录(或.well-known子目录)放置这个JSON文件,里面要包含你的团队ID、App Bundle ID,以及需要关联的路径规则。 - 开启关联域名权限:在苹果开发者后台给你的App ID启用「Associated Domains」能力,然后在Xcode项目的「Signing & Capabilities」里添加
applinks:你的域名.com。 - 验证关联有效性:用苹果的官方验证工具确认你的链接已经正确关联到App。
配置推送通知的Payload
你的APNs推送 payload 需要携带Universal Links,示例结构如下:
{ "aps": { "alert": { "title": "新内容提醒", "body": "点击查看最新更新" }, "mutable-content": 1 // 可选,如果你需要通过Notification Service Extension修改payload的话 }, "deeplink": "https://你的域名.com/具体内容路径" }
deeplink是自定义字段,用来传递Universal Links,你可以随便命名,但要保持前后一致。- 如果不需要修改推送内容,
mutable-content可以省略。
在App中处理推送点击事件
根据App的状态,处理方式略有不同:
1. App处于前台时
通过UNUserNotificationCenterDelegate捕获推送点击事件,然后打开链接:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo if let deepLinkStr = userInfo["deeplink"] as? String, let deepLinkURL = URL(string: deepLinkStr) { UIApplication.shared.open(deepLinkURL, options: [:]) { success in if success { // 链接打开成功,跳转到对应的页面 } } } completionHandler() }
2. App处于后台或未启动时
当用户点击推送启动/唤醒App时,系统会通过NSUserActivity传递Universal Links:
- UIKit(AppDelegate):
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL { // 解析URL,跳转到对应页面 return true } return false } - SwiftUI/SceneDelegate:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL { // 在这里处理URL导航逻辑 } }
避坑小贴士
- 用真实APNs推送测试:本地通知虽然逻辑类似,但一定要用真实远程推送验证,避免服务器端的payload配置问题。
- 保证链接唯一性:你的Universal Links要对应App内的具体内容,避免用模糊路径导致无法定位到唯一页面。
- 处理 fallback 场景:如果App版本太旧不支持该Universal Links,可以 fallback 到打开对应Web页面。
- 告别URL Scheme冲突:Universal Links最大的优势之一就是不会和其他App的Scheme冲突,不用再担心“选择打开应用”的弹窗问题。
内容的提问来源于stack exchange,提问作者user1383060




