PageSense iOS SDK React Nativeブリッジ統合ガイド

PageSense iOS SDK React Nativeブリッジ統合ガイド

お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

はじめに

このドキュメントでは、React Nativeネイティブブリッジを使用して、PageSense iOS SDKをReact Nativeアプリケーションに連携する方法について説明します。

このガイドでは、以下について説明します。

  • React Nativeネイティブブリッジのアーキテクチャ
  • PageSense iOS SDKの連携
  • Swiftネイティブモジュールの作成
  • ネイティブ関数のReact Nativeへの公開
  • JavaScriptラッパーの作成
  • 実験の実行と目標の追跡
  • 本番環境でのベストプラクティス

最終的に、React Nativeアプリケーションで次のようなPageSense SDK関数をReact Nativeコードから直接呼び出せるようになります。

  • createNewPageSenseClient
  • activateExperiment
  • getVariationName
  • trackGoal

React Nativeネイティブブリッジとは

React Nativeネイティブブリッジを使用すると、JavaScriptコードがプラットフォーム固有のネイティブコードと通信できます。

これにより、React Nativeアプリケーションで次の機能を使用できます。

  • iOS SDK
  • Android SDK
  • デバイスAPI
  • ネイティブライブラリー

仕組み

a. JavaScriptがNativeModules内の関数を呼び出します
b. React Nativeがブリッジ経由でリクエストを送信します
c. ネイティブコードがリクエストを実行します
d. ネイティブコードが結果をPromiseとして返します

アーキテクチャの概要—React NativeアプリケーションとiOS SDKの連携

React Nativeアプリケーションは主にJavaScriptコードを実行しますが、iOS向けPageSense SDKはSwiftで実装されています。JavaScriptはSwiftコードと直接連携できないため、React Nativeにはネイティブブリッジの仕組みが用意されています。このブリッジにより、JavaScriptレイヤーとネイティブモジュール間の通信が可能になり、React NativeコードからSDK関数の呼び出し、実験のバリエーションの取得、目標の追跡をスムーズに行えます。

PageSense iOS SDK React Native–ネイティブブリッジのアーキテクチャ

React Native UI

React Nativeラッパー(TypeScript/JavaScript)

React Nativeネイティブブリッジ

Objective-Cブリッジモジュール(.m)

Swiftネイティブモジュール(.swift)

PageSense iOS SDK

PageSense SDKの機能

PageSense SDKでは、次の関数を利用できます。

機能

関数

説明

SDKの初期化

createNewPageSenseClient

アプリケーション内でPageSenseクライアントインスタンスを作成して初期化します。このクライアントインスタンスは、PageSenseサービスとの通信と、ユーザーセッションの実験管理を行います。

実験の有効化

activateExperiment

特定の実験をユーザーに対して有効化し、実験の設定に基づいて適切なバリエーションを割り当てます。

バリエーション名の取得

getVariationName

特定の実験で現在のユーザーに割り当てられているバリエーション名を取得し、アプリケーションで対応するUIや動作の変更を適用できるようにします。

目標の追跡

trackGoal

実験で定義されたコンバージョンイベントや目標を記録・追跡し、各バリエーションの効果とパフォーマンスの測定に役立てます。

連携の前提条件

PageSense iOS SDKをReact Nativeアプリケーションに連携するためにReact Nativeネイティブブリッジを使用できるよう、開発環境に次のツールがインストールされていることを確認してください。

必要なパッケージ。

  • Node.js
  • npm
  • React Native CLI
  • Xcode
  • CocoaPods

インストールを確認します。

# インストール済みのNode.jsバージョンを確認
node -v

# インストール済みのnpmバージョンを確認
npm -v

# インストール済みのCocoaPodsバージョンを確認
pod --version

React NativeアプリケーションへのPageSense iOS SDKのインストール

PageSense iOS SDKはXCFrameworkを使用して配布できます。

a. PageSense iOS SDK(PageSenseFramework.xcframework)は、次のリポジトリーからダウンロードできます。
https://github.com/zoho/ZohoPageSenseSDK

b. 上記のリポジトリーに移動し、Frameworksフォルダーを開きます。

c. PageSenseFramework.xcframework.zipファイルをダウンロードし、内容を展開します。

