コンテンツにスキップ

ユニバーサルリンクと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ファイルで定義

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

これらのステップは、Apple開発者ドキュメントを基に作成されています。詳細については、アプリとWebサイトのコンテンツへのリンクを許可するを参照してください。

ステップ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サイトを設定する

WebサイトドメインをiOS上のネイティブアプリに関連付けるには、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(チームIDを取得するにはhttps://developer.apple.com/account/#/membership/にアクセスしてください)とBundle Identifierを組み合わせて作成します。この例では、「JHGFJHHYX」がチームIDで、「com.facebook.ios」がバンドルIDです。
  • paths:関連付けに含めるまたは除外するパスを指定する文字列の配列です。パスの前にNOTを使用してパスを無効にできます。この例では、このパス上のすべてのリンクは、アプリを開く代わりにWebに移動します。ディレクトリ内のすべてのパスを有効にするには*をワイルドカードとして使用し、1文字に一致させるには?を使用します(例:/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/jsonMIMEタイプを使用する。
  • 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開発者ドキュメントを基に作成されています。詳細については、Android App Linksを追加するおよびアプリコンテンツへのディープリンクを作成するを参照してください。

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

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

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

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

AndroidManifest.xmlファイルで、applicationエレメント内に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

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

  • 名前: clicktracking
  • 値: off

SparkPost

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

  • 名前: data-msys-clicktrack
  • 値: 0

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

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

SendGrid

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

  • 名前: clicktracking
  • 値: off
  • 種類: Link

SparkPost

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

  • 名前: data-msys-clicktrack
  • 値: 0
  • 種類: Link

ボタンのカスタム属性。

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

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

Outlookでは、リンクが有効な http:// または https:// URLスキームを使用していない場合、コールトゥアクションテキストとして [?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など)を配置できます。.well-known ファイルをローカルで配信し、その他のすべてのトラフィックをESPにプロキシするようにCDNを設定します。このアプローチはより複雑ですが、クリックトラッキングとユニバーサルリンクの両方を完全に制御できます。

ユニバーサルリンクまたは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!