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

如何在Swift应用中获取点击的Universal Link完整URL

在Swift应用中获取Universal Link完整URL的解决方案

背景说明

已完成Universal Link配置(点击Safari中的链接可在模拟器中打开应用),应用负责关联域名app.mycompany.io的全部功能。

apple-app-site-association文件内容

$ curl https://app.mycompany.io/.well-known/apple-app-site-association
{
  "applinks": {
      "details": [
           {
             "appIDs": [ "ABCD1234.io.mybundle" ],
             "paths": [
                "*"
             ],
             "components": [
               {"/": "/*"}
             ]
           }
       ]
   }
}

初始应用代码

struct MyApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    @ObservedObject var model = MyAppModel()
    
    var body: some Scene {
        return WindowGroup() {
           // 界面代码
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        // 应用初始化逻辑
        return true
    }
    
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        // 原本期望在这里获取Universal Link,但该方法从未被调用
        return true
    }
}

当前问题

AppDelegate中的application(_:continue:restorationHandler:)方法从未被调用,无论从主屏幕启动应用、点击链接启动应用,还是点击链接将后台应用唤起至前台。需要实现:

  1. 点击Universal Link启动应用时获取链接(已实现)
  2. 点击Universal Link将后台应用唤起至前台时获取链接(待实现)

已实现的启动场景代码

通过以下方法实现了启动应用时获取URL:

func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    for x in options.userActivities {
        if x.activityType == NSUserActivityTypeBrowsingWeb {
            if let url = x.webpageURL {
                handleDeepLink(url)
            }
        }
    }
    return UISceneConfiguration()
}

后台唤起场景的解决方案

由于iOS 13+采用Scene架构,原application(_:continue:restorationHandler:)方法不再触发,需要让AppDelegate同时遵循UISceneDelegate协议,并实现scene(_:continue:)方法来处理后台唤起场景:

class AppDelegate: NSObject, UIApplicationDelegate, UISceneDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        // 应用初始化逻辑
        return true
    }
    
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        for x in options.userActivities {
            if x.activityType == NSUserActivityTypeBrowsingWeb {
                if let url = x.webpageURL {
                    handleDeepLink(url)
                }
            }
        }
        return UISceneConfiguration()
    }
    
    // 处理后台唤起时的Universal Link
    func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
              let url = userActivity.webpageURL else {
            return
        }
        handleDeepLink(url)
    }
}

说明

当应用处于后台时,点击Universal Link唤起应用至前台时,scene(_:continue:)方法会被触发,可在这里获取对应的URL并调用handleDeepLink方法进行业务处理。


内容的提问来源于stack exchange,提问作者pieroxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:33:17