Skip to content

ディープリンク

ディープリンクは、ネイティブアプリを起動したり、特定のコンテンツを表示したり、特定のアクションを実行したりするリンクを提供する手段です。iOS アプリにディープリンクを初めて実装する場合は、次のステップに従ってください。

ディープリンクに関する一般情報については、よくある質問の記事を参照してください。

ステップ 1:スキームの登録

ディープリンクを処理するには、Info.plist ファイルにカスタムスキームを記述する必要があります。ナビゲーション構造はディクショナリの配列によって定義されます。これらの各ディクショナリには、文字列の配列が含まれています。

Xcode を使用して Info.plist ファイルを編集します。

  1. 新しいキー URL types を追加します。Xcode では、これが自動的に Item 0 というディクショナリを含む配列になります。
  2. Item 0 内に、キー URL identifier を追加します。カスタムスキームに値を設定します。
  3. Item 0 内に、キー URL Schemes を追加します。これは、自動的に Item 0 文字列を含む配列になります。
  4. URL Schemes » Item 0 をカスタムスキームに設定します。

また、Info.plist ファイルを直接編集する場合は、次の仕様に従うこともできます。

1
2
3
4
5
6
7
8
9
10
11
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>YOUR.SCHEME</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>YOUR.SCHEME</string>
        </array>
    </dict>
</array>

ステップ2:スキーム許可リストの追加

LSApplicationQueriesSchemes キーをアプリの Info.plist ファイルに追加して、canOpenURL(_:) に渡す URL スキームを宣言する必要があります。この許可リストに含まれないスキームを呼び出そうとすると、デバイスのログにエラーが記録され、ディープリンクは開かれません。以下はこのエラーの例です。

1
<Warning>: -canOpenURL: failed for URL: "yourapp://deeplink" – error: "This app is not allowed to query for scheme yourapp"

たとえば、アプリ内メッセージをタップしたときに Facebook アプリが開かれるようにするには、アプリの許可リストに Facebook カスタムスキーム (fb) が含まれている必要があります。含まれていないと、ディープリンクが拒否されます。自分のアプリ内のページやビューに誘導するディープリンクでも、アプリのカスタムスキームがアプリの Info.plist に含まれている必要があります。

以下は許可リストの例です。

1
2
3
4
5
6
<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myapp</string>
    <string>fb</string>
    <string>twitter</string>
</array>

詳細については、LSApplicationQueriesSchemes キーに関する Apple のドキュメントを参照してください。

ステップ 3: ハンドラの実装

アプリをアクティブにすると、iOS でメソッド application:openURL:options: が呼び出されます。重要な引数は NSURL オブジェクトです。

1
2
3
4
5
6
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  let query = url.query
  // Insert your code here to take some action based upon the path and query.
  return true
}
1
2
3
4
5
6
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  NSString *path  = [url path];
  NSString *query = [url query];
  // Insert your code here to take some action based upon the path and query.
  return YES;
}

アプリトランスポートセキュリティ (ATS)

ATS の要件

Apple のドキュメントから:「アプリトランスポートセキュリティは、アプリと Web サービス間の接続のセキュリティを向上させる機能です。この機能は、安全な接続のベストプラクティスに準拠したデフォルトの接続要件で構成されています。アプリでこのデフォルト動作を無効にして、トランスポートセキュリティを無効にできます。」

ATS はデフォルトで適用されます。すべての接続が HTTPS を使用し、TLS 1.2を使用して暗号化され、前方秘匿性が確保される必要があります。詳細については、ATS を使用して接続するための要件を参照してください。Braze によりエンドデバイスに提供されるすべての画像は、TLS 1.2をサポートし、ATS と互換性のあるコンテンツ配信ネットワーク (「CDN」) によって処理されます。

アプリケーションの Info.plist で例外として指定されていない限り、これらの要件に従わない接続は次のようなエラーにより失敗します。

1
2
CFNetwork SSLHandshake failed (-9801)
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred, and a secure connection to the server cannot be made."
1
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

ATS コンプライアンスは、モバイルアプリ内で開かれたリンク (クリックされたリンクのデフォルト処理) に適用され、Web ブラウザーから外部で開かれたサイトには適用されません。

ATS 要件の処理

ATS は、次の3つの方法のいずれかで処理できます。

すべてのリンクが ATS に準拠するようにする (推奨)

(アプリ内メッセージやプッシュキャンペーンなどから) ユーザーを誘導する既存のリンクが ATS の要件を満たすようにすることで、Braze 統合が ATS 要件を満たすことができます。ATS の制限を回避する方法はありますが、リンクされたすべての URL が ATS に準拠するようにすることをお勧めします。Apple がアプリケーションのセキュリティをこれまで以上に重視していることを考えると、ATS の例外を許可する以下のアプローチが Apple によってサポートされる保証はありません。

