DeepLink導入に関して 詰まった所をまとめます

これまで、FirebaseのDeepLinkを使っていましたが新たに、AppsFlyerのDeepLinkを利用することになりました。 私は、今回が初めてのDeepLinkの実装であったためそこで詰まった点についてまとめておきたいと思います。 これから、FireabaseやAppsFlyerでDeepLinkを実装する方に少しでも理からになるようにまとめておきたいと思います。 この記事では、AppsFlyerを使って記事を作成していますが、Firebaseでも通じるところが多々あります。

SDKの導入

まずは、podを使ってSDKをインストールしていきます。

そして、AppDelegateに下記を記述します。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  AppsFlyerTracker.shared().appsFlyerDevKey = "<your-appsflyer-dev-key>";
       AppsFlyerTracker.shared().appleAppID= "123456789"

func applicationDidBecomeActive(application: UIApplication) { 
     AppsFlyerTracker.shared().trackAppLaunch() 
}

を実装していきます。これによりトラッキングが開始されます。

Appsflyerでは、この設定でイベントを取得することができます。

DeepLinkの実装

AppsFlyerのConfigure OneLink を選択します。

OneLinkは、FirebaseのDeepLinkに似たものでAppsFlyerが独自で用意したLinkです。

OneLinkの設定には、 App ID peefixiOS App Bundle ID が必要になります。

App ID prefixは、App Developer -> AppID -> Bundle IDと一致したアプリを選択すると確認することができます。 これで、OneLinkの設定は終了です。

しかし、ここからがドツボにハマる点でした。

AppsFlyerでは、3つの実装ができているかを確認するためのテストが用意されています。

  1. non organic install
    -> 流入してきたユーザーがorganicかそうではないかをhandleできるかをテストしています。
  2. In-app Events    -> Eventをしっかり取れているのかをテストしています。
  3. Deeplinking    -> DeepLinkが正しく押されているのかをテストしています。

1と2に関しては、非常に簡単に実装することができましたが3に10時間ほどハマりました。

なので、今回はそこを徹底的に紹介していきます。

Domain設定

iOSには、entitlementというものが存在しそこにdomainの設定を行う必要があります。 domainの設定は、 DeepLinkのpathを許容するために必要のようで設定するためには必須です。 そのDoamin追加の部分に、 applinks:mydomain.onelink.me を記述します。 まず、ここで5時間は使いました。 次に、このDomainを設定した後一度端末の電源をOFFにすることが必要のようです。

Universal Linksでアプリ起動時に利用され、自動的にiOSアプリのインストール時に自動的にダウンロードされるはずの「apple-app-site-association」ファイルが、iOS 11.2以上を使用している端末で、ダウンロードされないことがあるようです。このファイルなしでは、iOS端末はUniversal Linksはアプリを直接起動することができません。
ディープリンクのテスト時にこの事象が発生している場合、アプリをアンインストールし、ホワイトリストに登録済みのiOS端末を再起動した上で、アプリを再インストールしてください。それでも問題が解決しない場合、再度同じ手順を繰り返してください。
iOS11.2を使用している多数のiPhone端末で同様の問題が発生していることを確認していますが、どれだけこの問題が蔓延しているかは不確かです。iOSユーザーの3分の2に影響しかねないこの事象を、Appleがいち早く解決することを祈っています。

AppsFlyerでは、上記のように記述されていました。

この電源を切るか切らないかで、5時間はくらいました。

最後に、AppsDelegateで下記を設定すればテストも無事に終えることができました。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}

ということで、今後Deeplinkを実装される方は上のDomainの設定を忘れないようにしてください。