
AppboyKit(OBJECTIVE-C SDKとも呼ばれます)はサポートが終了しており、Swift SDKに置き換えられました。新機能、バグ修正、セキュリティ更新、テクニカルサポートは提供されません。ただし、メッセージングと分析は引き続き通常どおり機能します。詳しくは、新しいBraze Swift SDKの紹介を参照してください。
Braze iOS SDK 統合ガイド
このオプションのiOS統合ガイドでは、iOS SDKとそのコアコンポーネントを初めてアプリケーションに統合する際のセットアップのベストプラクティスについて段階的に説明します。このガイドは、
BrazeManager.swiftヘルパーファイルを作成する際に役立ちます。このヘルパーファイルは、Braze iOS SDKへの依存関係をプロダクションコードの残りの部分から切り離し、アプリケーション全体でimport AppboyUIを1か所だけにします。このアプローチにより、過剰なSDKインポートから発生する問題が軽減され、コードの追跡、デバッグ、および変更が容易になります。

連携の概要
以下の手順では、プロダクションコードが呼び出す BrazeManager ヘルパーファイルの構築方法について説明します。このヘルパーファイルは、以下の連携トピックに対応するさまざまなエクステンションを追加することで、Braze関連のすべての依存関係を処理します。各トピックには、SwiftとObjective-Cの両方の水平タブステップとコードスニペットが含まれています。Content Cardsとアプリ内メッセージのステップは、アプリケーションでこれらのチャネルを使用する予定がない場合、連携に必須ではありません。
- BrazeManager.swiftの作成
- SDKの初期化
- プッシュ通知
- ユーザー変数とメソッドへのアクセス
- 分析のログ記録
- アプリ内メッセージ(オプション)
- Content Cards(オプション)
- 次のステップ
BrazeManager.swiftの作成
BrazeManager.swiftの作成
BrazeManager.swift ファイルを構築するには、プロジェクト内の任意の場所に BrazeManager という名前の新しいSwiftファイルを作成して追加します。次に、import Foundation を SPMの場合は import AppboyUI(CocoaPodsの場合は import Appboy_iOS_SDK)に置き換え、すべてのBraze関連のメソッドと変数をホストする BrazeManager クラスを作成します。Appboy_iOS_SDK

BrazeManagerは構造体ではなくNSObjectクラスであるため、ABKInAppMessageUIDelegateなどのABKデリゲートに準拠できます。BrazeManagerは設計上シングルトンクラスであり、このクラスのインスタンスは1つだけ使用されます。これはオブジェクトへの統一されたアクセスポイントを提供するためです。
BrazeManagerクラスを初期化する shared という名前の静的変数を追加します。これは一度だけ遅延初期化されることが保証されています。- 次に、apiKey という名前のプライベート定数変数を追加し、BrazeダッシュボードのワークスペースからAPIキー値として設定します。
- SDKの設定値を格納する appboyOptions という名前のプライベート算出変数を追加します。現時点では空になります。
class BrazeManager: NSObject {
// 1
static let shared = BrazeManager()
// 2
private let apikey = "YOUR-API-KEY"
// 3
private var appboyOptions: [String:Any] {
return [:]
}
}
@implementation BrazeManager
// 1
+ (instancetype)shared {
static BrazeManager *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[BrazeManager alloc] init];
// Do any other initialisation stuff here
});
return shared;
}
// 2
- (NSString *)apiKey {
return @"YOUR-API-KEY";
}
// 3
- (NSDictionary *)appboyOptions {
return [NSDictionary dictionary];
}
SDKの初期化
BrazeManager.swiftからSDKを初期化する
次に、SDKを初期化する必要があります。このガイドでは、すでにXcodeプロジェクトにSDKを追加していることを前提としています。また、Info.plist ファイルまたは appboyOptions にワークスペースSDKエンドポイントとLogLevelが設定されている必要があります。
AppDelegate.swift ファイルの didFinishLaunchingWithOptions メソッドを、BrazeManager.swift ファイルに戻り値型なしで追加します。BrazeManager.swift ファイルに同様のメソッドを作成することで、AppDelegate.swift ファイルに import AppboyUI ステートメントが不要になります。
次に、新しく宣言した apiKey と appboyOptions 変数を使用してSDKを初期化します。

