アイリッジ開発者ブログ

アイリッジに所属するエンジニアが技術情報を発信していきます。

震えながらディープリンク再入門

こんにちは。開発部第1グループの高橋と申します。

ディープリンク。モバイルアプリ開発で度々話題に出るワードですが、出てくる場面によって何となく印象が違う…。自分はその仕組みをきちんと理解できているのか、他の人と同じ認識で話せているのか、不安で震えるワードNo.1でした。
今回調査する機会があったため、ディープリンクの仕組み、および実現するための技術についてまとめました。

この記事でわかること

  • ディープリンクの概念的な部分
  • 使われる技術の概要や注意点
  • ディープリンクが利用される例

※詳しい実装手順などについては言及していません🙇

ディープリンクとは?

モバイルアプリでいうディープリンクとは、ブラウザなどからアプリの特定の画面やコンテンツへ直接遷移できるリンクのことを指します。
では、アプリの実装ではどんな技術を使っているのでしょうか。

アプリの実装で利用される技術

カスタムURLスキーム

概要

アプリで独自に定義したURLスキームのこと。
URLスキームについての説明はここでは割愛します

◇特徴

  • 端末にアプリが存在する場合はアプリを起動。インストールされていない場合はURLが無効とされ、何も起こらない
  • カスタムURLスキームを使う場合はブラウザや別のアプリで開こうとした時、アプリ起動の前に毎回ダイアログが表示される

◇実装の流れ

  1. 独自のURLスキームを決め、アプリマーケティング担当者やサーバーサイドと共有する
  2. アプリにURLスキームを設定する
    • iOS:受け取るURLスキームをInfo.plist(またはXcodeでTARGETS を選択し、Info > URL Types > URL Schemes)に追加
    • Android: 受け取るURLスキーム, Host, pathの組み合わせをAndroidManifestに追加
  3. アプリでURLスキームを受け取った時の処理を実装する

注意点

カスタムURLスキームはセキュリティのリスクが指摘されています。
そのため、機密情報の受け渡しに使ってはいけません⚠️
※参考:iOSのURLスキームを乗っ取る攻撃手法について解説
また、WWDC2020の動画でAppleは「URLスキームではなくUniversal Linksを使うことを推奨する」と述べています。

Universal Links(iOS)

概要

ユニバーサルリンクはAppleが提供するディープリンクの仕組みで、通常のWebリンクの形式を採用しています。(https や http)
※参考:Apple Documentation Allowing apps and websites to link to your content

◇特徴

  • アプリが端末に存在する場合だけでなく、インストールされていない時の処理を設定可能
      • 任意のWebページを表示する
      • AppStoreアプリを起動して、該当アプリのインストールページに遷移する
  • ユニバーサルリンクを開いた時にダイアログが表示されずシームレスにアプリを起動できる

◇実装の流れ

  • Web側
    • アプリと関連付けるドメイン、パスを決める
    • 関連付け情報を記載した設定ファイル (apple-app-site-association/AASA)をサーバー等モバイルからアクセス可能な場所に配置する
  • アプリ側
    • プロジェクトのCapabilities → Associated Domainsを有効にする
      • Domains に関連付けするドメインを追加する
    • Apple Developerでも該当アプリのAssociated Domainsを有効にする
    • ユニバーサルリンクで起動された時の処理を実装

注意点

  • コスト面
    • Webリンクを使うため、サーバー等や独自のドメインを用意する必要があります。
  • セキュリティ面
    • アプリとWebサイト間の関連付けを作成することによってカスタムURLスキームよりも安全になりますが、Appleの公式ドキュメントには以下のような注意書きがあります。

    Warning
    Universal links offer a potential attack vector into your app, so make sure to validate all URL parameters and discard any malformed URLs. In addition, limit the available actions to those that don’t risk the user’s data. For example, don’t allow universal links to directly delete content or access sensitive information about the user. When testing your URL-handling code, make sure your test cases include improperly formatted URLs.

    (↓ざっくり和訳)

    ユニバーサルリンクは潜在的に攻撃ベクトル(攻撃者に侵入される可能性のある経路)を提供しています。そのため、必ずすべての URL パラメーターを検証し、不正な形式の URL を破棄してください。そして、ユーザーのデータを危険にさらさないように、ユニバーサルリンクで利用可能なアクションを制限してください。

    • 制限の例
      • ユニバーサルリンクでコンテンツを直接削除できないようにする
      • ユーザーに関する機密情報にアクセスできないようにする

App Links(Android)

Androidが提供する、iOSのユニバーサルリンクと同等の仕組みです。
基本的な考え方はほぼ同じなので、今回は割愛します🙇
※参考:

まとめ

一口に「ディープリンク」と言っても、どの技術を使って実装しているのか理解&対向システムとの連携をしておかないと、できる/できない事の認識に齟齬が生じる可能性もあると思います。
開発を始める時には、要件・仕様によって使う技術を選定する必要もありますね。
ディープリンクを今まで自分で1から実装したことはありませんでしたが、今回学んだことで理解が深まりました!

おまけ:ディープリンクの機能拡張

(詳しく書くと長くなりすぎてしまうので、次回以降にまとめてみたいと思っています)
◇ディファードディープリンク(Deferred deep linking)

  • アプリをインストール済みの端末だけでなく、新規インストールの場合も完了後に任意の画面へ遷移できる仕組み
    • 一度アプリのインストールという工程を挟んだ後にリンクに設定されたアクションを実行するため、deferred(= 遅延された)ということかな?と考えています。
  • iOSのクリップボードを使って実装する事もあるようですが、サードパーティのSDKでもディファードディープリンクの機能が提供されています

◇コンテクスチュアルディープリンク(Contextual deep linking)
※呼び方は人や場面によって様々あるようですが「Contextual = 文脈上の」という意味でこちらの説明を記載します。

  • ユーザーがどんな経路でアプリを起動/インストールしたか等の情報が分かる
    • 経路:アプリストア、Webサイト、広告、紹介キャンペーン…等々
    • この情報を利用することで、ユーザーが直前まで見ていた画面と連続した内容をアプリ上で表示する事ができる
  • 使用例
    • ユーザーを招待するとポイントがもらえるアプリ等で、招待リンクを受け取った人がアプリをインストールする
      → アプリ起動後に自動で招待コードを入力する

    • 通販・ネットショップ等のWebサイトを閲覧していたユーザーがリンクを開く
      → アプリ起動後、特定の商品ページへ遷移する