はじめに
Firebase Dynamic Links を用いて、 Web ページ等から AppStore を経由して新規インストール、その後の起動でリンクに基づいた処理をアプリで行う場合の注意点等をまとめます。
基本的な実装方法に関しては日本語ドキュメント等もありますのでそちらをご覧ください。
なお、 iOS10 以降をサポートバージョンとするアプリを前提として話を進めます。
また、 Firebase Dynamic Links によって流れてくるリンクのことを別のリンクと区別するためにここでは Dynamic Links と呼ぶことにします。
呼ばれるメソッドが違う
最後に、application:openURL:sourceApplication:annotation: メソッド(iOS 8 以前)と application:openURL:options: メソッド(iOS 9 以降)で、アプリのカスタム URL スキームを通して受信したリンクを処理します。これらのメソッドが呼び出されるのは、アプリが iOS 8 以前でリンクを受信したときと、iOS(バージョンを問わず)にアプリをインストールした後にアプリが初めて開かれたときです。
iOS のサポートバージョンによって実装方法も異なってくることは多くの方がご存知だと思いますが、「アプリをインストールした後にアプリが初めて開かれるとき」も関係してくる話であることを見落としてはいけません。
// インストール後2回目以降で Dynamic Links が来る
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// DynamicLinks.dynamicLinks().dynamicLink(fromUniversalLink: URL) で判別
}
// インストール後初起動で Dynamic Links が来る
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
// DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: URL) で判別
}
ここでもう一つ注意したいのが、 インストール後初起動では必ず Dynamic Links が流れてくる という点です。なので、インストール後初起動のタイミングで行う処理がなかったとしても Dynamic Links を受信可能にしたアプリの場合、 url のパース処理で Dynamic Links が流れてくることを考慮しなければなりません。
ちなみに、Web ページ等から該当のリンクを経由していない場合に流れてくる Dynamic Links は url が nil になっています。
プレビューページスキップは非推奨
AppStore もしくはアプリに直接遷移させることもできますが、推奨しないとコンソールにも書かれています。実は、 AppStore を経由した場合に、アプリ側に流れてきた Dynamic Links がどれだけ信頼できるものであるかを決めるのに役立っているのがこのプレビューページとのことです。
また、スキップした場合に挙動が安定しない(リンクが渡ってこない)などが発生する可能性もあるため、基本的にはプレビューページは有効にしておくべきと言えます。
プレビューページを通過後にクリップボードを確認してみると、その仕組を少し覗き見ることができるかもしれません。
動作確認
AppStore からインストールされる必要はありません。
一度対象のアプリをデバイスから削除しておき、その状態でリンクを踏んで AppStore まで遷移後、 Xcode でいつもどおり実機インストールを行うことでインストール後初起動の挙動を再現することが可能です。
また、 TestFlight などでインストールするときも Xcode でインストールするときとタイミングは同じなのでテスターさんも比較的簡単に動作確認を行うことが可能です。
おわりに
実際のプロダクトで動作確認を行ったときの挙動をもとに記事にしているため、環境によっては異なる挙動を見せるかもしれません。挙動の違いや、間違いと感じる箇所があればコメント等よろしくお願いします。