Skip to content


iOS のディープリンク

ディープリンクの基本情報については、ユーザーガイドの記事を参照してください。Braze アプリにディープリンクを初めて実装する場合は、以下の手順で開始できます。

ステップ 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:カスタムスキームを許可リストに登録する (iOS 9 以降)

iOS 9 以降では、アプリが開くことを許可されているカスタムスキームの許可リストが必要です。このリストに含まれないスキームを呼び出そうとすると、デバイスのログにエラーが記録され、ディープリンクは開かれません。以下はこのエラーの例です。

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

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

アプリがディープリンクする必要があるすべてのスキームを、キー LSApplicationQueriesSchemes を使用してアプリの Info.plist の許可リストに追加する必要があります。以下に例を示します。

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

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

ステップ 3:ハンドラを実装する

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

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];
  // Here you should insert code to take some action based upon the path and query.
  return YES;
}
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
  // Here you should insert code to take some action based upon the path and query.
  return true
}

ユニバーサルリンク

ユニバーサルリンクを使用するには、登録済みのドメインがアプリの機能に追加され、apple-app-site-association ファイルがアップロードされていることを確認してください。その後で、メソッド application:continueUserActivity:restorationHandler:AppDelegate に実装します。以下に例を示します。

1
2
3
4
5
6
7
8
9
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
  restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
  if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
    NSURL *url = userActivity.webpageURL;
    // Handle url
  }
  return YES;
}
1
2
3
4
5
6
7
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
  if (userActivity.activityType == NSUserActivityTypeBrowsingWeb) {
    let url = userActivity.webpageURL
    // Handle url
  }
  return true
}

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

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

iOS 9 では、アプリ内メッセージやプッシュ通知に埋め込まれた Web URL に影響を与える破壊的変更が導入されました。

ATS の要件

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

ATS は iOS 9 以降にデフォルトで適用されます。すべての接続が 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 によってサポートされる保証はありません。

SSL ツールにより、Web サーバーのセキュリティの問題を正確に特定できます。この Qualys, Inc. の SSL サーバーテストは、Apple ATS 9 および iOS 9 への準拠に特化した項目を提供します。

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>

ATS エラーをデバッグする方法の詳細については、Shipping an App With App Transport Security を参照してください。

URL エンコーディング

Braze iOS SDK v2.21.0 以降、SDK はリンクをパーセントエンコードして有効な NSURL を作成します。適切な形式の URL で使用できないリンク文字 (Unicode 文字など) は、すべてパーセントエスケープされます。

エンコードされたリンクをデコードするには、NSString メソッド stringByRemovingPercentEncoding を使用します。また、ABKURLDelegateYES を返す必要があり、アプリによる URL の処理をトリガーするには、CTA が必要です。以下に例を示します。

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;
}
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
  }

カスタマイズ

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

カスタマイズ可能な ABKModalWebViewController クラスは、通常 Web ディープリンクに対して「アプリ内で Web URL を開く」が選択されている場合に、SDK によって開かれる Web URL を表示します。

ABKModalWebViewController クラスのカテゴリを宣言するか、直接変更して、Web ビューにカスタマイズを適用できます。詳細については、このクラスの .h ファイル.m ファイルをご確認ください。

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

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

統合の例:ABKURLDelegate

1
2
3
4
5
6
7
8
- (BOOL)handleAppboyURL:(NSURL *)url fromChannel:(ABKChannel)channel withExtras:(NSDictionary *)extras {
  if ([[url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
    // Custom handle link here
    return YES;
  }
  // Let Braze handle links otherwise
  return NO;
}
1
2
3
4
5
6
7
8
func handleAppboyURL(_ url: URL?, from channel: ABKChannel, withExtras extras: [AnyHashable : Any]?) -> Bool {
  if (url.host == "MY-DOMAIN.com") {
    // Custom handle link here
    return true;
  }
  // Let Braze handle links otherwise
  return false;
}

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

よくあるユースケース

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

iOS は、アプリから iOS 設定アプリケーションのページにユーザーを誘導できます。UIApplicationOpenSettingsURLString を利用して、プッシュ通知やアプリ内メッセージから設定にユーザーをディープリンクできます。

  1. まず、アプリケーションがスキームベースのディープリンクまたはユニバーサルリンク用に設定されていることを確認します。
  2. 設定ページへのディープリンクの URI (myapp://settingshttps://www.braze.com/settings など) を決定します。
  3. カスタムスキームベースのディープリンクを使用している場合は、application:openURL:options: メソッドに次のコードを追加します。
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;
}
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:UIApplicationOpenSettingsURLString)!)
  }
  return true
}
New Stuff!