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

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

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

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

React Nativeのネイティブブリッジは、JavaScriptランタイムとネイティブプラットフォームコード(AndroidまたはiOS)間の通信レイヤーです。
これにより、JavaScriptコードで次のことができます。
  1. ネイティブ関数の呼び出し
  2. プラットフォーム固有のSDK機能へのアクセス
  3. ネイティブモジュールからの応答の受信
PageSense Android SDKにおいて、このブリッジにより、React Nativeアプリケーションから次のようなAndroid SDKメソッドを呼び出せます。
  1. SDKの初期化
  2. 実験の有効化
  3. バリエーションの取得
  4. 目標の追跡
これらのネイティブメソッドはKotlinで実装され、React NativeブリッジAPIを通じてReact Nativeに公開されます。

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

React Nativeアプリケーションは主にJavaScriptコードを実行しますが、PageSense Android SDKはKotlin/Javaで実装されています。JavaScriptはネイティブAndroidコードと直接やり取りできないため、React Nativeにはネイティブブリッジと呼ばれる仕組みが用意されています。React Nativeのネイティブブリッジにより、JavaScriptレイヤーとネイティブAndroidモジュール間の通信が可能になり、React NativeアプリケーションからAndroid SDKの機能を呼び出せます。

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

React Native UI
React Nativeラッパー(TypeScript/JavaScript)
React Nativeネイティブブリッジ
PageSenseSDKPackage(モジュール登録)
PageSenseSDKModule(Kotlinネイティブモジュール)
PageSense Android SDK

この連携では、PageSense Android SDKのメソッドをReact Nativeアプリケーションに公開するために、ネイティブモジュールを実装します。ネイティブモジュールは内部でPageSense Android SDKと連携し、SDKの初期化、実験の有効化、実験目標の追跡などの操作を実行します。
React Nativeランタイムに登録されると、ネイティブモジュールはReact NativeのNativeModules APIを通じてJavaScriptレイヤーからアクセスできるようになります。その後、React Nativeラッパーから公開済みのネイティブ関数を呼び出すことで、アプリケーションはReact Nativeコードベースから直接、実験の実行や目標の追跡を行えます。

PageSense SDKの機能

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

機能

関数

説明

SDKの初期化

createNewPageSenseClient

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

実験の有効化

activateExperiment

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

バリエーション名の取得

getVariationName

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

目標の追跡

trackGoal

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

連携の前提条件

React NativeアプリケーションにPageSense Android SDKを組み込む前に、次のツールがインストールされていることを確認してください。

開発環境
  1. Node.js
  2. npm
  3. Watchman
  4. React Native CLI
Android開発ツール
  1. Android Studio
  2. Android SDK
  3. Gradle
  4. Java Development Kit(JDK)

連携の前提条件

React NativeアプリケーションにPageSense Android SDKを組み込む前に、次のツールがインストールされていることを確認してください。
開発環境
Node.js
npm
Watchman
React Native CLI

Android開発ツール
Android Studio
Android SDK
Gradle
Java Development Kit(JDK)

インストールの確認:
# インストール済みのNode.jsバージョンを確認
node -v
# インストール済みのnpmバージョンを確認
npm -v
# Android環境を確認
npx react-native doctor


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

PageSense Android SDKは、Zoho Mavenリポジトリーを通じて配布されています。SDKをReact Native Androidアプリケーションに組み込むには、リポジトリーを設定し、SDKの依存関係をプロジェクトに追加する必要があります。

ステップ1 – Zoho Mavenリポジトリーの追加
GradleがSDKアーティファクトをダウンロードできるように、PageSense Mavenリポジトリーを追加します。最近のReact Nativeプロジェクト(Gradle 7以降)では、通常、リポジトリーはsettings.gradleで設定します。

dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven {
url 'https://maven.zohodl.com/'
}
}
}

プロジェクト構成によっては、Androidプロジェクトのルートにあるプロジェクトレベルのbuild.gradleファイルにリポジトリーを追加する場合もあります。リポジトリーを追加すると、GradleがPageSense Android SDKの依存関係を解決し、ダウンロードできるようになります。

repositories {
google()
mavenCentral()
maven {
url 'https://maven.zohodl.com/'
}
}

ステップ2 – PageSense Android SDKの依存関係の追加

android/app/build.gradleにあるアプリケーションレベルのGradleファイルに、PageSense Android SDKの依存関係を追加します。
dependenciesブロック内に依存関係を追加します。

