コンテンツにスキップ

ユニバーサルリンクとApp Links

この記事では、Appleユニバーサルリンクと Android App Linksの設定方法について説明します。

Appleユニバーサルリンクと Android App Linksは、Webコンテンツとモバイルアプリ間のシームレスな遷移を提供するために考案されたメカニズムです。ユニバーサルリンクはiOS固有のものですが、Android App LinksはAndroidアプリケーションで同じ目的を果たします。

ユニバーサルリンク(iOS)とApp Links(Android)は、Webページとアプリ内のコンテンツの両方を指す標準的なWebリンク(http://mydomain.com)です。

ユニバーサルリンクまたはApp Linksが開かれると、オペレーティングシステムはそのドメインに登録されたインストール済みアプリがあるかどうかを確認します。アプリが見つかった場合、Webページを読み込むことなく即座にアプリが起動します。アプリが見つからない場合は、ユーザーのデフォルトWebブラウザーでWeb URLが読み込まれます。このブラウザーは、App StoreまたはGoogle Play Storeにリダイレクトするように構成することもできます。

つまり、ユニバーサルリンクを使用すると、WebサイトはそのWebページを特定のアプリ画面に関連付けることができます。そのため、ユーザーがアプリ画面に対応するWebページへのリンクをクリックすると、アプリを直接開くことができます(アプリが現在インストールされている場合)。

次の表は、ユニバーサルリンクと従来のディープリンクの主な違いをまとめたものです。

  ユニバーサルリンクとApp Links ディープリンク
プラットフォームの互換性 iOS(バージョン9以降)およびAndroid(バージョン6.0以降) さまざまなモバイルOSで使用
目的 iOSおよびAndroidデバイスでWebとアプリのコンテンツをシームレスにリンク 特定のアプリコンテンツへのリンク
機能 コンテキストに基づいてWebページまたはアプリコンテンツに誘導 特定のアプリ画面を開く
アプリのインストール アプリがインストールされている場合はアプリを開き、それ以外の場合はWebコンテンツを開く アプリのインストールが必要

ユースケース

ユニバーサルリンクとApp Linksは、メールキャンペーンで最もよく使用されます。メールはデスクトップとモバイルデバイスの両方で開封およびクリックできるためです。

一部のチャネルでは、これらのリンクがうまく機能しません。たとえば、プッシュ通知、アプリ内メッセージ、Content Cardsでは、スキームベースのディープリンク(mydomain://)を使用する必要があります。

前提条件

ユニバーサルリンクとApp Linksを使用するには、以下の条件を満たす必要があります。

  • WebサイトがHTTPS経由でアクセス可能であること
  • アプリがApp Store (iOS) またはGoogle Play Store (Android) で公開されていること

アプリがユニバーサルリンクまたはApp Linksをサポートするには、iOSとAndroidの両方で、リンクドメインに特別な権限ファイルをホストする必要があります。このファイルには、そのドメインからのリンクを開くことができるアプリの定義が含まれており、iOSの場合は、それらのアプリが開くことを許可されるパスも定義されています。

  • iOS: Apple App Site Association (AASA) ファイル
  • Android: Digital Asset Links ファイル

この権限ファイルに加えて、アプリが開くことを許可されるリンクドメインのハードコーディングされた定義がアプリ内に設定されます。

  • iOS: Xcodeで「Associated Domains」として設定
  • Android: アプリのAndroidManifest.xmlファイルで定義

この二部構成のドメインとアプリの関連付けは、ユニバーサルリンクまたはApp Linkが機能するために必要であり、任意のアプリが特定のドメインからのリンクをハイジャックしたり、任意のドメインが特定のアプリを開いたりすることを防ぎます。

以下のステップは、Appleの開発者向けドキュメントを基にしています。詳細については、Allowing apps and websites to link to your contentを参照してください。

ステップ1:アプリのエンタイトルメントを設定する

ステップ1a:アプリを登録する

  1. developer.apple.comにアクセスしてログインします。
  2. Certificates, Identifiers & Profilesをクリックします。
  3. Identifiersをクリックします。
  4. まだApp Identifierを登録していない場合は、+をクリックして作成します。 a. Nameを入力します。任意の名前を設定できます。 b. Bundle IDを入力します。Bundle IDは、適切なビルドターゲットのXcodeプロジェクトのGeneralタブから確認できます。

ステップ1b:App IdentifierでAssociated Domainsを有効にする

  1. 既存または新規作成したApp Identifierで、App Servicesセクションを見つけます。
  2. Associated Domainsを選択します。
  3. Saveをクリックします。

App Servicesセクション

ステップ1c:XcodeプロジェクトでAssociated Domainsを有効にする

進む前に、XcodeプロジェクトでApp Identifierを登録したのと同じチームが選択されていることを確認してください。

  1. Xcodeで、プロジェクトファイルのCapabilitiesタブに移動します。
  2. Associated Domainsを有効にします。
トラブルシューティングのヒント

「An App ID with Identifier ‘your-app-id’ is not available. Please enter a different string」というエラーが表示される場合は、以下を行います。

  1. 正しいチームが選択されていることを確認します。
  2. Xcodeプロジェクトの Bundle ID(ステップ1a)が、App Identifierの登録時に使用したものと一致しているか確認します。

ステップ1d:ドメインエンタイトルメントを追加する

ドメインセクションで、適切なドメインタグを追加します。applinks:をプレフィックスとして付ける必要があります。この場合、applinks:yourdomain.comを追加したことがわかります。

Associated Domainsセクション

ステップ1e:エンタイトルメントファイルがビルドに含まれていることを確認する

プロジェクトブラウザで、新しいエンタイトルメントファイルがTarget Membershipで選択されていることを確認します。

Xcodeはこれを自動的に処理するはずです。

ステップ2:AASAファイルをホストするようにWebサイトを設定する

iOSでWebサイトのドメインをネイティブアプリに関連付けるには、WebサイトにApple App Site Association (AASA) ファイルをホストする必要があります。このファイルは、iOSに対してドメインの所有権を安全に検証する手段として機能します。iOS 9より前は、開発者は検証なしで任意のURIスキームを登録してアプリを開くことができました。しかし、AASAにより、このプロセスはより安全で信頼性の高いものになりました。

AASAファイルには、ユニバーサルリンクとして含める、または除外するドメイン上のアプリのリストとURLパスを含むJSONオブジェクトが含まれています。以下はAASAファイルのサンプルです。

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "JHGFJHHYX.com.facebook.ios",
        "paths": [
          "*"
        ]
      }
    ]
  }
}
  • appID: アプリのTeam ID(Team IDを取得するにはhttps://developer.apple.com/account/#/membership/にアクセスしてください)とBundle Identifierを組み合わせて構成されます。この例では、「JHGFJHHYX」がTeam IDで、「com.facebook.ios」がBundle IDです。
  • paths: 関連付けに含める、または除外するパスを指定する文字列の配列です。パスの前にNOTを使用してパスを無効にできます。この例では、このパスのすべてのリンクはアプリを開く代わりにWebに移動します。ディレクトリ内のすべてのパスを有効にするには*をワイルドカードとして使用でき、単一の文字に一致させるには?を使用できます(例:/archives/201?/ で2010年から2019年までのすべての数字に一致)。

ステップ3:AASAファイルをドメインにホストする

AASAファイルの準備ができたら、https://<<yourdomain>>/apple-app-site-associationまたはhttps://<<yourdomain>>/.well-known/apple-app-site-associationのいずれかでドメインにホストできます。

apple-app-site-associationファイルをHTTPS Webサーバーにアップロードします。ファイルはサーバーのルートまたは.well-knownサブディレクトリに配置できます。ファイル名に.jsonを追加しないでください。

AASAファイルをホストする際は、ファイルが以下のガイドラインに従っていることを確認してください。

  • HTTPSで提供されている。
  • application/json MIMEタイプを使用している。
  • 128 KBを超えていない(iOS 9.3.1以降の要件)

ユーザーがiOSデバイスでユニバーサルリンクをタップすると、デバイスはアプリを起動し、NSUserActivityオブジェクトを送信します。アプリはNSUserActivityオブジェクトをクエリして、どのように起動されたかを判断できます。

アプリでユニバーサルリンクをサポートするには、以下のステップを実行します。

  1. アプリがサポートするドメインを指定するエンタイトルメントを追加します。
  2. NSUserActivityオブジェクトを受信したときに適切に応答するようにアプリデリゲートを更新します。

Xcodeで、CapabilitiesタブのAssociated Domainsセクションを開き、アプリがサポートする各ドメインのエントリをapplinks:をプレフィックスとして追加します。例:applinks:www.mywebsite.com。

ユニバーサルリンクをメールに追加し、テストデバイスに送信します。ユニバーサルリンクをSafariのURLフィールドに直接貼り付けても、アプリは自動的に開きません。この方法の場合、手動でWebサイトを下にプルして、上部に該当するアプリを開くかどうかを尋ねるプロンプトが表示されるようにする必要があります。

以下のステップは、Androidの開発者向けドキュメントを基にしています。詳細については、Add Android App LinksとCreate Deep Links to App Contentを参照してください。

まず、Androidアプリのディープリンクを作成する必要があります。これは、AndroidManifest.xmlファイルにインテントフィルターを追加することで行えます。インテントフィルターには、VIEWアクションとBROWSABLEカテゴリ、およびデータ要素にWebサイトのURLを含める必要があります。

ステップ2:アプリをWebサイトに関連付ける

アプリをWebサイトに関連付ける必要があります。これは、Digital Asset Linksファイルを作成することで行えます。このファイルはJSON形式で、Webサイトへのリンクを開くことができるAndroidアプリの詳細が含まれています。Webサイトの.well-knownディレクトリに配置する必要があります。

ステップ3:アプリのマニフェストファイルを更新する

AndroidManifest.xmlファイルで、アプリケーション要素内にmeta-data要素を追加します。meta-data要素には、android:name属性に「asset_statements」を、android:resource属性にWebサイトのURLを含む文字列配列を持つリソースファイルを指定する必要があります。

Androidアプリで、受信するディープリンクを処理する必要があります。これは、アクティビティを開始したインテントを取得し、そこからデータを抽出することで行えます。

最後に、ディープリンクをテストできます。メッセージングアプリまたはメールでリンクを自分に送信し、クリックします。すべてが正しく設定されていれば、アプリが開くはずです。

メール送信パートナーは、クリックトラッキングドメインを使用してすべてのリンクをラップし、Brazeメールでのクリックトラッキング用のURLパラメーターを含めます。

たとえば、https://www.example.com のようなリンクは https://links.email.example.com/uni/wf/click?upn=abcdef123456… のようになります。

クリックトラッキング付きのメールリンクをユニバーサルリンクまたはApp Linksとして機能させるには、追加の設定が必要です。アプリが開くことを許可されているドメインとして、クリックトラッキングドメイン(links.email.example.com)を必ず追加してください。さらに、クリックトラッキングドメインはAASA(iOS)またはDigital Asset Links(Android)ファイルを配信する必要があります。これにより、クリックトラッキング付きのメールリンクがシームレスに動作するようになります。

すべてのクリックトラッキングリンクをユニバーサルリンクまたはApp Linkにしたくない場合は、メール送信パートナーに基づいてどのリンクをユニバーサルリンクにするかを指定できます。詳細については、以下のタブを参照してください。

SendGridのクリックトラッキングリンクをユニバーサルリンクとして扱うには:

  1. AASAまたはAndroidManifestのpathPrefix値を設定して、URLパスに/uni/を含むリンクのみをユニバーサルリンクとして扱うようにします。
  2. リンクのアンカータグ(<a>)に属性universal="true"を追加します。これにより、ラップされたリンクのURLパスに/uni/が含まれるようになります。

例:

<a href=”https://www.example.com” universal="true">
  1. アプリがラップされたリンクを適切に処理できるように設定されていることを確認してください。SendGridの記事「Resolving SendGrid Click Tracking Links」を参照し、お使いのオペレーティングシステムの手順に従ってください。この記事にはiOSとAndroidのサンプルコードが含まれています。

この設定により、URLパスに/uni/を含むリンクはユニバーサルリンクとして機能し、その他のすべてのリンクはWebリンクとして動作します。

SparkPostのクリックトラッキングリンクをユニバーサルリンクとして扱うには、メールのドラッグ&ドロップエディターの属性セクションに以下の属性を追加するか、リンクHTMLを手動で編集してリンクのアンカータグに以下の属性を含めます:data-msys-sublink="custom_path"。

このカスタムパスにより、その値を持つURLを選択的にユニバーサルリンクとして扱うことができます。

例:

<a href=”https://www.example.com” data-msys-sublink="open-in-app">

次に、アプリがカスタムパスを適切に処理できるように設定されていることを確認してください。SparkPostの記事「Using SparkPost click tracking on deep links」を参照してください。この記事にはiOSとAndroidのサンプルコードが含まれています。

カスタムパスを使用して、メールのクリックトラッキングURLにパスセグメントを追加します。これにより、モバイルオペレーティングシステムがユニバーサルリンクやApp Linksとして認識できる予測可能なURLパターンが作成されます。

ユーザーがモバイルデバイスでメールリンクをタップした場合、カスタムパスにより、リンクがメインのモバイルアプリ、専用アプリ、またはモバイルブラウザーのどれで開くかを制御できます(例:商品ページ、ロイヤルティプログラム、購読解除リンク、法的ページなど)。

Amazon SESのクリックトラッキングリンクをユニバーサルリンクまたはApp Linkとして扱うには:

  1. メールHTMLのアンカータグにses:custom-path属性を追加するか、メールのドラッグ&ドロップエディターの属性セクションで属性を追加します。カスタムパスはラップされたクリックトラッキングURLに挿入されます。

例:

<!-- Opens main shopping app -->
<a href="https://yourstore.com/product" ses:custom-path="shop">Shop Now</a>
<!-- Opens loyalty app -->
<a href="https://yourstore.com/rewards" ses:custom-path="rewards">My Rewards</a>
<!-- Opens specialized app -->
<a href="https://yourstore.com/limited" ses:custom-path="limited">Limited Edition</a>
<!-- Stays in browser -->
<a href="https://yourstore.com/unsubscribe" ses:no-track>Unsubscribe</a>

カスタムパスが以下の要件に従っていることを確認してください:

  • 形式: 英数字、ドット、アンダースコア、ハイフンのみ
  • 長さ: 1〜32文字
  • 大文字と小文字の区別: パスはモバイルOSの要件に合わせて大文字と小文字が区別されます
  1. ラップされたトラッキングURLにカスタムパスセグメントが含まれていることを確認します。属性がない場合、トラッキングリンクはtrack.yourstore.com/CL0/{encodedUrl}/...を使用します。属性がある場合、次の形式になります:track.yourstore.com/CL1/{customPath}/{encodedUrl}/...

例:

  • track.yourstore.com/CL1/shop/...
  • track.yourstore.com/CL1/rewards/...
  1. クリックトラッキングドメインでサイトアソシエーションファイルを設定し、パスが/CL1/{customPath}/に一致するようにします。

iOS(Apple App Site Association):

{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "TEAMID.com.yourcompany.mainapp",
      "paths": ["/CL1/shop/*", "/CL1/rewards/*"]
    }, {
      "appID": "TEAMID.com.yourcompany.limitedapp",
      "paths": ["/CL1/limited/*"]
    }]
  }
}

