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
}

Brazeダッシュボードでのディープリンク設定の例。

ユニバーサルリンク

ユニバーサルリンクを使用するには、登録済みのドメインがアプリの機能に追加され、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の要件を満たすようにすることで、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 にデリゲートオブジェクトを渡します。その後、BrazeはURIを処理する前にデリゲートの 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!