dependencies {
implementation('com.facebook.react:react-android')
implementation('com.zoho.pagesense:pagesense:1.1.2')
}

追加すると、ビルドプロセス中にGradleがPageSense Android SDKを自動的にダウンロードし、アプリケーションに含めます。

Android向けReact Nativeライブラリー

Androidプロジェクトで必要なReact Nativeライブラリーを利用できることを確認してください。これらのライブラリーはReact Native Androidのビルド設定の一部として自動的に含まれ、Gradleを使用してプロジェクトの依存関係を解決するとインストールされます。Androidのビルド設定の一部として、プロジェクトで次のReact Nativeライブラリーを利用できる必要があります。
  1. react-android – JavaScript実行環境とネイティブモジュールとの通信を可能にする、Android向けのコアReact Nativeランタイムライブラリーです。
  2. hermes-android(任意)– パフォーマンス向上と起動時間短縮のためにReact Nativeアプリケーションで使用されるJavaScriptエンジンです。
これらの依存関係は通常、android/app/build.gradleにあるアプリケーションレベルのGradleファイルに含まれています。また、ネイティブモジュールを実装するために、次のReact Native Androidブリッジライブラリーを利用できることを確認してください。
  1. ReactContextBaseJavaModule
  2. ReactMethod
  3. PromiseReadableMap
  4. ReactPackage
  5. ReactApplicationContext
Android向けReact Nativeライブラリー
Androidプロジェクトで必要なReact Nativeライブラリーを利用できることを確認してください。これらのライブラリーはReact Native Androidのビルド設定の一部として自動的に含まれ、Gradleを使用してプロジェクトの依存関係を解決するとインストールされます。Androidのビルド設定の一部として、プロジェクトで次のReact Nativeライブラリーを利用できる必要があります。
react-android – JavaScript実行環境とネイティブモジュールとの通信を可能にする、Android向けのコアReact Nativeランタイムライブラリーです。
hermes-android(任意)– パフォーマンス向上と起動時間短縮のためにReact Nativeアプリケーションで使用されるJavaScriptエンジンです。
これらの依存関係は通常、android/app/build.gradleにあるアプリケーションレベルのGradleファイルに含まれています。また、ネイティブモジュールを実装するために、次のReact Native Androidブリッジライブラリーを利用できることを確認してください。
  1. ReactContextBaseJavaModule
  2. ReactMethod
  3. Promise
  4. ReadableMap
  5. ReactPackage
  6. ReactApplicationContext
これらのライブラリーにより、KotlinまたはJavaでネイティブモジュールを実装し、React Nativeのネイティブブリッジを通じてPageSense Android SDKをReact Nativeアプリケーションに公開できます。

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

Androidでは、React Nativeのネイティブモジュールは次の3つの部分で実装されます。
  1. Kotlinネイティブモジュールの実装
  2. React Nativeパッケージの実装
  3. React Nativeパッケージの登録
Androidでは、React NativeブリッジAPIを使用してネイティブメソッドを直接公開します。

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

Kotlinを使用して、PageSense Android SDK用のネイティブモジュールファイルを作成します。このファイルは、React Nativeプロジェクトのルートディレクトリー内にあるandroidフォルダー内の、AndroidアプリケーションのJavaソースパッケージディレクトリーに配置してください。

