Upgrade to Pro — share decks privately, control downloads, hide ads and more …

With Firebase Dynamic Links, we want to provide...

Sansan
September 20, 2020

With Firebase Dynamic Links, we want to provide an experience for our existing users as well as potential users!

■イベント
iOSDC Japan 2020
https://iosdc.jp/2020/

■登壇概要
タイトル:Firebase Dynamic Links で既存のユーザーだけでなく、潜在的ユーザーにも体験を提供したい!
登壇者:Sansan事業部 プロダクト開発部 中川泰夫

※アニメーション付きは以下にてご覧いただけます。
https://ynakagawa33.github.io/iOSDC_Japan_2020/Slide.html

▼Sansan Builders Blog
https://buildersbox.corp-sansan.com/

Sansan

September 20, 2020
Tweet

More Decks by Sansan

Other Decks in Technology

Transcript

  1. Custom URL Scheme Universal Links Availability iOS 2.0+ iOS 9.0+

    Vulnerability Hijacking Safety Limitation - 同⼀ドメイン上での URL 遷移 の場合、アプリを開け ない 7 7
  2. Firebase Dynamic Links Availability iOS 8.0+ Vulnerability Open-Redirect (ホワイトリスト機能で防御 可能)

    Limitation - ※ どの技術でも利⽤可能なアクションはユーザーのデータを 危険にさらすことのないものに制限しましょう 8 8
  3. 類似技術 (Universal Links / Custom URL Scheme) と⽐べた際のメリット . ⼀つのリンクで複数プラットフォームの動作を定義できる

    . アプリがインストールされていないときの動作を定義できる . ディープリンクに関する統計情報を確認できる 9 9
  4. 類似技術 (Universal Links / Custom URL Scheme) と⽐べた際のメリット . ⼀つのリンクで複数プラットフォームの動作を定義できる

    . アプリがインストールされていないときの動作を定義できる . ディープリンクに関する統計情報を確認できる 10 10
  5. 類似技術 (Universal Links / Custom URL Scheme) と⽐べた際のメリット . ⼀つのリンクで複数プラットフォームの動作を定義できる

    . アプリがインストールされていないときの動作を定義できる . ディープリンクに関する統計情報を確認できる 12 12
  6. 類似技術 (Universal Links / Custom URL Scheme) と⽐べた際のメリット . ⼀つのリンクで複数プラットフォームの動作を定義できる

    . アプリがインストールされていないときの動作を定義できる . ディープリンクに関する統計情報を確認できる 14 14
  7. Firebase Dynamic Links の 導⼊⽅法 . Firebase コンソールで設定する . アプリに

    Firebase を追加する . ダイナミックリンクを作成する . アプリでダイナミックリンクを開く 17 17
  8. Firebase Dynamic Links の 導⼊⽅法 . Firebase コンソールで設定する . アプリに

    Firebase を追加する . ダイナミックリンクを作成する . アプリでダイナミックリンクを開く 18 18
  9. Firebase コンソールで設 定する URL 接頭辞を追加します ※ 画像では Google 提供の ドメインを利⽤しています

    ブランディングのために⽤意 したドメインを使⽤すること も可能です 21 21
  10. Firebase コンソールで設 定する 推奨: ディープリンクや フォールバックリンクで 許可する URL パターンを 指定する

    メニューを開いて、 URL パ ターンをホワイトリストに登 録 をクリック 23 23
  11. Firebase コンソールで設 定する アプリの App Store ID と チーム ID

    がアプリの設定で指定 されていることを確認します Firebase の 設定 ページへ 移動します 28 28
  12. Firebase コンソールで設 定する チーム ID は Apple Developer の Certificates,

    Identifiers & Profiles の Identifires のアプリのページに表⽰される App ID Prefix 31 31
  13. Firebase Dynamic Links の 導⼊⽅法 . Firebase コンソールで設定する . アプリに

    Firebase を追加する . ダイナミックリンクを作成する . アプリでダイナミックリンクを開く 32 32
  14. アプリに Firebase を追加する Podfile で次の Pod をインクルードします ※ 事前に CocoaPods

    の導⼊を済ませておいてください pod 'Firebase/Analytics' pod 'Firebase/DynamicLinks' pod install を実⾏し、 .xcworkspace ファイルを 開きます 33 33
  15. Firebase Dynamic Links の 導⼊⽅法 . Firebase コンソールで設定する . アプリに

    Firebase を追加する . ダイナミックリンクを作成する . アプリでダイナミックリンクを開く 36 36
  16. Firebase Dynamic Links の 導⼊⽅法 . Firebase コンソールで設定する . アプリに

    Firebase を追加する . ダイナミックリンクを作成する . アプリでダイナミックリンクを開く 48 48
  17. アプリでダイナミック リンクを開く Identifier フィールドに⼀意 の値を設定し、 URL scheme フィールドにはバンドル ID を

    設定 バンドル ID は、ダイナミック リンクにより使⽤される デフォルトの URL スキームに なる 50 50
  18. アプリでダイナミック リンクを開く アプリの Xcode プロジェクト の Signing & Capabilities タブで

    Associated Domains を追加し、 Domains リストに ダイナミックリンクの ドメインを追加 applinks:your_dynamic_links_domain 51 51
  19. アプリでダイナミックリンクを開く application:continueUserActivity:restorationH andler: メソッドを使⽤して、アプリがインストールされ ている場合にユニバーサルリンクとして受信されるリンクを 処理します (iOS 9 以降) func

    application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { let handled = DynamicLinks.dynamicLinks() .handleUniversalLink(userActivity.webpageURL!) { dynamiclink, error in // 特定画⾯への遷移処理 etc... } return handled } 52 52
  20. アプリでダイナミックリンクを開く @available(iOS 9.0, *) func application(_ app: UIApplication, open url:

    URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool { return application( app, open: url, sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String, annotation: "" ) } func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) { // Handle the deep link. For example, show the deep-linked content or // apply a promotional offer to the user's account. // ... return true } return false } 54 54
  21. アプリでのハンドリング guard let webPageUrl = userActivity.webpageURL else { return true

    } DynamicLinks.dynamicLinks().handleUniversalLink(webPageUrl, completion: { [weak self] dynamicLink, error in guard error == nil else { return } self?.dynamicLinkPresenter?.dynamicLinkDidReceive(dynamicLink) }) DynamicLink を⽣成したあとは Presenter へ処理を 移してます 62 62
  22. アプリでのハンドリング func dynamicLinkDidReceive(_ dynamicLink: DynamicLink?) { // ( 中略) if

    interactor.isSatisfiedAppVersionFrom( dynamicLinkMinimumAppVersion: dynamicLink.minimumAppVersion) { // ( 中略: 次のスライドで説明します) } else { router.navigate(to: .appStore) } } アプリバージョンがダイナミックリンクが要求する 最低バージョンを満たせてない場合、ストアへ遷移させる 63 63
  23. アプリでのハンドリング if interactor.isSatisfiedAppVersionFrom( dynamicLinkMinimumAppVersion: dynamicLink.minimumAppVersion) { guard let destination =

    interactor.classify(from: dynamicLink.url) else { let error = DynamicLinkClassifyError(dynamicLink) CrashlyticsErrorRecorder().record(error: error) return } router.navigate(to: destination) } アプリバージョンがダイナミックリンクが要求する 最低バージョンを満たしている場合、 URL を判別して、 適切な遷移先へ遷移させる もし、判別に失敗したら、気付けるように Crashlytics へ Non Fatal Issue で送出する 64 64
  24. 利⽤したパラメータ 名前 説明 ibi リンクを開くために使う iOS アプリのバンドル ID ifl アプリがインストールされていない場合に開くリンク

    imv リンクを開くことが出来るアプリの最⼩バージョン efr 「1」の場合、プレビューページをスキップ 70 70