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

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

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →
Avatar for Sansan 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/

Avatar for Sansan

Sansan

September 20, 2020

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