ATS を一部無効にする

特定のドメインやスキームのリンクのサブセットを ATS ルールの例外として処理することを許可できます。Braze メッセージングチャネルで使用するすべてのリンクが ATS に準拠しているか、例外として処理されている場合、Braze 統合は ATS 要件を満たします。

ATS の例外としてドメインを追加するには、アプリの Info.plist ファイルに以下を追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

詳細については、アプリトランスポートセキュリティのキーに関する Apple の記事を参照してください。

ATS を完全に無効にする

ATS を完全に無効にできます。ただし、セキュリティ保護が失われることと、将来の iOS との互換性の両方を考慮して、この処理は推奨されないことに注意してください。ATS を無効にするには、アプリの Info.plist ファイルに以下を挿入します。

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

URL エンコーディング

SDK では、有効な URL を作成するためにリンクをパーセントエンコードします。適切な形式の URL で使用できないリンク文字 (ユニコード文字など) は、すべてパーセントエスケープされます。

エンコードされたリンクをデコードするには、String プロパティ removingPercentEncoding を使用します。また、BrazeDelegate.braze(_:shouldOpenURL:)true を返す必要があります。アプリによる URL の処理をトリガーするには、アクションの呼び出しが必要です。

以下はその例です。

1
2
3
4
5
  func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let urlString = url.absoluteString.removingPercentEncoding
    // Handle urlString
    return true
  }
1
2
3
4
5
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
  NSString *urlString = [url.absoluteString stringByRemovingPercentEncoding];
  // Handle urlString
  return YES;
}

アプリ設定へのディープリンク

UIApplicationOpenSettingsURLString を利用して、Braze のプッシュ通知、アプリ内メッセージ、ニュースフィードからアプリの設定にユーザーをディープリンクできます。

ユーザーをアプリから iOS 設定に移動させる手順は以下のとおりです。

  1. まず、アプリケーションがスキームベースのディープリンクまたはユニバーサルリンク用に設定されていることを確認します。
  2. [設定] ページへのディープリンクの URI (myapp://settingshttps://www.braze.com/settings など) を決定します。
  3. カスタムスキームベースのディープリンクを使用している場合は、application:openURL:options: メソッドに次のコードを追加します。
1
2
3
4
5
6
7
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
  let path = url.path
  if (path == "settings") {
    UIApplication.shared.openURL(URL(string:UIApplication.openSettingsURLString)!)
  }
  return true
}
1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
  NSString *path  = [url path];
  if ([path isEqualToString:@"settings"]) {
    NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    [[UIApplication sharedApplication] openURL:settingsURL];
  }
  return YES;
}

カスタマイズ

デフォルト WebView のカスタマイズ

一般的に Web ディープリンクに対して [アプリ内で Web URL を開く] が選択されている場合、Braze.WebViewController クラスには SDK によって開かれる Web URL が表示されます。

Braze.WebViewController は、BrazeDelegate.braze(_:willPresentModalWithContext:) デリゲートメソッドを使用してカスタマイズできます。

リンク処理のカスタマイズ

BrazeDelegate プロトコルを使用して、ディープリンク、Web URL、ユニバーサルリンクなどの URL の処理をカスタマイズできます。Braze の初期化中にデリゲートを設定するには、Braze インスタンスでデリゲートオブジェクトを設定します。その後、URI を処理する前に Braze で shouldOpenURL のデリゲートの実装が呼び出されます。

ユニバーサルリンク

Braze では、プッシュ通知、アプリ内メッセージ、コンテンツカードでユニバーサルリンクがサポートされています。ユニバーサルリンクのサポートを有効にするには、configuration.forwardUniversalLinkstrue に設定する必要があります。

有効にすると、application:continueUserActivity:restorationHandler: メソッドを使用して Braze からアプリのAppDelegate にユニバーサルリンクが転送されます。

また、ユニバーサルリンクを処理するようアプリケーションを設定する必要があります。Apple のドキュメントを参照し、アプリケーションがユニバーサルリンクに関して正しく設定されていることを確認してください。

統合の例: BrazeDelegate

1
2
3
4
5
6
7
8
func braze(_ braze: Braze, shouldOpenURL context: Braze.URLContext) -> Bool {
  if context.url.host == "MY-DOMAIN.com" {
    // Custom handle link here
    return false
  }
  // Let Braze handle links otherwise
  return true
}
1
2
3
4
5
6
7
8
- (BOOL)braze:(Braze *)braze shouldOpenURL:(BRZURLContext *)context {
  if ([[context.url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
    // Custom handle link here
    return NO;
  }
  // Let Braze handle links otherwise
  return YES;
}

詳細については、BrazeDelegate を参照してください。

「このページはどの程度役に立ちましたか?」
New Stuff!