Posted at

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

More than 1 year has passed since last update.


やりたいこと


よくある実装

よくあるユニバーサルリンクの実装は以下のように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かどうか判断すればユニバーサルリンク起動か知ることができます。