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