初期化はメインスレッドで行う必要があります。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
Appboy.start(withApiKey: apikey, in: application, withLaunchOptions: launchOptions, withAppboyOptions: appboyOptions)
}
- (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Appboy startWithApiKey:[self apiKey] inApplication:application withLaunchOptions:launchOptions withAppboyOptions:[self appboyOptions]];
}

コードをコンパイルし、アプリケーションを実行してください。
この時点で、SDKが起動して動作しているはずです。ダッシュボードでセッションがログ記録されていることを確認してから、先に進んでください。
プッシュ通知
プッシュ証明書の追加
Brazeダッシュボードの既存のワークスペースに移動します。プッシュ通知設定でプッシュ証明書ファイルをBrazeダッシュボードにアップロードし、保存します。


このステップの最後にある専用のチェックポイントを見逃さないでください!
プッシュ通知の登録
次に、プッシュ通知を登録します。このガイドでは、Apple開発者ポータルとXcodeプロジェクトでプッシュ認証情報を正しく設定していることを前提としています。
プッシュ通知を登録するコードは、BrazeManager.swift ファイルの didFinishLaunching... メソッドに追加されます。初期化コードは最終的に以下のようになります:
- ユーザーとの対話のための認証リクエストの内容を設定します。これらのオプションは例として記載されています。
- ユーザーにプッシュ通知を送信するための認証をリクエストします。ユーザーのプッシュ通知の許可または拒否の応答は
granted変数で追跡されます。 - ユーザーが通知プロンプトに対話した後、プッシュ認証結果をBrazeに転送します。
- APNsへの登録プロセスを開始します。これはメインスレッドで行う必要があります。登録が成功した場合、アプリは
AppDelegateオブジェクトのdidRegisterForRemoteNotificationsWithDeviceTokenメソッドを呼び出します。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?) {
Appboy.start(withAPIKey: apikey, in: application, withLaunchOptions: launchOptions, withAppboyOptions: appboyOptions)
// 1
let options: UNAuthorizationOptions = [.alert, .sound, .badge]
// 2
UNUserNotificationCenter.current().requestAuthorization(option: options) { (granted, error) in
// 3
Appboy.sharedInstance()?.pushAuthorization(fromUserNotificationCenter: granted)
}
// 4
UIApplications.shared.registerForRemoteNotificiations()
}
- (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Appboy startWithApiKey:[self apiKey] inApplication:application withLaunchOptions:launchOptions withAppboyOptions:[self appboyOptions]];
// 1
UNAuthorizationOptions options = (UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
// 2
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) {
// 3
[[Appboy sharedInstance] pushAuthorizationFromUserNotificationCenter:granted];
}];
// 4
[[UIApplication sharedApplication] registerForRemoteNotifications];
}