d. 展開したPageSense XCFrameworkを、iOSプロジェクトフォルダー内の次の場所に配置します。
/ProjectRoot/ios/Frameworks/PageSenseFramework.xcframework

e. Xcodeでワークスペースを開き、PageSenseFramework.xcframeworkをプロジェクトに追加します。

f. Xcodeで、プロジェクトの[Target]設定に移動します。

g. [Target]→[General]→[Frameworks, Libraries and Embedded Content]に移動します。

h. このセクションにPageSenseFramework.xcframeworkを追加します。

i. フレームワークオプションを[Embed & Sign]に設定します。

iOS React Nativeライブラリー

CocoaPodsを使用して、必要なReact NativeライブラリーがiOSプロジェクトにインストールされていることを確認してください。これらのライブラリーは、iosディレクトリーでpod installコマンドを実行すると自動的にインストールされます。CocoaPodsのインストールの一部として、次のReact Nativeライブラリーがプロジェクトで利用可能である必要があります。

  • React-Core
  • React-RCTBridge
  • React-RCTNetwork
  • React-RCTText
  • React-RCTImage

また、React Nativeネイティブブリッジの実装に必要な次のiOSフレームワーク依存関係が利用可能であることを確認してください。

  • React
  • RCTBridgeModule
  • Foundation

これらのライブラリーにより、SwiftまたはObjective-Cでネイティブモジュールを実装し、React Nativeネイティブブリッジを通じてPageSense iOS SDKをReact Nativeアプリケーションに公開できます。

ネイティブブリッジモジュールの作成

React Nativeネイティブモジュールは、次の2つの部分で実装されます。

a. Swift実装
b. Objective-Cブリッジ

Objective-Cレイヤーは、SwiftメソッドをReact Nativeに公開します。

i. Swiftネイティブモジュールの作成

Swiftを使用して、PageSense iOS SDK用のネイティブモジュールファイルを作成します。このファイルは、React Nativeプロジェクトのルートディレクトリーにあるiosフォルダー内のiOSアプリケーションディレクトリーに配置します。

