コンテンツにスキップ


Braze iOS SDK 統合ガイド

このオプションのiOS統合ガイドでは、iOS SDKとそのコアコンポーネントを初めてアプリケーションに統合する際のセットアップのベストプラクティスについて段階的に説明します。このガイドは、BrazeManager.swift ヘルパーファイルを作成する際に役立ちます。このヘルパーファイルは、Braze iOS SDKへの依存関係をプロダクションコードの残りの部分から切り離し、アプリケーション全体で import AppboyUI を1か所だけにします。このアプローチにより、過剰なSDKインポートから発生する問題が軽減され、コードの追跡、デバッグ、および変更が容易になります。

連携の概要

以下の手順では、プロダクションコードが呼び出す BrazeManager ヘルパーファイルの構築方法について説明します。このヘルパーファイルは、以下の連携トピックに対応するさまざまなエクステンションを追加することで、Braze関連のすべての依存関係を処理します。各トピックには、SwiftとObjective-Cの両方の水平タブステップとコードスニペットが含まれています。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

  1. BrazeManager クラスを初期化する shared という名前の静的変数を追加します。これは一度だけ遅延初期化されることが保証されています。
  2. 次に、apiKey という名前のプライベート定数変数を追加し、BrazeダッシュボードのワークスペースからAPIキー値として設定します。
  3. 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]];
}
AppDelegate.swiftでAppboyの初期化を処理する

次に、AppDelegate.swift ファイルに戻り、AppDelegateの didFinishLaunchingWithOptions メソッドに以下のコードスニペットを追加して、BrazeManager.swift ヘルパーファイルからAppboyの初期化を処理します。AppDelegate.swift に import AppboyUI ステートメントを追加する必要はありません。

func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
  // Override point for customization after application launch

  BrazeManager.shared.application(application, didFinishLaunchingWithOptions: launchOptions)

  return true
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch

  [[BrazeManager shared] application:application didFinishLaunchingWithOptions:launchOptions];

  return YES;
}

プッシュ通知

プッシュ証明書の追加

Brazeダッシュボードの既存のワークスペースに移動します。プッシュ通知設定でプッシュ証明書ファイルをBrazeダッシュボードにアップロードし、保存します。

APNsキーアップロードフィールドがあるBrazeダッシュボードのプッシュ通知設定。

プッシュ通知の登録

次に、プッシュ通知を登録します。このガイドでは、Apple開発者ポータルとXcodeプロジェクトでプッシュ認証情報を正しく設定していることを前提としています。

プッシュ通知を登録するコードは、BrazeManager.swift ファイルの didFinishLaunching... メソッドに追加されます。初期化コードは最終的に以下のようになります:

  1. ユーザーとの対話のための認証リクエストの内容を設定します。これらのオプションは例として記載されています。
  2. ユーザーにプッシュ通知を送信するための認証をリクエストします。ユーザーのプッシュ通知の許可または拒否の応答は granted 変数で追跡されます。
  3. ユーザーが通知プロンプトに対話した後、プッシュ認証結果をBrazeに転送します。
  4. 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 ファイルにプッシュ通知コードのエクステンションを作成します:

  1. AppDelegate に import AppboyUI ステートメントを含めないパターンに従い、BrazeManager.swift ファイルでプッシュ通知メソッドを処理します。ユーザーのデバイストークンは didRegisterForRemote... メソッドからBrazeに渡す必要があります。このメソッドはサイレントプッシュ通知の実装に必要です。次に、AppDelegate と同じメソッドを BrazeManager クラスに追加します。
  2. メソッド内に以下の行を追加して、デバイストークンを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から発信されるリモートプッシュ通知のサポートを開始します。

Signing & Capabilitiesの設定画面

ステップ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];
}

ユーザー変数とメソッドへのアクセス

ユーザー変数とメソッドの作成

次に、ABKUser の変数とメソッドに簡単にアクセスできるようにします。ヘルパーファイルで提供される目的がより整理された方法で読めるように、BrazeManager.swift ファイルにユーザーコードのエクステンションを作成します:

  1. ABKUser オブジェクトは、iOSアプリケーション内の既知のまたは匿名のユーザーを表します。ABKUser を取得するための算出変数を追加します。この変数はユーザーに関する変数を取得するために再利用されます。
  2. ユーザー変数をクエリして userId に簡単にアクセスします。ABKUser オブジェクトが担当する他の変数には(firstName、lastName、phone、homeCity など)があります。
  3. 対応する 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 メソッドを処理します。

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

Content Cards

Content Cardsの変数とメソッドの作成

不要な import AppboyUI ステートメントなしでプロダクションコードがContent Cardsビューコントローラーを表示できるようにします。

ヘルパーファイルで提供される目的がより整理された方法で読めるように、BrazeManager.swift ファイルにContent Cardsコードのエクステンションを作成します:

  1. ABKContentCardsTableViewController を表示します。ビューコントローラーをプレゼントまたはプッシュするために必要なのは、オプションの navigationController パラメータのみです。
  2. 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];
}

次のステップ

おめでとうございます!このベストプラクティス統合ガイドを完了しました。BrazeManagerヘルパーファイルの例はGitHubで確認できます。

Braze iOS SDKへの依存関係をプロダクションコードの他の部分から分離できたので、オプションの高度な実装ガイドをご確認ください:

New Stuff!