iOS
Swift

iOSアプリがユニバーサルリンクから起動されているかどうかを知る

やりたいこと

よくある実装

よくあるユニバーサルリンクの実装は以下のようにapplication(_:continueUserActivity:restorationHandler:)のなかでuserActivityから情報を取ってきて起動処理をするものです。

extension AppDelegate {
  func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          // ユニバーサルリンクの処理
        print(userActivity.webpageURL!)
      }
    }
    return true
}

アプリが起動していない状態でユニバーサルリンクをクリックすると、application(_:didFinishLaunchingWithOptions:)などの初期化処理の後にこの関数が呼ばれます。

やりたいこと

しかし今回、どうしてもapplication(_:didFinishLaunchingWithOptions:)の処理の中で中でユニバーサルリンク起動かどうかを知る必要がありました。

application(_:didFinishLaunchingWithOptions:)の中でユニバーサルリンク起動かどうか知る

結論からいうと、launchOptionsのキーに.userActivityDictionaryを指定して、その中身からuserActivityの内容がとれます。

class AppDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    if let userActivityDictionary = launchOptions?[.userActivityDictionary] as? [UIApplicationLaunchOptionsKey : Any],
    let userActivity = userActivityDictionary[.userActivityType] as? NSUserActivity {
      // application(_:continueUserActivity:restorationHandler:)のuserActivityと同じものが取得できる。
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        print(" ユニバーサルリンクから起動。URL:\(userActivity.webpageURL!)")
      }
    }
    return true
  }
}

userActivitynilかどうか判断すればユニバーサルリンク起動か知ることができます。