You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动