例:/ProjectRoot/android/app/src/main/java/com/sampleapp/PageSenseSDKModule.kt
  1. package com.sampleapp
  2.  
  3. import com.facebook.react.bridge.*
  4. import com.facebook.react.modules.annotations.ReactModule
  5. import com.zoho.pagesense.android.abtesting.PageSenseClient
  6. import com.zoho.pagesense.android.abtesting.PageSenseClientBuilder
  7. import com.zoho.pagesense.android.abtesting.PageSenseSDKOptions
  8. import com.zoho.pagesense.android.network.ProjectSettingsCallBack
  9. import com.zoho.pagesense.android.logging.LogLevel
  10.  
  11. /**
  • * PageSense Android SDK の機能を React Native
  • * ブリッジを通じて JavaScript レイヤーに公開する React Native ネイティブモジュールです。
  • */
  • @ReactModule(name = PageSenseSDKModule.NAME)
  • class PageSenseSDKModule(private val reactContext: ReactApplicationContext) :
  • ReactContextBaseJavaModule(reactContext) {
  •  
  • companion object {
  • const val NAME = 'PageSenseSDKModule'
  • private const val LOG_TAG = '[PageSenseSDK]'
  • }
  •  
  • private var client: PageSenseClient? = null
  • private var isInitialized = false
  •  
  • override fun getName(): String {
  • return NAME
  • }
  •  
  • /**
  • * PageSense SDK を初期化し、PageSenseClient インスタンスを作成します。
  • * @param accountId プロジェクトに関連付けられている PageSense アカウント ID
  • * @param sdkKey クライアントの認証に使用する SDK キー
  • * @param projectName PageSense プロジェクトの名前
  • * @param promise 初期化結果を返すために使用する React Native Promise
  • * 戻り値:true = SDK の初期化に成功、false = SDK の初期化に失敗
  • */
  • @ReactMethod
  • fun initialiseSDK(
  • accountId: String,
  • sdkKey: String,
  • projectName: String,
  • promise: Promise
  • ) {
  • if (isInitialized) {
  • println('$LOG_TAG SDK はすでに初期化されています')
  • promise.resolve(true)
  • return
  • }
  •  
  • println('$LOG_TAG PageSense SDK を初期化しています...')
  •  
  • val pageSenseSDKOptions = PageSenseSDKOptions()
  • pageSenseSDKOptions.logLevel = LogLevel.DEBUG
  • pageSenseSDKOptions.pollingInterval = 5
  •  
  • PageSenseClientBuilder.createNewPageSenseClient(
  • accountId,
  • sdkKey,
  • projectName,
  • pageSenseSDKOptions,
  • object : ProjectSettingsCallBack {
  • override fun onFailure(message: String?, code: Int?) {
  • println('[PageSense] SDK の初期化に失敗しました:$message')
  • promise.resolve(false)
  • }
  • override fun onSuccess(data: PageSenseClient?) {
  • if (data != null) {
  • client = data
  • isInitialized = true
  • println('[PageSense] SDK の初期化に成功しました')
  • promise.resolve(true)
  • } else {
  • println('[PageSense] SDK の初期化で null クライアントが返されました')
  • promise.resolve(false)
  • }
  • }
  • }
  • )
  • }
  •  
  • /**
  • * PageSense FullStack A/B Testing の実験を有効化します。
  • * @param experimentName PageSense で設定されている実験の名前
  • * @param userId ユーザーを表す一意の識別子
  • * @param attributes オーディエンスのターゲティングに使用するユーザー属性
  • * @param promise バリエーションを返すために使用する React Native Promise
  • * 戻り値:variationName。SDK が初期化されていない場合、またはエラーが発生した場合は null
  • */
  • @ReactMethod
  • fun activateExperiment(
  • experimentName: String,
  • userId: String,
  • attributes: ReadableMap,
  • promise: Promise
  • ) {
  • val clientInstance = client
  • if (clientInstance == null) {
  • println('$LOG_TAG SDK 初期化前に activateExperiment が呼び出されました')
  • promise.resolve(null)
  • return
  • }
  • val attrs = readableMapToHashMap(attributes)
  • try {
  • val variationName = clientInstance.activateExperiment(experimentName, userId, attrs)
  • println('$LOG_TAG バリエーションが有効化されました:$variationName')
  • promise.resolve(variationName)
  • } catch (e: Exception) {
  • println('$LOG_TAG activateExperiment エラー:${e.message}')
  • promise.resolve(null)
  • }
  • }
  •  
  • /**
  • * 実験を有効化せずに、ユーザーに割り当てられているバリエーションを取得します。
  • * @param experimentName 実験の名前
  • * @param userId ユーザーを表す一意の識別子
  • * @param attributes セグメンテーションに使用するユーザー属性
  • * @param promise バリエーションを返すために使用する React Native Promise
  • * 戻り値:variationName。SDK が初期化されていない場合、またはエラーが発生した場合は null
  • */
  • @ReactMethod
  • fun getVariationName(
  • experimentName: String,
  • userId: String,
  • attributes: ReadableMap,
  • promise: Promise
  • ) {
  • val clientInstance = client
  • if (clientInstance == null) {
  • println('$LOG_TAG SDK 初期化前に getVariationName が呼び出されました')
  • promise.resolve(null)
  • return
  • }
  • val attrs = readableMapToHashMap(attributes)
  • try {
  • val variationName = clientInstance.getVariationName(experimentName, userId, attrs)
  • println('$LOG_TAG バリエーションを取得しました:$variationName')
  • promise.resolve(variationName)
  • } catch (e: Exception) {
  • println('$LOG_TAG getVariationNameエラー:${e.message}')
  • promise.resolve(null)
  • }
  • }
  •  
  • /**
  • * PageSenseの実験における目標コンバージョンを追跡します。
  • * @param experimentName 実験の名前
  • * @param userId ユーザーを表す一意の識別子
  • * @param goalName PageSenseで設定された目標の名前
  • * @param attributes イベントに関連付けられたユーザー属性
  • */
  • @ReactMethod
  • fun trackGoal(
  • experimentName: String,
  • userId: String,
  • goalName: String,
  • attributes: ReadableMap
  • ) {
  • val clientInstance = client ?: run {
  • println('$LOG_TAG SDK初期化前にtrackGoalが呼び出されました')
  • return
  • }
  • val attrs = readableMapToHashMap(attributes)
  • try {
  • clientInstance.trackGoal(experimentName, userId, goalName, attrs)
  • println('$LOG_TAG 目標を追跡しました:$goalName')
  • } catch (e: Exception) {
  • println('$LOG_TAG trackGoalエラー:${e.message}')
  • }
  • }
  •  
  • /**
  • * React NativeのReadableMapをHashMap<String,String>に変換します。
  • * @param map React Nativeから受け取ったReadableMap
  • * 戻り値:ユーザー属性を含むHashMap<String,String>
  • */
  • private fun readableMapToHashMap(map: ReadableMap): HashMap<String, String> {
  • val hashMap = HashMap<String, String>()
  • val iterator = map.keySetIterator()
  • while (iterator.hasNextKey()) {
  • val key = iterator.nextKey()
  • val value = map.getString(key)
  • if (value != null) { hashMap[key] = value }
  • }
  • return hashMap
  • }
  • }

  • ii. React Nativeパッケージファイルの作成

    AndroidネイティブモジュールをReact Nativeアプリケーション層と連携させるために、React Nativeパッケージファイルを作成します。このファイルにより、Android KotlinモジュールがReact Nativeに公開され、ネイティブAndroid実装とReact Nativeコードベース間の通信が可能になります。このファイルは、React Nativeプロジェクトのルートディレクトリー内にあるandroidフォルダーの、AndroidアプリケーションのJavaソースパッケージディレクトリーに配置する必要があります。

    例:/ProjectRoot/android/app/src/main/java/com/sampleapp/PageSenseSDKPackage.kt

    1. package com.sampleapp
    2.  
    3. import com.facebook.react.ReactPackage
    4. import com.facebook.react.bridge.NativeModule
    5. import com.facebook.react.bridge.ReactApplicationContext
    6. import com.facebook.react.uimanager.ViewManager
    7.  
    8. /**
    9. * PageSenseSDKModuleの登録を担うReact Nativeパッケージです。
    10. * このモジュールはNativeModules.PageSenseSDKModuleを通じてアクセスできます。
    11. */
    12. class PageSenseSDKPackage : ReactPackage {
    13.  
    14. companion object {
    15. private const val LOG_TAG = '[PageSenseSDK]'
    16. }
    17.  
    18. /**
    19. * React Nativeからアクセスできるネイティブモジュールを登録します。
    20. * @param reactContext React Nativeによって提供されるReactApplicationContextインスタンス。
    21. * 戻り値:React Nativeブリッジに登録するList<NativeModule>。
    22. */
    23. override fun createNativeModules(
    24. reactContext: ReactApplicationContext
    25. ): List<NativeModule> {
    26. println('$LOG_TAG PageSenseSDKModuleをReact Nativeブリッジに登録しています')
    27. return listOf(PageSenseSDKModule(reactContext))
    28. }
    29.  
    30. /**
    31. * ネイティブビューマネージャーをReact Nativeに登録します。
    32. * @param reactContext ReactApplicationContextインスタンス。
    33. * 戻り値:React Nativeに公開されるList<ViewManager<*, *>>。
    34. */
    35. override fun createViewManagers(
    36. reactContext: ReactApplicationContext
    37. ): List<ViewManager<*, *>> {
    38. println('$LOG_TAG PageSenseに登録されたネイティブビューマネージャーはありません')
    39. return emptyList()
    40. }
    41. }

    iii. React Nativeパッケージの登録

    React NativeパッケージはAndroidアプリケーションに登録する必要があります。AndroidファイルMainApplication.ktを編集し、React Nativeパッケージの一覧にこのパッケージを追加します。これにより、PageSenseSDKモジュールにReact Nativeアプリケーションからアクセスできるようになります。

    1. package com.sampleapp
    2.  
    3. インポート android.app.Application
    4. インポート com.facebook.react.PackageList
    5. インポート com.facebook.react.ReactApplication
    6. インポート com.facebook.react.ReactHost
    7. インポート com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative
    8. インポート com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
    9. インポート com.sampleapp.PageSenseSDKPackage
    10.  
    11. class MainApplication : Application(), ReactApplication {
    12.  
    13. override val reactHost: ReactHost by lazy {
    14. getDefaultReactHost(
    15. context = applicationContext,
    16. packageList =
    17. PackageList(this).packages.apply {
    18. // まだ自動リンクできないパッケージは、ここに手動で追加できます
    19. add(PageSenseSDKPackage())
    20. },
    21. )
    22. }
    23.  
    24. override fun onCreate() {
    25. super.onCreate()
    26. loadReactNative(this)
    27. }
    28. }

    React Nativeラッパーの作成

    React NativeアプリケーションとネイティブのPageSense SDK実装が連携できるように、React Nativeラッパーファイルを作成します。このラッパーは、React NativeアプリケーションのJavaScript/TypeScriptコードにネイティブモジュールのメソッドを公開するインターフェイス層として機能します。
    ラッパーファイルは、プロジェクトのルートディレクトリーを基準に、プロジェクト構造内の次のパスに作成します:src/sdk/PageSenseSDKWrapper.ts
    1. インポート { NativeModules } from 'react-native';
    2.  
    3. // React Nativeブリッジを通じて公開されているネイティブモジュールを抽出します。
    4. const { PageSenseSDKModule } = NativeModules;
    5.  
    6. /**
    7. * PageSenseSDKWrapperは、JavaScriptインターフェイスを提供します。
    8. * React Nativeのネイティブブリッジを介してPageSense SDKと連携するためのものです。
    9. */
    10. class PageSenseSDKWrapper {
    11.  
    12. /**
    13. * PageSense SDKを初期化します。アプリケーションの起動時に1回だけ呼び出してください。
    14. * @param {string} accountId - PageSenseアカウントの識別子。
    15. * @param {string} sdkKey - 認証に使用するSDKキー。
    16. * @param {string} projectName - PageSenseプロジェクトの名前。
    17. * @returns {Promise<boolean>} true = 初期化成功、false = 失敗
    18. */
    19. async initialiseSDK(accountId, sdkKey, projectName) {
    20. try {
    21. this._validateString(accountId, 'accountId');
    22. this._validateString(sdkKey, 'sdkKey');
    23. this._validateString(projectName, 'projectName');
    24. const result = await PageSenseSDKModule.initialiseSDK(accountId, sdkKey, projectName);
    25. return result === true;
    26. } catch (error) {
    27. console.log('[PageSenseSDK] initialiseSDK error:', error);
    28. return false;
    29. }
    30. }
    31.  
    32. /**
    33. * エクスペリメントを有効化し、割り当てられたバリエーションを返します。
    34. * @param {string} experimentName - エクスペリメントの名前。
    35. * @param {string} userId - 一意のユーザー識別子。
    36. * @param {Object.<string, string>} [attributes] - 任意のユーザー属性。
    37. * @returns {Promise<string|null>} バリエーション名。バリエーションがない場合またはエラーの場合はnull
    38. */
    39. async activateExperiment(experimentName, userId, attributes) {
    40. try {
    41. this._validateString(experimentName, 'experimentName');
    42. this._validateString(userId, 'userId');
    43. this._validateAttributes(attributes);
    44. const safeAttributes = attributes || {};
    45. const variation = await PageSenseSDKModule.activateExperiment(
    46. experimentName, userId, safeAttributes
    47. );
    48. return variation ?? null;
    49. } catch (error) {
    50. console.log('[PageSenseSDK] activateExperiment error:', error);
    51. return null;
    52. }
    53. }
    54.  
    55. /**
    56. * エクスペリメントを有効化せずにバリエーション名を取得します。
    57. * @param {string} experimentName - エクスペリメントの名前。
    58. * @param {string} userId - 一意のユーザー識別子。
    59. * @param {Object.<string, string>} [attributes] - 任意のユーザー属性。
    60. * @returns {Promise<string|null>} バリエーション名。利用できない場合またはエラーの場合はnull
    61. */
    62. async getVariationName(experimentName, userId, attributes) {
    63. try {
    64. this._validateString(experimentName, 'experimentName');
    65. this._validateString(userId, 'userId');
    66. this._validateAttributes(attributes);
    67. const safeAttributes = attributes || {};
    68. const variation = await PageSenseSDKModule.getVariationName(
    69. experimentName, userId, safeAttributes
    70. );
    71. return variation ?? null;
    72. } catch (error) {
    73. console.log('[PageSenseSDK] getVariationName error:', error);
    74. return null;
    75. }
    76. }
    77.  
    78. /**
    79. * エクスペリメントのゴールイベントをトラッキングします。
    80. * @param {string} experimentName - エクスペリメントの名前。
    81. * @param {string} userId - 一意のユーザー識別子。
    82. * @param {string} goalName - ゴールの名前。
    83. * @param {Object.<string, string>} [attributes] - 任意のゴール属性。
    84. * @returns {void}
    85. */
    86. trackGoal(experimentName, userId, goalName, attributes) {
    87. 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);
  • }
  • }
  •  
  • /**
  • * 指定されたパラメーターが空でない文字列かどうかを検証します。
  • * @private
  • * @throws {Error} param が空でない文字列でない場合
  • */
  • _validateString(param, paramName) {
  • if (typeof param !== 'string' || param.trim() === '') {
  • throw new Error(`[PageSenseSDK] 無効な${paramName}:空でない文字列である必要があります`);
  • }
  • }
  •  
  • /**
  • * attributes オブジェクトが有効なキーと値のペア構造であることを検証します。
  • * @private
  • * @throws {Error} attributes が無効な場合
  • */
  • _validateAttributes(attributes) {
  • if (attributes === undefined || attributes == null) return;
  • if (typeof attributes !== 'object' || Array.isArray(attributes)) {
  • throw new Error('[PageSenseSDK] attributes はキーと値のオブジェクトである必要があります');
  • }
  • for (const key in attributes) {
  • if (typeof key !== 'string' || key.trim() === '') {
  • throw new Error('[PageSenseSDK] 無効な属性キー:空でない文字列である必要があります');
  • }
  • const value = attributes[key];
  • if (typeof value !== 'string') {
  • throw new Error(`[PageSenseSDK] 属性 '${key}' の値が無効です。許可される型:string`);
  • }
  • }
  • }
  • }
  •  
  • // シングルトンインスタンスをエクスポート
  • エクスポート default new PageSenseSDKWrapper();
  • SDKの初期化

    PageSense SDKは、アプリケーションのライフサイクル中に一度だけ初期化する必要があります。理想的には、アプリの起動時に初期化します。たとえば、React Nativeアプリケーションのメインエントリーポイント(App.jsxやApp.jsなど)で、コンポーネントをレンダリングしたり、実験関連のロジックを実行したりする前にSDKを初期化できます。この方法により、SDKの設定が完了し、アプリ内で必要なときにいつでも利用できるようになります。
    1. /**
    2. * ルートアプリケーションコンポーネントは、アプリの起動時に PageSense SDK を初期化します。
    3. * SDK の初期化が完了してから UI をレンダリングします。
    4. */
    5. export default function App() {
    6.  
    7. const [sdkReady, setSdkReady] = useState(false);
    8.  
    9. useEffect(() => {
    10. async function initializeSDK() {
    11. try {
    12. const result = await PageSenseSDKWrapper.initialiseSDK(
    13. 'PAGESENSE_ACCOUNT_ID', // PageSense アカウントID
    14. 'PAGESENSE_SDK_KEY', // SDKキー
    15. 'PAGESENSE_PROJECT_NAME', // プロジェクト名
    16. );
    17. console.log('PageSense SDK の初期化に成功しました:', result);
    18. setSdkReady(true);
    19. } catch (error) {
    20. console.log('PageSense SDK の初期化エラー:', error);
    21. // SDK の初期化に失敗してもアプリの処理は続行します
    22. setSdkReady(true);
    23. }
    24. }
    25. initializeSDK();
    26. }, []);
    27.  
    28. if (!sdkReady) {
    29. return (
    30. <View style={styles.loadingContainer}>
    31. <ActivityIndicator size='large' />
    32. <Text style={styles.loadingText}>アプリを初期化しています...</Text>
    33. </View>
    34. );
    35. }
    36.  
    37. return (
    38. ....アプリケーション UI の実装
    39. );
    40. }

    実験の有効化

    実験は画面の読み込み時に実行してください。これにより、ユーザーが適切なバリエーションに割り当てられ、ユーザーインターフェイスや機能に関連する変更がすぐに適用されます。画面がアクティブになると同時に実験がトリガーされるため、一貫した動作と正確なバリエーション割り当てが可能になります。たとえば、React Native コンポーネントでは、App.jsx、App.js、または関連する画面コンポーネントの useEffect などのライフサイクルメソッド内で実験を呼び出すことで、画面のマウント時に一度だけ実行できます。
    1. /**
    2. * 実験を実行し、適切な UI バリエーションを適用します。
    3. */
    4. try {
    5. const variation = await PageSenseSDKWrapper.activateExperiment(
    6. 'EXPERIMENT_NAME', // 実験名
    7. 'USER_ID', // 一意のユーザー識別子
    8. 'USER_ATTIBUTES' // 任意のユーザー属性
    9. );
    10.  
    11. console.log('実験のバリエーション:', variation);
    12.  
    13. switch (variation) {
    14. case 'Original':
    15. setButtonColor('#4F46E5'); // 標準の紫色
    16. break;
    17. case 'Variation 1':
    18. setButtonColor('#EF4444'); // 赤いボタン
    19. break;
    20. case 'Variation 2':
    21. setButtonColor('#16A34A'); // 緑のボタン
    22. break;
    23. case 'Variation 3':
    24. setButtonColor('#F59E0B'); // オレンジのボタン
    25. break;
    26. default:
    27. setButtonColor('#6B7280'); // フォールバック用のニュートラルグレー
    28. }
    29. } catch (e) {
    30. console.log('実験エラー', e);
    31. setButtonColor('#6B7280');
    32. }

    目標の追跡

    目標の追跡は、ユーザーがアプリケーション内で特定の操作やイベントを完了した直後に実行してください。これにより、コンバージョン、インタラクション、その他の主要なパフォーマンス指標がリアルタイムで記録され、実験の効果分析に必要な正確でタイムリーなデータを取得できます。たとえば、ユーザーがボタンをタップしたり、フォームを送信したり、購入を完了したりした場合は、対応する目標を PageSense SDK に送信して追跡します。
    1. /**
    2. * 指定した実験の目標イベントを追跡します。
    3. */
    4. PageSenseSDKWrapper.trackGoal(
    5. 'EXPERIMENT_NAME', // 目標イベントに関連付けられた実験
    6. 'USER_ID', // 一意のユーザー識別子
    7. 'GOAL_NAME', // PageSense で定義された目標名
    8. 'USER_ATTIBUTES'); // 任意のユーザー属性

    ベストプラクティス

    1. SDK は、プロジェクトのアプリケーションライフサイクル中に一度だけ初期化してください。
    2. アプリケーションの起動時に SDK を初期化し、実験をすぐに利用できるようにしてください。
    3. SDK の初期化に失敗しても、アプリケーションで UI のレンダリングをブロックしないでください。
    4. SDK の初期化に失敗した場合は、フォールバック UI を使用してください。
    5. PageSenseClient インスタンスは、アプリケーションセッション全体を通じて保持してください。
    6. 実験を正しく追跡できるよう、アプリケーションセッション全体で一貫したユーザー ID を使用してください。
    7. Null バリエーションに対応してください。常に安全な標準 UI にフォールバックしてください。
    8. ネイティブクラスには UI の状態を保存せず、SDK 関連のオブジェクトのみを保存してください。
    9. 目標は、特定のユーザー操作またはイベントが正常に完了した後にトリガーしてください。
    10. 開発中のデバッグを支援するために、構造化ログを使用してください。

    まとめ

    このガイドでは、React Native のネイティブブリッジを使用して PageSense Android SDK を React Native アプリケーションに連携する方法について説明しました。
    連携プロセスには、次の手順が含まれます。
    1. PageSense Android SDK のインストール
    2. ネイティブブリッジクラスの作成
    3. React Native パッケージの登録
    4. JavaScript ラッパーの実装
    5. SDK の初期化
    6. 実験の有効化
    7. 実験目標の追跡
    連携が完了すると、React Native アプリケーションでは、クリーンで拡張性のあるアーキテクチャを維持しながら、PageSense FullStack の A/B テスト機能を最大限に活用できます。




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