Android(Digital Asset Links):

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.yourcompany.mainapp",
    "sha256_cert_fingerprints": ["..."]
  }
}]

Androidではassetlinks.jsonではなく、アプリ内でパスを照合します。アプリが処理する各カスタムパスについて、AndroidManifest.xmlのインテントフィルターにandroid:pathPrefix="/CL1/{customPath}/"を設定してください。

アプリがこれらのラップされたリンクを処理できるように設定されていることを確認してください。クリックトラッキングドメインをアプリの関連ドメイン(iOS)またはインテントフィルター(Android)に追加し、この記事で前述したように、そのドメインにAASAまたはDigital Asset Linksファイルをホストしてください。

特定のリンクのクリックトラッキングを無効にするには、HTMLエディターではメールメッセージに、ドラッグ&ドロップエディターではHTMLブロックにHTMLコードを追加します。

SendGrid

メールサービスプロバイダー(ESP)がSendGridの場合、次のようにHTMLコードclicktracking=offを使用します:

<a clicktracking=off href="[INSERT https LINK HERE]">click here</a>

SparkPost

メールサービスプロバイダー(ESP)がSparkPostの場合、次のようにHTMLコードdata-msys-clicktrack="0"を使用します:

<a data-msys-clicktrack="0" href="[INSERT https LINK HERE]">click here</a>

