iOS アプリがユニバーサルリンクから起動されたかを判定する
検証環境:
Xcode Version 12.5 (12E262)
Swift 5.4
ユニバーサルリンク(Universal Link)から iOS アプリが呼び出された場合にはAppDelegate
のapplication(_:continue:restorationHandler:)
メソッドが呼び出される。
これはアプリが
- 未起動状態からアプリ起動
- バックグラウンド状態 からフォアグラウンドになる
のどちらでも呼び出される。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let webpageURL = userActivity.webpageURL { print("webpageURL: \(webpageURL)") } return true }
アプリが未起動状態でユニバーサルリンクからアプリが起動した場合は、上記に書いたAppDelegate
のapplication(_:continue:restorationHandler:)
メソッドの呼び出しに加えてAppDelegate
のapplication(_:didFinishLaunchingWithOptions:)
メソッドの引数 launchOptions
にも NSUserActivity パラメータが入っているので、それをチェックすることでアプリがユニバーサルリンクから起動されたかを判定することができる。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { if let userActivityDict = launchOptions?[.userActivityDictionary] as? [String: Any] { if let userActivity = userActivityDict["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity { if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let webpageURL = userActivity.webpageURL { NSLog("webpageURL: \(webpageURL)") } } } return true }
呼び出し順は
application(_:didFinishLaunchingWithOptions:)
application(_:continue:restorationHandler:)
になる。
ちなみに NSUserActivity はユニバーサルリンク以外にも、Siriショートカットや、Spotlight検索でも使われるが、上記と同様な方法で判定できる。