如何在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:)方法从未被调用,无论从主屏幕启动应用、点击链接启动应用,还是点击链接将后台应用唤起至前台。需要实现:
- 点击Universal Link启动应用时获取链接(已实现)
- 点击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
相关产品推荐
相关产品推荐

