This page references our older Objective-C SDK. Check out our new Swift SDK to integrate our latest Swift-first library.
iOS のディープリンク
ディープリンクの基本情報については、ユーザーガイドの記事を参照してください。Braze アプリにディープリンクを初めて実装する場合は、以下の手順で開始できます。
この記事には、廃止予定のニュースフィードの情報が含まれています。Braze では、ニュースフィードツールを利用しているお客様に、コンテンツカードのメッセージングチャネルへの移行をお勧めしています。移行により、柔軟性、カスタマイズ性、信頼性が向上します。詳細については、移行ガイドをご覧ください。
ステップ 1:スキームを登録する
Info.plist
ファイルでカスタムスキームを記述する必要があります。ナビゲーション構造はディクショナリの配列によって定義されます。これらの各ディクショナリには、文字列の配列が含まれています。
Xcode を使用して Info.plist
ファイルを編集します。
- 新しいキー
URL types
を追加します。Xcode では、これが自動的にItem 0
というディクショナリを含む配列になります。 Item 0
内に、キーURL identifier
を追加します。カスタムスキームに値を設定します。Item 0
内に、キーURL Schemes
を追加します。これは、自動的にItem 0
文字列を含む配列になります。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
に含まれている必要があります。
アプリがディープリンクする必要があるすべてのスキームを、キー 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 を参照してください。
デフォルトのユニバーサルリンク統合は、Braze プッシュ通知、アプリ内メッセージ、またはニュースフィードと互換性がありません。アプリケーション内のユニバーサルリンクを処理するには、「リンクのカスタマイズを」を参照してください。または、プッシュ通知、アプリ内メッセージ、ニュースフィードでスキームベースのディープリンクを使用することをお勧めします。
アプリトランスポートセキュリティ (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 エラーをデバッグする方法の詳細については、アプリトランスポートセキュリティを使用したアプリの配布 を参照してください。
URL エンコーディング
Braze iOS SDK v2.21.0 以降、SDK はリンクをパーセントエンコードして有効な NSURL
を作成します。適切な形式の URL で使用できないリンク文字 (ユニコード文字など) は、すべてパーセントエスケープされます。
エンコードされたリンクをデコードするには、NSString
メソッド stringByRemovingPercentEncoding
を使用します。また、ABKURLDelegate
の YES
を返す必要があり、アプリによる 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 のカスタマイズ
一般的に Web ディープリンクに対して [アプリ内で Web URL を開く] が選択されている場合、カスタマイズ可能な ABKModalWebViewController
クラスには SDK によって開かれる Web URL が表示されます。
ABKModalWebViewController
クラスのカテゴリを宣言するか、直接変更して、Web ビューにカスタマイズを適用できます。詳細については、このクラスの .h ファイルと .m ファイルをご確認ください。
リンク処理のカスタマイズ
ABKURLDelegate
プロトコルを使用して、ディープリンク、Web URL、ユニバーサルリンクなどの URL の処理をカスタマイズできます。Braze の初期化中にデリゲートを設定するには、デリゲートオブジェクトを `startWithApiKey:inApplication:withAppboyOptions:` の appboyOptions
で ABKURLDelegateKey
に渡します。その後、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
を利用して、プッシュ通知、アプリ内メッセージ、ニュースフィードから設定にユーザーをディープリンクできます。
- まず、アプリケーションが スキームベースのディープリンク または ユニバーサルリンク 用に設定されていることを確認します。
- [設定] ページへのディープリンクの URI (
myapp://settings
やhttps://www.braze.com/settings
など) を決定します。 - カスタムスキームベースのディープリンクを使用している場合は、
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
}