例:/ProjectRoot/ios/SampleApp/PageSenseSDKModule.swift

  1. インポート Foundation
  2. インポート React
  3. インポート PageSenseFramework
  4. /**
  5. React NativeアプリケーションにPageSense iOS SDKを連携するためのReact Nativeネイティブモジュールです。
  6. このモジュールは単一のPageSenseClientインスタンスを保持し、複数の実験
  7. 操作でアプリのライフサイクル全体にわたって再利用します。
  8. */
  9. @objc(PageSenseSDKModule)
  10. class PageSenseSDKModule: NSObject {
  11. // PageSenseクライアントのインスタンスを保持します
  • private var client: PageSenseClient?
  • // PageSense SDKがすでに初期化されているかどうかを示します
  • private var isInitialized: Bool = false
  • // React Nativeによってメインスレッドで強制的に初期化されないようにします
  • @objc
  • static func requiresMainQueueSetup() -> Bool {
  • return false
  • }
  • /**
  • PageSense SDKを初期化し、PageSenseClientインスタンスを作成します。
  • パラメーター。
  • - accountId: PageSenseアカウントID。
  • - sdkKey: 認証に使用するSDKキー。
  • - projectName: PageSenseプロジェクトの名前。
  • - resolve: 成功または失敗をReact Nativeレイヤーに返すPromiseリゾルバー。
  • - reject: Promiseリジェクター(失敗時は`false`を返すため使用しません)。
  • 戻り値。
  • - SDKの初期化に成功した場合、またはすでに初期化済みの場合は`true`。
  • - SDKの初期化に失敗した場合は`false`。
  • */
  • @objc
  • func initialiseSDK(
  • _ accountId: String,
  • sdkKey: String,
  • projectName: String,
  • resolver resolve: @escaping RCTPromiseResolveBlock,
  • rejecter reject: @escaping RCTPromiseRejectBlock
  • ) {
  • // 重複した初期化の試行を防ぎます。
  • if self.isInitialized {
  • print('PageSenseClientはすでに初期化されています')
  • resolve(true)
  • return
  • }
  • // PageSense SDKオプションを設定します
  • let pageSenseSDKOptions = PageSenseSDKOptions()
  • pageSenseSDKOptions.logLevel = .DEBUG
  • pageSenseSDKOptions.pollingInterval = 5 // ポーリング間隔(分)
  • // 新しいPageSenseクライアントインスタンスを作成します
  • PageSense.shared.createNewPageSenseClient(
  • sdkAccountIDForDC: accountId,
  • sdkKey: sdkKey,
  • projectname: projectName,
  • sdkOptions: pageSenseSDKOptions
  • ) { pagesenseclient in
  • // 返されたクライアントインスタンスを検証します
  • guard let client = pagesenseclient else {
  • print('PageSenseClientの初期化に失敗しました')
  • resolve(false)
  • return
  • }
  • // PageSenseクライアントインスタンスを保存します
  • self.client = client
  • self.isInitialized = true
  • print('PageSenseClientの初期化が完了しました')
  • // 初期化が成功したことをReact Nativeレイヤーに通知します
  • resolve(true)
  • }
  • }
  • /**
  • 指定したユーザーに対して実験を有効化し、割り当てられたバリエーションを返します。
  • パラメーター。
  • - experimentName: PageSenseで設定された実験の名前。
  • - userId: ユーザーの一意の識別子。
  • - attributes: オーディエンスのターゲティングに使用する任意のユーザー属性。
  • - resolve: 割り当てられたバリエーション名または`nil`を返すPromiseリゾルバー。
  • - reject: Promiseリジェクター(失敗時は`nil`を返すため使用しません)。
  • 戻り値。
  • - 割り当てられている場合はバリエーション名。
  • - バリエーションが割り当てられていない場合、またはSDKが初期化されていない場合は`nil`。
  • */
  • @objc
  • func activateExperiment(
  • _ experimentName: String,
  • userId: String,
  • attributes: NSDictionary,
  • resolver resolve: @escaping RCTPromiseResolveBlock,
  • rejecter reject: @escaping RCTPromiseRejectBlock
  • ) {
  • // 実験を有効化する前にSDKが初期化済みであることを確認します
  • guard let client = self.client else {
  • print('PageSenseSDK - SDKの初期化前にactivateExperimentが呼び出されました')
  • resolve(nil)
  • return
  • }
  • // React NativeのNSDictionaryをSwift Dictionaryに変換します
  • var attrs = attributes as? [String: String] ?? [:]
  • // ユーザー属性の値を追加します
  • attrs['DeviceType'] = 'Tablet'
  • attrs['OS'] = 'iOS'
  • attrs['OSVersion'] = '17.0'
  • attrs['DeviceModel'] = 'iPhone 15 Pro'
  • // 指定したユーザーに対して実験を有効化します
  • client.activateExperiment(
  • experimentName: experimentName,
  • userId: userId,
  • userAttributes: attrs
  • ) { variationName in
  • if let variation = variationName {
  • print('PageSenseSDK - バリエーションが有効化されました:', variation)
  • resolve(variation)
  • } else {
  • print('PageSenseSDK - 割り当てられたバリエーションはありません')
  • resolve(nil)
  • }
  • }
  • }
  • /**
  • 指定した実験でユーザーに割り当てられたバリエーション名を取得します。
  • パラメーター。
  • - experimentName: 実験の名前。
  • - userId: ユーザーの一意の識別子。
  • - attributes: オーディエンスのターゲティングに使用する任意のユーザー属性。
  • - resolve: バリエーション名または`nil`を返すPromiseリゾルバー。
  • - reject: Promiseリジェクター(失敗時は`nil`を返すため使用しません)。
  • 戻り値。
  • - 利用可能な場合はバリエーション名。
  • - バリエーションが見つからない場合、またはSDKが初期化されていない場合は`nil`。
  • */
  • @objc
  • func getVariationName(
  • _ experimentName: String,
  • userId: String,
  • attributes: NSDictionary,
  • resolver resolve: @escaping RCTPromiseResolveBlock,
  • rejecter reject: @escaping RCTPromiseRejectBlock
  • ) {
  • // バリエーションを取得する前にSDKの初期化を確認します
  • guard let client = self.client else {
  • print('PageSenseSDK - SDKの初期化前にgetVariationNameが呼び出されました')
  • resolve(nil)
  • return
  • }
  • // React NativeのNSDictionaryをSwiftのDictionaryに変換します
  • let attrs = attributes as? [String: String] ?? [:]
  • // ユーザーのバリエーションを取得します
  • let variationName = client.getVariationName(
  • experimentName: experimentName,
  • userId: userId,
  • userAttributes: attrs
  • )
  • if let variation = variationName {
  • print('PageSenseSDK - バリエーションを取得しました:', variation)
  • resolve(variation)
  • } else {
  • print('PageSenseSDK - バリエーションが見つかりません')
  • resolve(nil)
  • }
  • }
  • /**
  • 指定した実験の目標コンバージョンイベントをトラッキングします。
  • パラメーター:
  • - experimentName: 実験の名前。
  • - userId: ユーザーの一意の識別子。
  • - goalName: PageSenseで設定した目標の名前。
  • - attributes: オーディエンスターゲティングに使用する任意のユーザー属性。
  • */
  • @objc
  • func trackGoal(
  • _ experimentName: String,
  • userId: String,
  • goalName: String,
  • attributes: NSDictionary
  • ) {
  • // 目標をトラッキングする前にSDKの初期化を確認します
  • guard let client = self.client else {
  • print('PageSenseSDK - SDKの初期化前にtrackGoalが呼び出されました')
  • return
  • }
  • // React NativeのNSDictionaryをSwiftのDictionaryに変換します
  • var attrs = attributes as? [String: String] ?? [:]
  • // ユーザー属性の値を追加します
  • attrs['DeviceType'] = 'Phone'
  • attrs['OS'] = 'iOS'
  • attrs['OSVersion'] = '17.0'
  • attrs['DeviceModel'] = 'iPhone 15 Pro'
  • // 目標イベントをトラッキングします
  • client.trackGoal(
  • experimentName: experimentName,
  • userId: userId,
  • goalName: goalName,
  • userAttributes: attrs
  • )
  • print('PageSenseSDK - 目標をトラッキングしました:', goalName)
  • }
  • }
  • Objective-Cブリッジングヘッダーの追加

    a. SwiftとObjective-C間の通信を有効にするには、次の場所にブリッジングヘッダーを作成します。
    /ProjectRoot/ios/SampleApp/SampleApp-Bridging-Header.h

    b. Xcodeでプロジェクトを開き、[ビルド設定]に移動します。

    c. [Objective-Cブリッジングヘッダー]を探します。

    d. 値を次のように設定します: SampleApp/SampleApp-Bridging-Header.h

    React Nativeラッパーの作成

    React NativeアプリケーションとネイティブのPageSense SDK実装を連携できるように、React Nativeラッパーファイルを作成します。このラッパーは、React Nativeアプリケーション内のJavaScriptコードにネイティブのPageSense SDKメソッドを公開するインターフェイス層として機能します。

    JavaScriptラッパーファイルは、プロジェクト構造内の次のパスに作成します。
    src/sdk/PageSenseSDKWrapper.js

    1. import { NativeModules } from 'react-native';
    2. // Extract the native module exposed through the React Native bridge.
    3. const { PageSenseSDKModule } = NativeModules;
    4. /**
    5.  * PageSenseSDKWrapper provides a JavaScript interface for interacting
    6.  * with the PageSense SDK through the React Native Native Bridge.
    7.  */
    8. class PageSenseSDKWrapper {
    9.     /**
    10.      * Initialise the PageSense SDK. Should be called once during application startup.
    11.      *
    12.      * @param {string} accountId - PageSense account identifier.
    13.      * @param {string} sdkKey - SDK key used for authentication.
    14.      * @param {string} projectName - Name of the PageSense project.
    15.      *
    16.      * @returns {Promise<boolean>}
    17.      * Returns:
    18.      * - true → SDK initialized successfully
    19.      * - false → initialization failed
    20.      */
    21.     async initialiseSDK(accountId, sdkKey, projectName) {
    22.         try {
    23.             this._validateString(accountId, 'accountId');
    24.             this._validateString(sdkKey, 'sdkKey');
    25.             this._validateString(projectName, 'projectName');
    26.             const result = await PageSenseSDKModule.initialiseSDK(
    27.                 accountId,
    28.                 sdkKey,
    29.                 projectName,
    30.             );
    31.             return result === true;
    32.         } catch (error) {
    33.             console.log('[PageSenseSDK] initialiseSDK error:', error);
    34.             return false;
    35.         }
    36.     }
    37.     /**
    38.      * Activates an experiment and returns the assigned variation.
    39.      *
    40.      * @param {string} experimentName - Name of the experiment.
  •      * @param {string} userId - Unique user identifier.
  •      * @param {Object.<string, string>} [attributes] - Optional user attributes.
  •      *
  •      * @returns {Promise<string|null>}
  •      * Returns:
  •      * - variation name → if assigned
  •      * - null → if no variation or error
  •      */
  •     async activateExperiment(experimentName, userId, attributes) {
  •         try {
  •             this._validateString(experimentName, 'experimentName');
  •             this._validateString(userId, 'userId');
  •             this._validateAttributes(attributes);
  •             const safeAttributes = attributes || {};
  •             const variation = await PageSenseSDKModule.activateExperiment(
  •                 experimentName,
  •                 userId,
  •                 safeAttributes,
  •             );
  •             return variation ?? null;
  •         } catch (error) {
  •             console.log('[PageSenseSDK] activateExperiment error:', error);
  •             return null;
  •         }
  •     }
  •     /**
  •      * Retrieves the variation name without activating the experiment.
  •      *
  •      * @param {string} experimentName - Name of the experiment.
  •      * @param {string} userId - Unique user identifier.
  •      * @param {Object.<string, string>} [attributes] - Optional user attributes.
  •      *
  •      * @returns {Promise<string|null>}
  •      * Returns:
  •      * - variation name → if available
  •      * - null → if not available or error
  •      */
  •     async getVariationName(experimentName, userId, attributes) {
  •         try {
  •             this._validateString(experimentName, 'experimentName');
  •             this._validateString(userId, 'userId');
  •             this._validateAttributes(attributes);
  •             const safeAttributes = attributes || {};
  •             const variation = await PageSenseSDKModule.getVariationName(
  •                 experimentName,
  •                 userId,
  •                 safeAttributes,
  •             );
  •             return variation ?? null;
  •         } catch (error) {
  •             console.log('[PageSenseSDK] getVariationName error:', error);
  •             return null;
  •         }
  •     }
  •     /**
  •      * Tracks a goal event for an experiment.
  •      *
  •      * @param {string} experimentName - Name of the experiment.
  •      * @param {string} userId - Unique user identifier.
  •      * @param {string} goalName - Name of the goal.
  •      * @param {Object.<string, string>} [attributes] - Optional goal attributes.
  •      *
  •      * @returns {void}
  •      */
  •     trackGoal(experimentName, userId, goalName, attributes) {
  •         try {
  •             this._validateString(experimentName, 'experimentName');
  •             this._validateString(userId, 'userId');
  •             this._validateString(goalName, 'goalName');
  •             this._validateAttributes(attributes);
  •             const safeAttributes = attributes || {};
  •             PageSenseSDKModule.trackGoal(
  •                 experimentName,
  •                 userId,
  •                 goalName,
  •                 safeAttributes,
  •             );
  •         } catch (error) {
  •             console.log('[PageSenseSDK] trackGoal error:', error);
  •         }
  •     }
  •     /**
  •      * Validates whether the given parameter is a non-empty string.
  •      * @private
  •      * @throws {Error} if param is not a non-empty string
  •      */
  •     _validateString(param, paramName) {
  •         if (typeof param !== 'string' || param.trim() === '') {
  •             throw new Error(
  •                 `[PageSenseSDK] Invalid ${paramName}: must be a non-empty string`,
  •             );
  •         }
  •     }
  •     /**
  •      * Validates the attributes object to ensure it is a valid key-value pair structure.
  •      * @private
  •      * @throws {Error} if attributes is invalid
  •      */
  •     _validateAttributes(attributes) {
  •         if (attributes === undefined || attributes == null) return;
  •         if (typeof attributes !== 'object' || Array.isArray(attributes)) {
  •             throw new Error('[PageSenseSDK] attributes must be a key-value object');
  •         }
  •         for (const key in attributes) {
  •             if (typeof key !== 'string' || key.trim() === '') {
  •                 throw new Error(
  •                     '[PageSenseSDK] Invalid attribute key: must be a non-empty string',
  •                 );
  •             }
  •             const value = attributes[key];
  •             if (typeof value !== 'string') {
  •                 throw new Error(
  •                     `[PageSenseSDK] Invalid value for attribute '${key}'. Allowed type: string`,
  •                 );
  •             }
  •         }
  •     }
  • }
  • // Export a singleton instance
  • export default new PageSenseSDKWrapper();
  • SDKの初期化

    PageSense SDKは、アプリケーションのライフサイクル中に1回だけ初期化する必要があります。理想的には、アプリの起動時に初期化します。たとえば、React Nativeアプリケーションのメインエントリーポイント(App.jsxやApp.jsなど)で、コンポーネントをレンダリングしたり、実験関連のロジックを実行したりする前にSDKを初期化できます。この方法により、SDKの設定が完了し、アプリ内で必要になったときにいつでも利用できるようになります。

    1. /**
    2. * ルートアプリケーションコンポーネントは、React Native
    3. * アプリケーションの起動時にPageSense SDKを初期化します。SDKの初期化処理が完了した後にのみ、アプリケーションUIがレンダリングされます。
    4. * これにより、画面の読み込み時に実験をすぐに実行できます。
    5. *
    6. * @returns {JSX.Element}
    7. */
    8. export default function App() {
    9. /**
    10. * PageSense SDKの初期化が完了したかどうかを追跡します。
    11. * @type {[boolean, Function]}
    12. */
    13. const [sdkReady, setSdkReady] = useState(false);
    14. /**
    15. * コンポーネントのマウント時に1回実行されます。
    16. * ラッパー経由でPageSense SDKを初期化します。
    17. */
    18. useEffect(() =&gt; {
    19. /**
    20. * PageSense SDKクライアントを初期化します。
    21. * @returns {Promise&lt;void&gt;}
    22. */
    23. async function initializeSDK() {
    24. try {
    25. // ネイティブのPageSenseクライアントを初期化するためにSDKラッパーを呼び出します
    26. const result = await PageSenseSDKWrapper.initialiseSDK(
    27. 'PAGESENSE_ACCOUNT_ID', // PageSenseアカウントID
    28. 'PAGESENSE_SDK_KEY', // SDKキー
    29. 'PAGESENSE_PROJECT_NAME', // プロジェクト名
    30. );
    31. console.log('PageSense SDKの初期化に成功しました:', result);
    32. setSdkReady(true);
    33. } catch (error) {
    34. console.log('PageSense SDKの初期化エラー:', error);
    35. // SDKの初期化に失敗しても、アプリの処理は続行します
    36. setSdkReady(true);
    37. }
    38. }
    39. initializeSDK();
    40. }, []);
    41. if (!sdkReady) {
    42. return (
    43. &lt;View style={styles.loadingContainer}&gt;
    44. &lt;ActivityIndicator size='large' /&gt;
    45. &lt;Text style={styles.loadingText}&gt;アプリを初期化しています...&lt;/Text&gt;
    46. &lt;/View&gt;
    47. );
    48. }
    49. return (
    50. ....アプリケーションUIの実装
    51. );
    52. }

    実験の有効化

    ユーザーが適切なバリエーションに割り当てられ、UIや機能に関連する変更がすぐに適用されるよう、画面の読み込み時に実験を実行する必要があります。これにより、画面がアクティブになると同時に実験がトリガーされ、一貫した動作と正確なバリエーション割り当てが実現します。たとえば、React Nativeコンポーネントでは、App.jsxやApp.js、または関連する画面コンポーネントのuseEffectなどのライフサイクルメソッド内で実験を呼び出すことで、画面のマウント時に1回実行できます。

    1. /**
    2. * 現在の画面の実験を実行し、PageSense SDKによって割り当てられた
    3. * バリエーションに基づいて、適切なUIバリエーションを適用します。
    4. */
    5. try {
    6. // 現在のユーザーに対して実験を有効化します。
    7. const variation = await PageSenseSDKWrapper.activateExperiment(
    8. 'EXPERIMENT_NAME', // 実験名
    9. 'USER_ID', // 一意のユーザー識別子
    10. USER_ATTRIBUTES // PageSense SDKに渡す任意のユーザー属性 -(キー/値ペア)
    11. );
    12. console.log('実験のバリエーション:', variation);
    13. /**
    14. * バリエーション名に基づいてUIバリエーションを適用します。
    15. */
    16. switch (variation) {
    17. // オリジナルのコントロールバリエーション
    18. case 'Original':
    19. setButtonColor('#4F46E5'); // 既定の紫色
    20. break;
    21. // バリエーション1
    22. case 'Variation 1':
    23. setButtonColor('#EF4444'); // 赤いボタン
    24. break;
    25. // バリエーション2
    26. case 'Variation 2':
    27. setButtonColor('#16A34A'); // 緑のボタン
    28. break;
    29. // バリエーション3
    30. case 'Variation 3':
    31. setButtonColor('#F59E0B'); // オレンジのボタン
    32. break;
    33. /**
    34. * SDKからバリエーションが返されない場合、実験が
    35. * 有効でない場合、またはユーザーがどの実験グループにも該当しない場合に適用されるフォールバックバリエーションです。
    36. */
    37. default:
    38. setButtonColor('#6B7280'); // フォールバック用のニュートラルグレー
    39. }
    40. } catch (e) {
    41. console.log('実験エラー', e);
    42. setButtonColor('#6B7280');
    43. }

    目標のトラッキング

    目標のトラッキングは、ユーザーがアプリケーション内で特定の操作やイベントを完了した直後に実行してください。これにより、コンバージョン、操作、その他の主要なパフォーマンス指標がリアルタイムで記録され、実験の効果を分析するための正確でタイムリーなデータが得られます。たとえば、ユーザーがボタンをタップしたり、フォームを送信したり、購入を完了したりした後に、対応する目標をトラッキング用にPageSense SDKへ送信してください。

    1. /**
    2. * 指定した実験の目標イベントをトラッキングします。
    3. */
    4. PageSenseSDKWrapper.trackGoal(
    5. 'EXPERIMENT_NAME', // 目標イベントに関連付けられた実験
    6. 'USER_ID', // 一意のユーザー識別子
    7. 'GOAL_NAME', // PageSenseで定義された目標名
    8. USER_ATTIBUTES); // PageSense SDKに渡される任意のユーザー属性 - (キー/値のペア)

    ベストプラクティス

    • SDKの初期化は、アプリの起動ごとにプロジェクトにつき1回だけ実行してください。
    • SDKの初期化は、実験を有効化する前に実行してください。
    • SDKの初期化に失敗しても、アプリケーションでUIのレンダリングをブロックしないでください。
    • SDKの初期化に失敗した場合は、フォールバックUIを使用してください。
    • PageSenseClientインスタンスは、アプリケーションセッションの全期間にわたって存在する必要があります。
    • モバイルデバイスの各ユーザーに一意のユーザーIDを作成し、全体で再利用してください。
    • 実験の有効化APIの呼び出しを繰り返さないよう、実験結果をキャッシュしてください。
    • Nullバリエーションに対応してください。常に安全な既定のUIへフォールバックしてください。
    • ネイティブタブにはUIの状態を保存せず、SDK関連のオブジェクトのみを保存してください。
    • 目標は、特定のユーザー操作やイベントが正常に完了した後にトリガーしてください。
    • 開発中のデバッグを支援するために、構造化ログを使用してください。

    概要

    このガイドに従うことで、React Nativeアプリケーションで次のことが可能になります。

    • PageSense SDKの初期化
    • 実験の有効化
    • バリエーションの取得
    • コンバージョン目標のトラッキング
    • 実験に基づくUIの動的な変更

    この連携により、PageSense iOS SDKを使用して、React Nativeアプリケーション内でFullStack A/Bテスト機能を利用できるようになります。


    このドキュメントは、各手順を順を追って進められるように作成されています。さらにサポートが必要な場合やご不明な点がある場合は、support@zohopagesense.com - までお気軽にお問い合わせください。いつでもサポートいたします。