Amazon SES

メールサービスプロバイダー(ESP)がAmazon SESの場合、次のようにHTMLコードses:no-trackを使用します:

<a ses:no-track href="[INSERT https LINK HERE]">click here</a>

ドラッグ&ドロップエディター

ドラッグ&ドロップメールエディターを使用する場合、リンクがテキスト、ボタン、または画像に添付されている場合は、HTMLコードをカスタム属性として入力します。

SendGrid

カスタム属性として以下を選択します:

  • Name: clicktracking
  • Value: off

SparkPost

カスタム属性として以下を選択します:

  • Name: data-msys-clicktrack
  • Value: 0

テキストリンクのカスタム属性。

ボタンまたは画像のカスタム属性

SendGrid

カスタム属性として以下を選択します:

  • Name: clicktracking
  • Value: off
  • Type: Link

SparkPost

カスタム属性として以下を選択します:

  • Name: data-msys-clicktrack
  • Value: 0
  • Type: Link

ボタンのカスタム属性。

メール内でユニバーサルリンクが期待どおりに動作しない場合(受信者がメールアプリからWebブラウザーに移動し、最終的にアプリにリダイレクトされるなど)、以下のヒントを参照してユニバーサルリンクの設定をトラブルシューティングしてください。

Outlookで[?it=または生のURLテキストが表示される

リンクが有効なhttp://またはhttps:// URLスキームを使用していない場合、Outlookはコールトゥアクションテキストとして[?it=を表示したり、hrefの一部を出力したりすることがあります。カスタムスキーム、スキームの欠落、または不正なURLはハイパーリンクとして扱われないため、クライアントは代わりに属性テキストを表示します。すべてのボタン、画像リンク、およびトラッキングURLが完全なhttps://(またはhttp://)宛先を使用していることを確認してください。これはユニバーサルリンクと標準Webリンクの両方に適用されます。

AASAファイル(iOS)またはDigital Asset Linksファイル(Android)が正しい場所にあることを確認します:

  • iOS: https://click.tracking.domain/.well-known/apple-app-site-association
  • Android: https://click.tracking.domain/.well-known/assetlinks.json

これらのファイルが常に公開アクセス可能であることを確認することが重要です。アクセスできない場合は、メール用のユニバーサルリンクの設定でステップを見逃している可能性があります。

ドメイン定義を確認する

アプリが開くことを許可されているドメインの定義が正しいことを確認します。

  • iOS: アプリのXcodeで設定されたAssociated Domainsを確認します(ステップ1c:XcodeプロジェクトでAssociated Domainsを有効にする)。クリックトラッキングドメインがそのリストに含まれていることを確認してください。
  • Android: アプリ情報ページを開きます(アプリアイコンを長押ししてⓘをクリック)。アプリ情報メニュー内でデフォルトで開くを見つけてタップします。アプリが開くことを許可されているすべての検証済みリンクが表示される画面が表示されます。クリックトラッキングドメインがそのリストに含まれていることを確認してください。

メール内のすべてのリンク(ブラウザーで開くことを期待しているリンクを含む)がアプリで開く場合、クリックトラッキングドメインのAASA paths(iOS)またはAndroid pathPrefixの値がドメイン全体に一致しています(例:*または/*)。

アプリで開くべきURLにのみパターンを制限してください。SendGridの場合は/uni/に一致させ、それらのリンクにのみuniversal="true"を追加します。ユニバーサルリンク、App Links、およびクリックトラッキングを参照してください。

トラッキングドメインが.well-knownファイルを配信できない

場合によっては、ESPの制限やインフラの制約により、クリックトラッキングドメインで必要な.well-knownファイルをホストできないことがあります。トラッキングドメインでAASAまたはDigital Asset Linksファイルをホストできない場合は、以下のオプションを検討してください:

  • ディープリンクURLのクリックトラッキングを選択的に無効にする: 特定のユニバーサルリンクのクリックトラッキングを無効にして、メインドメイン(AASAまたはDigital Asset Linksファイルをホストできる場所)に直接移動するようにできます。この方法では、それらの特定のリンクのクリック分析データが失われる可能性があることに注意してください。手順についてはリンク単位でのクリックトラッキングの無効化を参照してください。
  • トラッキングサブドメインの前にCDNを配置する: 完全なクリックトラッキングカバレッジとディープリンクが必要な場合は、トラッキングサブドメインの前にCDN(CloudflareやCloudFrontなど)を配置できます。CDNを設定して.well-knownファイルをローカルに配信し、その他すべてのトラフィックをESPにプロキシします。このアプローチはより複雑ですが、クリックトラッキングとユニバーサルリンクの両方を完全に制御できます。

ユニバーサルリンクまたはApp Linksが本番ワークスペースでは正しく機能するが、開発またはテストワークスペースでは失敗する場合、送信メールアドレスのドメインが各ワークスペースのメール設定で構成されたトラッキングドメインと一致していることを確認してください。ワークスペース間の設定が一貫していないと、同じメールテンプレートやAASA/Digital Asset Linksファイルを使用していても、リンクの動作が異なる場合があります。

メール設定を確認するには:

  1. Brazeダッシュボードで設定 > メール設定に移動します。
  2. 送信設定の下にある送信メール設定を確認します。
  3. リンクが機能していないワークスペースで、送信ドメインとトラッキングドメインが適切に整合していることを確認します。

送信ドメインがワークスペース間で異なる場合は、各ワークスペースに適切なDNSレコードが設定されていること、およびAASA(iOS)またはDigital Asset Links(Android)ファイルが各トラッキングドメインからアクセス可能であることを確認してください。

リンクごとの無効化属性は、追加した特定のHTMLアンカータグにのみ適用されます。リンクがまだトラッキングされているように見える場合の一般的な原因:

  • HTMLソースに属性がない — clicktracking=off(SendGrid)、data-msys-clicktrack="0"(SparkPost)、またはses:no-track(Amazon SES)が、プレビューだけでなくHTMLエディターソースの<a>タグに設定されていることを確認してください。
  • ドラッグ&ドロップのカスタム属性 — ドラッグ&ドロップエディターの場合、リンクのカスタム属性名と値がESPと一致していることを確認してください(リンク単位でのクリックトラッキングの無効化を参照)。
  • プレーンテキスト本文のURL — メッセージのプレーンテキスト部分からリンクをテストする場合、それらのURLはHTML専用の無効化属性を継承しない場合があります。テストメッセージを送信し、生のメールを検査して、ラップされたリンクがどの部分に含まれているかを確認してください。
New Stuff!