コードをコンパイルし、アプリケーションを実行してください。
- アプリでプッシュ通知のプロンプトが表示されていることを確認してから、先に進んでください。
- プロンプトが表示されない場合は、アプリを削除して再インストールし、プッシュ通知のプロンプトが以前に表示されていないことを確認してください。
先に進む前に、プッシュ通知のプロンプトが表示されていることを確認してください。
プッシュ通知メソッドの転送
次に、Braze iOS SDKで処理されるように、システムのプッシュ通知メソッドを AppDelegate.swift から BrazeManager.swift に転送します。
ステップ1: プッシュ通知コードのエクステンションを作成する
ヘルパーファイルで提供される目的がより整理された方法で読めるように、BrazeManager.swift ファイルにプッシュ通知コードのエクステンションを作成します:
AppDelegateにimport AppboyUIステートメントを含めないパターンに従い、BrazeManager.swiftファイルでプッシュ通知メソッドを処理します。ユーザーのデバイストークンはdidRegisterForRemote...メソッドからBrazeに渡す必要があります。このメソッドはサイレントプッシュ通知の実装に必要です。次に、AppDelegateと同じメソッドをBrazeManagerクラスに追加します。- メソッド内に以下の行を追加して、デバイストークンをBrazeに登録します。これはBrazeがトークンを現在のデバイスに関連付けるために必要です。
// MARK - Push Notifications
extension BrazeManager {
// 1
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
// 2
Appboy.sharedInstance().?registerDeviceToken(deviceToken)
}
}
// MARK - Push Notifications
// 1
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// 2
[[Appboy sharedInstance] registerDeviceToken:deviceToken];
}
ステップ2: リモート通知のサポート
Signing & Capabilities タブで、Background Modes サポートを追加し、Remote notifications を選択して、Brazeから発信されるリモートプッシュ通知のサポートを開始します。
ステップ3: リモート通知の処理
Braze SDKは、Brazeから発信されるリモートプッシュ通知を処理できます。リモート通知をBrazeに転送してください。SDKはBrazeから発信されていないプッシュ通知を自動的に無視します。プッシュ通知エクステンション内の BrazeManager.swift ファイルに以下のメソッドを追加します。
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
Appboy.sharedInstance()?.register(
application,
didReceiveRemoteNotification: userInfo,
fetchCompletionHandler: completionHandler
)
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[[Appboy sharedInstance] registerApplication:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
ステップ4: 通知レスポンスの転送
Braze SDKは、Brazeから発信されるプッシュ通知のレスポンスを処理できます。通知のレスポンスをBrazeに転送してください。SDKはBrazeから発信されていないプッシュ通知からのレスポンスを自動的に無視します。以下のメソッドを BrazeManager.swift ファイルに追加します:
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
Appboy.sharedInstance()?.userNotificationCenter(
center,
didReceive: response,
withCompletionHandler: completionHandler
)
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(void (^)(void))completionHandler {
[[Appboy sharedInstance] userNotificationCenter:center
didReceiveNotificationResponse:response
withCompletionHandler:completionHandler];
}

コードをコンパイルし、アプリケーションを実行してください。
Brazeダッシュボードから自分にプッシュ通知を送信し、先に進む前にプッシュ通知から分析がログ記録されていることを確認してください。
ユーザー変数とメソッドへのアクセス
ユーザー変数とメソッドの作成
次に、ABKUser の変数とメソッドに簡単にアクセスできるようにします。ヘルパーファイルで提供される目的がより整理された方法で読めるように、BrazeManager.swift ファイルにユーザーコードのエクステンションを作成します:
ABKUserオブジェクトは、iOSアプリケーション内の既知のまたは匿名のユーザーを表します。ABKUserを取得するための算出変数を追加します。この変数はユーザーに関する変数を取得するために再利用されます。- ユーザー変数をクエリして
userIdに簡単にアクセスします。ABKUserオブジェクトが担当する他の変数には(firstName、lastName、phone、homeCityなど)があります。 - 対応する
userIdでchangeUser()を呼び出してユーザーを設定します。
// MARK: - User
extension BrazeManager {
// 1
var user: ABKUser? {
return Appboy.sharedInstance()?.user
}
// 2
var userId: String? {
return user?.userID
}
// 3
func changeUser(_ userId: String) {
Appboy.sharedInstance()?.changeUser(userId)
}
}
// MARK: - User
// 1
- (ABKUser *)user {
return [[Appboy sharedInstance] user];
}
// 2
- (NSString *)userId {
return [self user].userID;
}
// 3
- (void)changeUser:(NSString *)userId {
[[Appboy sharedInstance] changeUser:userId];
}

コードをコンパイルし、アプリケーションを実行してください。
サインイン/サインアップの成功からユーザーを識別してみてください。適切なユーザー識別子とそうでないものについてしっかりと理解しておいてください。
ダッシュボードでユーザー識別子がログ記録されていることを確認してから、先に進んでください。
分析のログ記録
カスタムイベントのログ記録メソッドの作成
以下のBraze SDKの logCustomEvent メソッドに基づいて、対応するメソッドを作成します。
Brazeの logCustomEvent リファレンスメソッド
これは設計上、BrazeManager.swift ファイルのみがBraze iOS SDKのメソッドに直接アクセスできるためです。したがって、対応するメソッドを作成することで、プロダクションコードでBraze iOS SDKへの直接的な依存関係なしに同じ結果が得られます。
open func logCustomEvent(_ eventName: String, withProperties properties: [AnyHashable : Any]?)
対応するメソッド
Appboy オブジェクトからBrazeにカスタムイベントをログ記録します。Properties はデフォルト値がnilのオプションパラメータです。カスタムイベントにはプロパティは必須ではありませんが、名前は必須です。
func logCustomEvent(_ eventName: String, withProperties properties: [AnyHashable: Any]? = nil) {
Appboy.sharedInstance()?.logCustomEvent(eventName, withProperties: properties)
}
- (void)logCustomEvent:(NSString *)eventName withProperties:(nullable NSDictionary *)properties {
[[Appboy sharedInstance] logCustomEvent:eventName withProperties:properties];
}
カスタム属性のログ記録メソッドの作成
SDKはカスタム属性として多数の型をログ記録できます。設定可能な各値型のヘルパーメソッドを作成する必要はありません。代わりに、適切な値にフィルタリングできる1つのメソッドのみを公開します。
- (BOOL)setCustomAttributeWithKey:(NSString *)key andBOOLValue:(BOOL)value;
- (BOOL)setCustomAttributeWithKey:(NSString *)key andIntegerValue:(NSIntenger)value;
- (BOOL)setCustomAttributeWithKey:(NSString *)key andDoubleValue:(double)value;
- (BOOL)setCustomAttributeWithKey:(NSString *)key andStringValue:(NSString *)value;
- (BOOL)setCustomAttributeWithKey:(NSString *)key andDateValue:(NSDate *)value;
カスタム属性は ABKUser オブジェクトからログ記録されます。
属性に設定できるすべての利用可能な型を網羅する1つのメソッドを作成します。このメソッドを BrazeManager.swift ファイルの分析エクステンションに追加します。有効なカスタム属性型をフィルタリングし、一致する型に関連付けられたメソッドを呼び出すことで実現できます。
- パラメータ
valueはEquatableプロトコルに準拠するジェネリック型です。これは明示的に行われており、Braze iOS SDKが期待する型でない場合、コンパイル時エラーが発生します。 - パラメータ
keyとvalueはオプションパラメータであり、メソッド内で条件付きアンラップされます。これはnil以外の値がBraze iOS SDKに渡されることを保証する1つの方法です。
func setCustomAttributeWithKey<T: Equatable>(_ key: String?, andValue value: T?) {
guard let key = key, let value = value else { return }
switch value.self {
case let value as Date:
user?.setCustomAttributeWithKey(key, andDateValue: value)
case let value as Bool:
user?.setCustomAttributeWithKey(key, andBOOLValue: value)
case let value as String:
user?.setCustomAttributeWithKey(key, andStringValue: value)
case let value as Double:
user?.setCustomAttributeWithKey(key, andDoubleValue: value)
case let value as Int:
user?.setCustomAttributeWithKey(key, andIntegerValue: value)
default:
return
}
}
- (void)setCustomAttributeWith:(NSString *)key andValue:(id)value {
if ([value isKindOfClass:[NSDate class]]) {
[[self user] setCustomAttributeWithKey:key andDateValue:value];
} else if ([value isKindOfClass:[NSString class]]) {
[[self user] setCustomAttributeWithKey:key andStringValue:value];
} else if ([value isKindOfClass:[NSNumber class]]) {
if (strcmp([value objCType], @encode(double)) == 0) {
[[self user] setCustomAttributeWithKey:key andDoubleValue:[value doubleValue]];
} else if (strcmp([value objCType], @encode(int)) == 0) {
[[self user] setCustomAttributeWithKey:key andIntegerValue:[value integerValue]];
} else if ([value boolValue]) {
[[self user] setCustomAttributeWithKey:key andBOOLValue:[value boolValue]];
}
}
}
購入のログ記録メソッドの作成
次に、以下のBraze SDKの logPurchase メソッドに基づいて、対応するメソッドを作成します。
Brazeの logPurchase リファレンスメソッド
これは設計上、BrazeManager.swift ファイルのみがBraze iOS SDKのメソッドに直接アクセスできるためです。したがって、対応するメソッドを作成することで、プロダクションコードでBraze iOS SDKへの直接的な依存関係なしに同じ結果が得られます。
open func logPurchase(_ productIdentifier: String, inCurrency currency: String, atPrice price: NSDecimalNumber, withoutQuantity quantity: UInt)
対応するメソッド
Appboy オブジェクトからBrazeに購入をログ記録します。SDKには購入をログ記録するための複数のメソッドがあり、これはその一例です。このメソッドは NSDecimal と UInt オブジェクトの作成も処理します。その部分をどのように処理するかはお客様次第です。ここでは一例を示しています。
func logPurchase(_ productIdentifier: String, inCurrency currency: String, atPrice price:
String, withQuantity quantity: Int) {
Appboy.sharedInstance()?.logPurchase(productIdentifier, inCurrency: currency, atPrice: NSDecimalNumber(string: price), withQuantity: UInt(quantity))
}
- (void)logPurchase:(NSString *)productIdentifier inCurrency:(nonnull NSString *)currencyCode atPrice:(nonnull NSDecimalNumber *)price withQuantity:(NSUInteger)quantity {
[[Appboy sharedInstance] logPurchase:productIdentifier inCurrency:currencyCode atPrice:price withQuantity:quantity];
}

コードをコンパイルし、アプリケーションを実行してください。
カスタムイベントのログ記録を試してみてください。
ダッシュボードでカスタムイベントがログ記録されていることを確認してから、先に進んでください。
アプリ内メッセージ

以下のアプリ内メッセージのセクションは、アプリケーションでこのチャネルを使用する予定がない場合、連携に必須ではありません。
ABKInAppMessageUIDelegateへの準拠
次に、BrazeManager.swift ファイルのコードが ABKInAppMessageUIDelegate に準拠するようにし、関連するメソッドを直接処理できるようにします。
デリゲートに準拠するコードは、BrazeManager.swift ファイルの didFinishLaunching... メソッドに追加されます。初期化コードは最終的に以下のようになります:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) {
Appboy.start(withApiKey: apiKey, in: application, withLaunchOptions: launchOptions, withAppboyOptions: appboyOptions)
let options: UNAuthorizationOptions = [.alert, .sound, .badge]
UNUserNotificationCenter.current().requestAuthorization(options: options) { (granted, error) in
Appboy.sharedInstance()?.pushAuthorization(fromUserNotificationCenter: granted)
}
UIApplication.shared.registerForRemoteNotifications()
Appboy.sharedInstance()?.inAppMessageController.inAppMessageUIController?.setInAppMessageUIDelegate?(self)
}
- (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[Appboy startWithApiKey:[self apiKey] inApplication:application withLaunchOptions:launchOptions withAppboyOptions:[self appboyOptions]];
UNAuthorizationOptions options = (UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:options completionHandler:^(BOOL granted, NSError * _Nullable error) {
[[Appboy sharedInstance] pushAuthorizationFromUserNotificationCenter:granted];
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];
[[Appboy sharedInstance].inAppMessageController.inAppMessageUIController setInAppMessageUIDelegate:self];
}
デリゲートメソッドの追加
次に、ABKInAppMessageUIDelegate に準拠するエクステンションを作成します。
分析セクションに以下のスニペットを追加します。BrazeManager.swift オブジェクトがデリゲートとして設定されていることに注意してください。ここで BrazeManager.swift ファイルがすべての ABKInAppMessageUIDelegate メソッドを処理します。

ABKInAppMessageUIDelegate には必須メソッドはありませんが、以下はその一例です。
// MARK: - ABKInAppMessage UI Delegate
extension AppboyManager: ABKInAppMessageUIDelegate{
func inAppMessageViewControllerWith(_ inAppMessage: ABKInAppMessage) -> ABKInAppMessageViewController {
switch inAppMessage {
case is ABKInAppMessageSlideup:
return ABKInAppMessageSlideupViewController(inAppMessage: inAppMessage)
case is ABKInAppMessageModal:
return ABKInAppMessageModalViewController(inAppMessage: inAppMessage)
case is ABKInAppMessageFull:
return ABKInAppMessageFullViewController(inAppMessage: inAppMessage)
case is ABKInAppMessageHTML:
return ABKInAppMessageHTMLViewController(inAppMessage: inAppMessage)
default:
return ABKInAppMessageViewController(inAppMessage: inAppMessage)
}
// MARK: - ABKInAppMessage UI Delegate
- (ABKInAppMessageViewController *)inAppMessageViewControllerWithInAppMessage:(ABKInAppMessage *)inAppMessage {
if ([inAppMessage isKindOfClass:[ABKInAppMessageSlideup class]]) {
return [[ABKInAppMessageSlideupViewController alloc] initWithInAppMessage:inAppMessage];
} else if ([inAppMessage isKindOfClass:[ABKInAppMessageModal class]]) {
return [[ABKInAppMessageModalViewController alloc] initWithInAppMessage:inAppMessage];
} else if ([inAppMessage isKindOfClass:[ABKInAppMessageFull class]]) {
return [[ABKInAppMessageFullViewController alloc] initWithInAppMessage:inAppMessage];
} else if ([inAppMessage isKindOfClass:[ABKInAppMessageHTML class]]) {
return [[ABKInAppMessageHTMLViewController alloc] initWithInAppMessage:inAppMessage];
}
return nil;
}

コードをコンパイルし、アプリケーションを実行してください。
自分にアプリ内メッセージを送信してみてください。BrazeManager.swift ファイルで、ABKInAppMessageUIDelegate メソッドの例のエントリにブレークポイントを設定します。自分にアプリ内メッセージを送信し、先に進む前にブレークポイントがヒットすることを確認してください。
Content Cards

以下のContent Cardsセクションは、アプリケーションでこのチャネルを使用する予定がない場合、連携に必須ではありません。
Content Cardsの変数とメソッドの作成
不要な import AppboyUI ステートメントなしでプロダクションコードがContent Cardsビューコントローラーを表示できるようにします。
ヘルパーファイルで提供される目的がより整理された方法で読めるように、BrazeManager.swift ファイルにContent Cardsコードのエクステンションを作成します:
ABKContentCardsTableViewControllerを表示します。ビューコントローラーをプレゼントまたはプッシュするために必要なのは、オプションのnavigationControllerパラメータのみです。ABKContentCardsTableViewControllerオブジェクトを初期化し、オプションでタイトルを変更します。また、初期化したビューコントローラーをナビゲーションスタックに追加する必要があります。
// MARK: - Content Cards
extension BrazeManager {
// 1
func displayContentCards(navigationController: UINavigationController?) {
// 2
let contentCardsVc = ABKContentCardsTableViewController()
contentCardsVc.title = "Content Cards"
navigationController?.pushViewController(contentCardsVc, animated: true)
}
}
// MARK: - Content Cards
// 1
- (void)displayContentCards:(UINavigationController *)navigationController {
// 2
ABKContentCardsTableViewController *contentCardsVc = [[ABKContentCardsTableViewController alloc] init];
contentCardsVc.title = @"Content Cards";
[navigationController pushViewController:contentCardsVc animated:YES];
}

コードをコンパイルし、アプリケーションを実行してください。
先に進む前に、アプリケーションで ABKContentCardsTableViewController の表示を試してください。
次のステップ
おめでとうございます!このベストプラクティス統合ガイドを完了しました。BrazeManagerヘルパーファイルの例はGitHubで確認できます。
Braze iOS SDKへの依存関係をプロダクションコードの他の部分から分離できたので、オプションの高度な実装ガイドをご確認ください: