Firebase DynamicLinksについて
Firebase DynamicLinksはiOS, Android, Webへのリンクの共有を簡単にしてくれる便利な機能です。この記事ではiOSでFirebase DynamicLinksを実装する上で知っておくべき内容についてご説明します。
minimumAppVersion
「この値より古いバージョンがインストールされていた場合は、App Storeに遷移してアップデートを促す」という仕様ではありません。
minimumAppVersionの値に関わらず、DynamicLinksに対応済みのバージョンがインストール済みならアプリは起動してしまうので注意してください。ドキュメントにもあるように、このバージョンより古いアプリでDynamicLinkを受け取ってしまった場合の処理は自分で記述する必要があります。
使いどころ
例えばアプリのアップデートによりDynamicLinks経由で起動できる画面が増えた場合に、minimumAppVersionを上げることが考えられます。これにより、古いバージョンのアプリは、自分の知らない仕様のURLが受信されたことを検知できます。
minimumAppVersionよりも古いバージョンでDynamicLinkを受け取ってしまった場合
正しく対応する場合は、
- そのURLを一旦ローカルに保存する
- ユーザをApp Storeへ誘導する
- アップデートされたら保存したURLを読み出して対応する
と言った実装が必要になります。実装が大変であれば、読み捨てるという割り切りも良いかもしれません。
新規インストールからDeepLinkが取得できない場合
自己診断ツール
まず自己診断ツールを使って設定に誤りがないか確認し、エラーになっているようならコンソールログの表示内容を参考に修正します。
DynamicLinks.performDiagnostics(completion: nil)
ダイナミック リンクのデバッグ | Firebase https://firebase.google.com/docs/dynamic-links/debug?hl=ja
自己診断ツールは"no errors found"なのにリンクが取得できない場合
自己診断ツールでは問題ないのに、AppDelegateのapplication(_ app:open:options:)
が毎回"dlscheme://google/link/?dismiss=1&is_weak_match=1"
になってしまいディープリンクが取得できないことがあります。
まずはSDKが最新であることを確認してください。本機能については何度かバグ修正が行われています。
私の場合、APIの許可設定に問題がありました。Google APIs Consoleより設定を変更することで解決されました。
- Google APIs Consoleにアクセスする。
- 「ライブラリ」→「Firebase Dynamic Links API」でAPIが有効になっていることを確認する。
- 「認証情報」からFirebaseの当該プロジェクトに対応しているAPIキーを探し、アプリケーションの制限の設定に問題がないかを確認する。
DynamicLinks
型のメソッドの意味がよくわからない
func handleUniversalLink(_ url: URL, completion: @escaping DynamicLinkUniversalLinkHandler) -> Bool
ショートURLをロングURLに戻します。
func shouldHandleDynamicLink(fromCustomSchemeURL url: URL) -> Bool
DynamicLinksによるインストール後の起動後にAppDelegateのapplication(_ app:open:options:)
が呼ばれますが、そこで渡されるurl
がDynamicLinksによるものかどうかを判定します。
これがtrue
ならdynamicLink(fromCustomSchemeURL:)
によってDynamicLink
型に変換できます。
画像があるならSocial Meta Tagを使うべき
オプションですが、未インストールユーザがDynamicLinkを踏んだ時に見えるプレビューページがリッチになるので、画像が表示できるアプリは使用すると良いと思います。
ソーシャル メタデータでリンク プレビューを生成する | Firebase https://firebase.google.com/docs/dynamic-links/link-previews?hl=ja
Androidとの違い
- Androidにはプレビューページがなく、未インストールユーザは直接Google Playに飛ばされます。
- AndroidはDynamicLinkで指定された最小バージョンよりも古いバージョンがインストールされている場合はGoogle Playに飛ばされます。
共有アプリごとに付与するパラメータを切り替えたい
計測目的など、シェア先によってURLのオプションを変更したいケースがあると思います。ユーザがActivity Viewを選んだ際にシェアする内容を同期で渡す必要があるのですが、ショートURLの生成は非同期で行われるため困ることになります。
- 非同期を無理やり同期に変換する。
- ユーザがシェアを押す前に全パターンのURLを生成しておく。
といった解決策がありそうですが、私は前者の同期で変換するパターンで対応しました。次の手順になります。
- 同期に変換する場合は、
UIActivityItemProvider
を継承した型を作成し、UIActivityItemProvider#item
をオーバーライドします。 - GCDを使って
item
が呼ばれたら同期でショートURLを返すように実装します。
シェアの際にitem
が呼ばれるスレッドはメインスレッドではないので、単純にsemaphoreを使って止めるようにしました。ただしこの場合、シェア先を選択した後少し画面が固まることになります。他に良い実装方法があれば教えていただきたいです。
まとめ
ハマりどころはありますが、OSまたぎのURL共有を解決するのは手間ですので、こういったサービスに頼るのは良いと思います。