xyk blog

最近は iOS 開発の記事が多めです。

iOS アプリがユニバーサルリンクから起動されたかを判定する

検証環境:
Xcode Version 12.5 (12E262)
Swift 5.4

ユニバーサルリンク(Universal Link)から iOS アプリが呼び出された場合にはAppDelegateapplication(_: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
}

アプリが未起動状態でユニバーサルリンクからアプリが起動した場合は、上記に書いたAppDelegateapplication(_:continue:restorationHandler:)メソッドの呼び出しに加えてAppDelegateapplication(_: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
}

呼び出し順は

  1. application(_:didFinishLaunchingWithOptions:)
  2. application(_:continue:restorationHandler:)

になる。

ちなみに NSUserActivity はユニバーサルリンク以外にも、Siriショートカットや、Spotlight検索でも使われるが、上記と同様な方法で判定できる。