メインコンテンツまでスキップ
バージョン: 4.6.1

基本コントロール統合

コードベース統合を使用してNetFUNNEL Androidエージェントで基本コントロールを実装する完全なガイドです。

統合方法

これは利用可能な2つの統合方法のうちの1つです。統合方法概要を参照して区間コントロールと比較し、ユースケースに最も適した方法を選択してください。


動作方式

ユーザー体験:

  1. ユーザーがボタンをクリックするか、作業をトリガーします
  2. 現在の画面に待合室が表示されます
  3. 進入が許可されると待合室が閉じられ、サービスが継続されます

最適用途:

  • ボタンクリック保護(ログイン、決済、注文)
  • API呼び出し制限
  • 特定の作業に対する精密制御

区間コントロールとの主な違い:

  • 基本コントロール: 進入速度を制御します(キーが迅速に返却される)
  • 区間コントロール: 固定された同時ユーザー数を維持します(区間終了までキーが維持される)

事前要件

サンプルアプリケーション例

このガイドはサンプルアプリケーションを使用して基本コントロール統合パターンを示します。実際のアプリケーションコードは表示された例と異なる場合があります。統合概念を理解し、パターンを特定のコードベース、関数名、ビジネスロジックに合わせて調整することに集中してください。

💡 練習テンプレート: NetFUNNEL SDK統合練習のための**Androidアプリケーション(Single Activity)**テンプレートが準備されたサンプルプロジェクトを確認してください。


ステップ1: セグメント作成

2つの制御タイプをサポート

コードベース統合は基本コントロール区間コントロールの両方をサポートします。このガイドは基本コントロールを使用します。

1.1 新しいセグメント作成

  1. NetFUNNELコンソール → プロジェクトセグメントに移動します
  2. **+**ボタンをクリックして新しいセグメントを作成します

Create segment button

1.2 制御タイプ選択

基本コントロールを選択し、次へをクリックします

Select Basic Control

1.3 セグメント構成

セグメント名: 説明的な名前を入力します(例: "ログインボタン"、"決済プロセス"、"API呼び出し保護")

Enter segment name

進入状態:

  • セグメントの有効化 有効化済み
  • 進入状態: 待機(ユーザーを待合室に送る)

Entry status settings

待合室適用:

  • テストのためにデフォルト設定を使用
  • ライブメッセージは空のままにします

Waiting room settings

進入許容数:

  • テストのために0に設定(誰も許可されない、待合室が常に表示される)

Limited inflow setting

1.4 セグメント作成

作成をクリックしてセグメントを完了します

Segment created


ステップ2: キー発行統合ポイントの識別(nfStart

サンプルアプリケーション

次の例はデモ目的でサンプルアプリケーションを使用します。実際のアプリケーションコードはここに表示されたものと自然に異なる場合があります。統合パターンを特定のコード構造、ボタンID、関数名、ビジネスロジックに合わせて調整してください。

💡 練習プロジェクトが必要ですか? NetFUNNEL SDK統合練習のための**Androidアプリケーション(Single Activity)**テンプレートが準備されたサンプルプロジェクトを確認してください。

サンプルアプリケーションの理解:

NetFUNNEL保護を適用する必要がある位置を理解するために、サンプルアプリケーションを見てみましょう:

2.1 レイアウトから対象ボタンの識別

<!-- fragment_main.xml -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_basic_control_function"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="12dp"
app:cardElevation="4dp"
app:rippleColor="?attr/colorPrimary"
app:strokeColor="?attr/colorPrimary"
app:strokeWidth="1dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/basic_control_function"
android:textAppearance="?attr/textAppearanceTitleLarge"
android:textColor="?attr/colorPrimary" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="@string/basic_control_function_desc"
android:textAppearance="?attr/textAppearanceBodyMedium" />

</LinearLayout>
</com.google.android.material.card.MaterialCardView>

このサンプルに関する仮定:

  • "基本コントロール"ボタンはリソース集約的な作業を表します
  • これはユーザーログイン、決済処理、ファイルアップロード、またはデータエクスポートである可能性があります
  • 多くのユーザーが同時にこのボタンをクリックすると、サーバーに過負荷が発生する可能性があります
  • 他のボタンは重要度が低く、保護は不要です

2.2 このボタンのクリックリスナーを見つける

クリックリスナーとは何ですか?

クリックリスナー(イベントハンドラーまたはクリックハンドラーとも呼ばれる)は、ユーザーがUI要素と相互作用するときに実行されるコードです。Androidでは通常、setOnClickListener()メソッドまたはラムダ式を使用して定義されます。

Androidクリックリスナー構造の理解:

// 方法1: ラムダ式(最も一般的)
button.setOnClickListener {
// 🎯 これがクリックリスナーです
// ユーザーがボタンをタップするとき、ここでコードが実行されます
}

// 方法2: 匿名オブジェクト(伝統的)
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
// 🎯 これがクリックリスナーです
// ユーザーがボタンをタップするとき、ここでコードが実行されます
}
})

サンプルアプリケーションで:

// MainFragment.kt
override fun setupViews() {
// 🎯 対象ボタン: 基本コントロール機能カード
binding.cardBasicControlFunction.setOnClickListener {
// 🎯 クリックリスナー: ボタンの動作が定義される位置
// ユーザーがボタンをクリックするときに実行されるコードです
// 現在: navigationManager.navigateWithDelay()が即座に実行されます
// これをNetFUNNEL保護で包む予定です
Log.d("MainActivity", "Basic Control (Code-based Integration) button clicked")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

// 他のボタン - 対象ではない(NetFUNNEL保護不要)
binding.cardSectionControlFunction.setOnClickListener {
// このボタンはNetFUNNEL保護は不要です
Log.d("MainActivity", "Section Control Function button clicked")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_sectionControlSection1Fragment
)
}
}
}

核心事項:

  • クリックリスナーの位置: setOnClickListenerラムダ内部
  • 現在の動作: navigationManager.navigateWithDelay()が即座に実行される
  • 統合対象: ここにNetFUNNEL保護を追加します

2.3 クリックリスナー内部で発生することを確認

関数が実行する作業:

// NavigationManager.kt
suspend fun navigateWithDelay(
resId: Int,
customDelay: Long? = null
) {
val delay = customDelay ?: appPreferences.getNavigationDelay()

showLoadingIndicator() // ← ローディングインジケーター表示
delay(delay) // ← 指定された時間待機
hideLoadingIndicator() // ← ローディングインジケーター非表示

navController?.navigate(resId) // ← 対象fragmentに移動
}

要約: ローディング表示 → 待機 → ローディング非表示 → 移動。これはサーバー処理をシミュレートし、NetFUNNEL保護が必要です。

2.4 統合ポイントの識別

  1. 対象ボタン: card_basic_control_function(リソース集約的なボタン)
  2. クリックリスナー: setupViews()メソッドがクリックハンドラーを設定します
  3. 統合位置: navigationManager.navigateWithDelay()が呼び出される直前
  4. ここで行う理由: サーバー処理が開始される直前の正確な時点です
  5. 保護戦略: サーバー呼び出し前にNetFUNNELキューを追加します

全体フロー分析:

  1. Fragment作成: onViewCreated()setupViews()を呼び出します
  2. ボタン設定: setupViews()が各ボタンのクリックリスナーを設定します
  3. ユーザー作業: ユーザーが"基本コントロール(コードベース統合)"ボタンをクリックします
  4. 現在の動作: navigationManager.navigateWithDelay()が即座に実行されます
  5. サーバー負荷: これがリソース集約的な作業をトリガーします

ロジック:

  • NetFUNNELなし: ボタンクリック → 即座にサーバーリクエスト → 潜在的な過負荷
  • NetFUNNEL使用: ボタンクリック → キュー確認 → 制御されたサーバーリクエスト → 成功

ステップ3: キー発行関数の実装(nfStart

コードに合わせて調整

以下の例はサンプルアプリケーションのMainFragmentクリックハンドラーにNetFUNNELを統合する方法を示します。このパターンを実際のコード構造に合わせて調整してください - 保護が必要な他の関数名、イベントハンドラー、またはビジネスロジックがある場合があります。

3.1 キーの取得

まず、コンソールからプロジェクトキーとセグメントキーを見つけてください:

  1. NetFUNNELコンソール → プロジェクトセグメントに移動します
  2. セグメントをクリックします
  3. プロジェクトキーセグメントキーをコピーします

Project and segment keys

3.2 nfStart関数の理解

nfStart関数は次のような基本構造を持ちます:

Netfunnel.nfStart(
projectKey = "your_project_key", // コンソールから取得
segmentKey = "your_segment_key", // コンソールから取得
callback = yourCallback, // 応答を処理するコールバック
activity = this // 現在のactivityコンテキスト
)
APIリファレンス

nfStartパラメータ、コールバック処理、応答形式の詳細については、APIリファレンスを参照してください。

3.3 現在のコードから開始

現在の実装:

// MainFragment.kt
override fun setupViews() {
binding.cardBasicControlFunction.setOnClickListener {
Log.d("MainActivity", "Basic Control (Code-based Integration) button clicked")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}
}

核心概念:

  • ビジネスロジック: navigationManager.navigateWithDelay()はリソース集約的な作業を表します
  • 統合ポイント: このビジネスロジックをNetFUNNEL保護で包む必要があります
  • 包む戦略: ビジネスロジックが実行される前にnfStart()を使用してアクセスを制御します

ここで包む理由:

  • サーバー負荷が開始される直前の正確な瞬間です
  • ここで包むと、すべてのダウンストリーム作業が保護されます
  • ビジネスロジックは変更されません - キューレイヤーのみが追加されます

3.4 必須importの追加

NetFUNNELを実装する前に、Fragmentに必要なimportを追加します:

// MainFragment.kt
import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback

核心Import:

  • com.nf4.Netfunnel - メインNetFUNNELクラス
  • com.nf4.NetfunnelCallback - 応答のためのコールバックインターフェース

3.5 基本NetFUNNEL保護の追加(成功のみ)

ビジネスロジックを包む:

// MainFragment.kt
import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback

override fun setupViews() {
binding.cardBasicControlFunction.setOnClickListener {
Log.d("MainActivity", "Basic Control (Code-based Integration) button clicked")
startBasicControl()
}

binding.cardSectionControlFunction.setOnClickListener {
Log.d("MainActivity", "Section Control Function button clicked")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_sectionControlSection1Fragment
)
}
}
}

private fun startBasicControl() {
Netfunnel.nfStart(
projectKey = "your_project_key",
segmentKey = "your_segment_key",
callback = basicControlCallback,
activity = requireActivity()
)
}

private val basicControlCallback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
// ユーザーが進行可能 - 元のロジックを実行
Log.d("NetFUNNEL", "onSuccess(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

override fun onBlock(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "onBlock(statusCode=$statusCode, message='$message')")
}

override fun onClose(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "onClose(statusCode=$statusCode, message='$message')")
}

override fun onContinue(
statusCode: Int,
message: String,
aheadWait: Int,
behindWait: Int,
waitTime: String,
progressRate: Int
) {
Log.d("NetFUNNEL", "onContinue(statusCode=$statusCode, message='$message', aheadWait=$aheadWait, behindWait=$behindWait, waitTime='$waitTime', progressRate=$progressRate)")
}

override fun onError(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "onError(statusCode=$statusCode, message='$message')")
}

override fun onNetworkError(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "onNetworkError(statusCode=$statusCode, message='$message')")
}
}

変更事項:

  • 包まれた: navigationManager.navigateWithDelay()onSuccessコールバック内部にあります
  • 条件付き: 特定のボタンのみがNetFUNNEL保護を受けます
  • 成功のみ: NetFUNNELが進入を許可する場合のみビジネスロジックが実行されます
  • 完全なインターフェース: すべての必須コールバックメソッドが適切なロギングとともに実装されています
Androidインターフェース要件

AndroidではNetfunnelCallbackはすべてのメソッドを実装する必要があるインターフェースです。 onSuccessのみを実装することはできません - すべてのコールバックメソッドに対する実装を提供する必要があります。この実装は、すべての応答タイプに対する適切なロギングとともに完全なコールバック処理を提供します。

実装をテストして、すべてが正しく動作することを確認してください。

アプリを実行し、"基本コントロール(コードベース統合)"ボタンをクリックしてください。画面に待合室WebViewが表示されるはずです。すべてが正しく動作することを確認するには、LogcatでNetFUNNELログを確認してください。

待合室が表示されない場合

待合室が表示されない場合は、セグメント構成ステップで進入許容数を0に設定したかどうかを確認してください。この設定は、ユーザーが待合室に送られるか、直接進行できるかを制御します。

より良いデバッグのためにNetFUNNELロギングを有効化:

ApplicationクラスでprintLog = trueを設定してデバッグロギングを有効化し、Logcatをpackage:mine NetFUNNELでフィルタリングしてください。詳細な設定手順については、NetFUNNEL初期化テスト)セクションを参照してください。

確認事項:

進入許容数 = 0で基本コントロールボタンをクリックすると、次のようなログが表示されます:

2025-09-15 14:21:45.762  5659-5659  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 14:21:52.685 5659-5675 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5101), Work(projectKey=service_1, segmentKey=test_liam_01), Control(BASIC)
2025-09-15 14:21:52.727 5659-5677 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5101 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5101&sid=service_1&aid=test_liam_01
2025-09-15 14:21:54.177 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5101 response. Response(timestamp=1757913714588, code=201, msg=null, key=A06C985C93A27FA585B6EB31707D8F75560B09C0ABA476E93DAAFF65D8F81E1F2AA6D7A151BC9D46A7A70B04309F5684BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 14:21:54.184 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=test_liam_01), Status(WAIT)
2025-09-15 14:21:55.745 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Fetching HTML content from following URL. https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html
2025-09-15 14:21:56.368 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=A06C985C93A27FA585B6EB31707D8F75560B09C0ABA476E93DAAFF65D8F81E1F2AA6D7A151BC9D46A7A70B04309F5684BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30&sticky=nf1
2025-09-15 14:21:56.406 5659-5765 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757913717559, code=201, msg=null, key=A06C985C93A27FA585B6EB31707D8F7501186C02D6377624BD336C0B9EABC7B23E0DA90D4459587BF1B066C976432A52BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D31302C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)

すべてが動作中であることを示す核心指標:

ログメッセージ意味状態
[NF4] Initialization successfulNetFUNNELエージェントが正しくロードされた✅ 良好
[NF4] Initial entry detectednfStart()が正常に呼び出された✅ 良好
[NF4] Sending 5101 requestNetFUNNELサーバーにリクエストが送信された✅ 良好
[NF4] Received 5101 response with code=201サーバーがWAIT状態で応答した✅ 良好
[NF4] Loading the virtual room待合室WebViewがロード中✅ 良好
[NF4] Fetching HTML content待合室HTMLがロード中✅ 良好
[NF4] Sending 5002 request定期的な再進入リクエスト(ポーリング)✅ 良好

問題が発生した場合:

  • ログが表示されない: 初期化でprintLog = trueが設定されているか確認
  • 待合室がない: コンソールで進入許容数が0に設定されているか確認
  • アプリクラッシュ: すべてのコールバックメソッドが正しく実装されているか確認
  • ネットワークエラー: clientIdおよびネットワーク接続を確認

待合室とログが表示されれば、基本実装が動作しています!エラー管理を改善するためにコールバック処理を強化できます。進入をテストするには、コンソールで進入許容数を1に変更してください。

3.6 完全なコールバック処理の追加

エラー管理とユーザー体験を向上させるためにコールバック処理を改善します:

前のステップで、すべてのコールバックメソッドを基本ロギングとともに実装しました。本番環境で堅牢なサービス可用性と最適なユーザー体験を確保するために、エラー処理を強化します。

完全なコールバック処理が必須である理由:

  • ユーザー体験: さまざまな応答タイプに対する適切なユーザーフィードバックが必要です
  • サービス安定性: エラー状態がユーザーのワークフローを中断してはなりません
  • デバッグ: 包括的なロギングが問題を迅速に識別するのに役立ちます
  • ビジネス継続性: NetFUNNELに問題が発生してもサービスが継続する必要があります

堅牢なエラー処理でbasicControlCallbackを強化:

// MainFragment.kt - 完全な処理を含むbasicControlCallbackの更新
private val basicControlCallback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
// ユーザーが進行可能 - 元のロジックを実行
Log.d("NetFUNNEL", "onSuccess(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

override fun onError(statusCode: Int, message: String) {
// システムエラー発生 - サービス可用性のために元のロジックを進行
Log.d("NetFUNNEL", "onError(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

override fun onNetworkError(statusCode: Int, message: String) {
// ネットワークエラー発生 - デバッグのためにロギングのみ実行、ビジネスロジックは実行しない
Log.d("NetFUNNEL", "onNetworkError(statusCode=$statusCode, message='$message')")
// 注意: ビジネスロジックはここで実行されない - 以下の説明を参照
}

override fun onBlock(statusCode: Int, message: String) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "onBlock(statusCode=$statusCode, message='$message')")
}

override fun onClose(statusCode: Int, message: String) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "onClose(statusCode=$statusCode, message='$message')")
// メインfragmentに留まる - ユーザーがキャンセルした
}

override fun onContinue(
statusCode: Int,
message: String,
aheadWait: Int,
behindWait: Int,
waitTime: String,
progressRate: Int
) {
Log.d("NetFUNNEL", "onContinue(statusCode=$statusCode, message='$message', aheadWait=$aheadWait, behindWait=$behindWait, waitTime='$waitTime', progressRate=$progressRate)")
}
}

応答処理戦略:

応答タイプ動作ビジネスロジック
Success実行✅ はい
Error実行✅ はい
NetworkErrorロギングのみ❌ いいえ
Blockロギングのみ❌ いいえ
Closeロギングのみ❌ いいえ
Continueロギングのみ❌ いいえ

onErrorはビジネスロジックを実行するがonNetworkErrorは実行しない理由:

onError(ステータスコード500)- サーバーエラー:

  • シナリオ: NetFUNNELサーバーが内部エラーに遭遇
  • 戦略: サービス可用性を維持するためにビジネスロジックを実行
  • 根拠: サーバーエラーは一般的に一時的であり、ユーザーアクセスをブロックすべきではない
  • 結果: NetFUNNELに問題があっても継続する堅牢なサービス

onNetworkError(ステータスコード1001、1002)- ネットワーク問題:

  • シナリオ: ネットワーク接続の問題(オフライン、タイムアウト)
  • 戦略: ロギングのみ実行、ビジネスロジックは実行しない
  • 根拠: 自動ネットワーク回復のためにuseNetworkRecoveryMode = trueを使用
  • 結果: ネットワーク問題中にユーザーが待合室に留まり、接続が回復すると自動的に再開

ネットワーク回復モードの構成:

最適なネットワークエラー処理のために、Applicationクラスでネットワーク回復を有効化します:

// SampleApplication.kt
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
useNetworkRecoveryMode = true // 自動ネットワーク回復を有効化
)

変更事項:

  • 堅牢なエラー処理: onErrorは最大サービス可用性のためにビジネスロジックを進行します
  • スマートネットワーク処理: onNetworkErrorは手動処理ではなくネットワーク回復モードに依存します
  • 改善されたユーザー体験: さまざまな応答状態に対するより良い処理
  • 本番準備: 堅牢なエラー処理は、NetFUNNELに問題が発生してもサービスが継続することを保証します
  • 包括的なロギング: すべての応答タイプおよびデバッグに対する詳細なコンソールメッセージ
完全なAPIリファレンス

すべてのコールバック応答タイプ、ステータスコード、応答オブジェクト構造、および高度なコールバックパターンの詳細については、APIリファレンスを参照してください。

3.7 主要な実装ポイント

  1. Project/Segment keys: NetFUNNELコンソールから正確なキーを使用します
  2. 必須import: com.nf4.Netfunnelおよびcom.nf4.NetfunnelCallbackのimportを追加します
  3. コールバック実装: すべてのコールバックメソッドを実装します(Androidインターフェース要件)
  4. 堅牢なエラー処理:
    • onSuccessおよびonErrorはサービス可用性のためにビジネスロジックを実行します
    • onNetworkErrorはロギングのみ実行します(自動回復のためにuseNetworkRecoveryMode = trueを使用)
  5. Activityコンテキスト: 常に現在のactivityコンテキストをnfStart()に渡します
  6. 包括的なロギング: デバッグのためにすべてのコールバック応答をロギングします

ステップ4: キー返却統合ポイントの識別(nfStop

サンプルアプリケーション

次の例はデモ目的でサンプルアプリケーションを使用します。実際のアプリケーションコードはここに表示されたものと自然に異なる場合があります。統合パターンを特定のコード構造、ビジネスロジック完了ポイント、キー返却要件に合わせて調整してください。

💡 練習プロジェクトが必要ですか? NetFUNNEL SDK統合練習のための**Androidアプリケーション(Single Activity)**テンプレートが準備されたサンプルプロジェクトを確認してください。

サンプルアプリケーションの理解:

NetFUNNELキーを返却するためにnfStopを呼び出す必要がある位置を理解するために、サンプルアプリケーションを見てみましょう。

4.1 ビジネスロジック完了ポイントの識別

nfStart成功後の現在のフロー:

// ステップ3から - nfStartが成功するとき
override fun onSuccess(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "onSuccess(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

次に発生すること:

  1. ユーザーがBasicControlFragmentに移動 - Fragmentライフサイクルが開始されます
  2. Fragmentが完全にロードされる - onCreateView()setupViews()完了
  3. ユーザーセッションがアクティブになる - これで保護された機能を使用できます
  4. キーを返却する必要がある - キュー内の次のユーザーが進入できるようにします

nfStop実装に関する重要な注意事項: nfStopnfStartが先に呼び出される必要なく、独立して呼び出すことができます。nfStartが呼び出されなかった場合、NetFUNNELは必要に応じてキー解放を自動的に処理するか、キーがなければ何も実行しません。これにより、条件付き確認なしでどのシナリオでもnfStopを安全に呼び出すことができ、実装が単純になります。

4.2 キー返却のための統合ポイントの識別

統合ポイントオプション:

統合ポイント使用時期利点
Fragmentライフサイクルシンプルなナビゲーションフロー実装が簡単で、ほとんどの場合に動作します
ビジネスロジック完了複雑な作業(API呼び出し、処理)精密な制御、実際の作業後にキー返却
ユーザー作業完了ユーザー開始作業ユーザーが作業を完了するときにキー返却

4.3 適切な統合ポイントの選択

サンプルアプリケーションの場合:

現在のビジネスロジック: navigationManager.navigateWithDelay()

  • 実行する作業: サーバー処理をシミュレートし、BasicControlFragmentに移動します
  • 完了時点: BasicControlFragmentが正常にロードされるとき
  • 最適な統合ポイント: Fragmentライフサイクルイベント(onViewCreated、setupViews)

統合戦略:

  1. Fragment作成: BasicControlFragmentが完全にロードされるときにキー返却
  2. シンプルで信頼できる: ナビゲーションベースのフローに動作します
  3. ユーザー体験: ユーザーが実際にサービスを使用できるときにキーが返却されます

4.4 統合ポイントロジックの検証

全体フロー分析:

  1. ユーザーがボタンをクリックnfStart()が呼び出される
  2. 待合室が表示される → ユーザーがキューで待機
  3. 進入が許可されるonSuccessコールバックが発生
  4. ビジネスロジックが実行されるnavigationManager.navigateWithDelay()が実行される
  5. BasicControlFragmentがロードされる → ユーザーがこれでサービスを使用できる
  6. キー返却が必要nfStop()を呼び出してキュースロットを解放

この統合ポイントが合理的な理由:

  • ユーザー体験: ユーザーが実際にサービスを使用できるときにキーが返却されます
  • キュー管理: 現在のユーザーが準備できれば、次のユーザーが即座に進入できます
  • リソース効率: 不要なキューブロックを防止します
  • 実装の単純性: 実装およびメンテナンスが簡単です

核心洞察: nfStop統合ポイントは、ユーザーの意図したビジネス作業が実際に完了し、待機したサービスの利点を得られる位置である必要があります。


ステップ5: キー返却関数の実装(nfStop

アプリケーションに合わせて調整

以下の例はキーを返却するさまざまなアプローチを示します。アプリケーションアーキテクチャに最も適したアプローチを選択してください - Fragmentナビゲーション、API呼び出し、またはその他のビジネスロジック完了後にキーを返却する必要があるかどうかに応じて異なります。

5.1 nfStop関数の理解

nfStop関数は次のような基本構造を持ちます:

Netfunnel.nfStop(
projectKey = "your_project_key", // nfStartキーと正確に一致する必要がある
segmentKey = "your_segment_key", // nfStartキーと正確に一致する必要がある
completeCallback = yourCompleteCallback // 完了を処理するコールバック
)

Java同等コード:

Netfunnel.INSTANCE.nfStop(
"your_project_key", // nfStartキーと正確に一致する必要がある
"your_segment_key", // nfStartキーと正確に一致する必要がある
yourCompleteCallback // 完了を処理するコールバック
);

核心要件:

  • 正確なキー一致: キーはnfStart()で使用されたものと同一である必要があります
  • タイミング: nfStart()直後ではなく、ビジネスロジックが完了した後に呼び出します
  • コールバック: 完了応答を処理するためにNetfunnelCompleteCallbackを使用します

5.2 必須importの追加

nfStopを実装する前に、Fragmentに必要なimportを追加してください:

// BasicControlFragment.kt
import com.nf4.Netfunnel
import com.nf4.NetfunnelCompleteCallback

核心import:

  • com.nf4.Netfunnel - NetFUNNELメインクラス(nfStartにすでにimport済み)
  • com.nf4.NetfunnelCompleteCallback - キー返却完了のためのコールバックインターフェース

5.3 基本キー返却の追加(Fragmentライフサイクル)

BasicControlFragmentがロードされるときにキーを返却します:

// BasicControlFragment.kt
import com.nf4.Netfunnel
import com.nf4.NetfunnelCompleteCallback

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

// Fragmentが完全にロードされるときにキー返却
Netfunnel.nfStop(
projectKey = "your_project_key",
segmentKey = "your_segment_key",
completeCallback = completeCallback
)
}

private val completeCallback = object : NetfunnelCompleteCallback() {
override fun onComplete(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "Key returned: $message")
}
}

変更事項:

  • Fragmentライフサイクル: BasicControlFragmentが完全にロードされるときにキーを返却します
  • シンプルなアプローチ: 基本ナビゲーションシナリオに動作します
  • 直接呼び出し: NetFUNNELが初期化され、使用可能であると仮定します

キー返却実装が正しく動作するかテストしてみましょう。

アプリを実行し、次のテスト順序に従ってください:

  1. "基本コントロール(コードベース統合)"ボタンをクリックします - 待合室が表示されるはずです
  2. NetFUNNELコンソールで進入許容数を0から1に変更します - これは進入を許可します
  3. 待合室が閉じることを観察します - 消えてBasicControlFragmentに移動するはずです
  4. Logcatでキー返却ログを確認します - 5004リクエストログが表示されるはずです

より良いデバッグのためにNetFUNNELロギングを有効化:

ApplicationクラスでprintLog = trueを設定してデバッグロギングを有効化し、Logcatでpackage:mine NetFUNNELでフィルタリングします。詳細な設定手順については、NetFUNNEL初期化テスト)セクションを参照してください。

確認事項:

待合室ステップで進入許容数を0から1に変更すると、次のようなログが表示されるはずです:

2025-09-15 15:23:33.864  6196-6196  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 15:23:46.203 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5101), Work(projectKey=service_1, segmentKey=test_liam_01), Control(BASIC)
2025-09-15 15:23:46.227 6196-6211 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5101 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5101&sid=service_1&aid=test_liam_01
2025-09-15 15:23:47.726 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5101 response. Response(timestamp=1757917427984, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB1898D3FBDDED79E1C4979B70CAECA7D2F9071C98595486C24B070C0DFEB954A9C3F4BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D382C312C312C302C302C302C30, nwait=1, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:47.736 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=test_liam_01), Status(WAIT)
2025-09-15 15:23:48.426 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Fetching HTML content from following URL. https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html
2025-09-15 15:23:48.817 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB1898D3FBDDED79E1C4979B70CAECA7D2F9071C98595486C24B070C0DFEB954A9C3F4BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D382C312C312C302C302C302C30&sticky=nf1
2025-09-15 15:23:48.887 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917430008, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB189855B40CD9D2F33B8E94212241C974E92C78785D8C84A0E36FBF42A696FD0C9265BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D362C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:49.897 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB189855B40CD9D2F33B8E94212241C974E92C78785D8C84A0E36FBF42A696FD0C9265BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D362C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:49.924 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917431061, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB1898D2071B63927D1DD62706C0078BC432511A923D0082FE30F53FB1965DB63DF0BCBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D352C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:50.929 6196-6285 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB1898D2071B63927D1DD62706C0078BC432511A923D0082FE30F53FB1965DB63DF0BCBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D352C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:50.951 6196-6285 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917432090, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB189829DB6FFDBB6FB013CEA7F6599A9C94129D63CE6AE1AB4B557C31685803153728BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D342C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:51.956 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB189829DB6FFDBB6FB013CEA7F6599A9C94129D63CE6AE1AB4B557C31685803153728BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D342C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:51.979 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917433117, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB1898CD1CF597D3764F52F1B11FE6F5A1DA1AB8B301E456A85CF6D2D35F5C17F33784BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D332C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:52.984 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB1898CD1CF597D3764F52F1B11FE6F5A1DA1AB8B301E456A85CF6D2D35F5C17F33784BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D332C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:53.007 6196-6212 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917434146, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB189802E99D6C9B4A367F1C40935A4D05C854DCFC137D2FD253A3CE5B0E8EE2359C11BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:54.012 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB189802E99D6C9B4A367F1C40935A4D05C854DCFC137D2FD253A3CE5B0E8EE2359C11BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:54.044 6196-6289 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917435174, code=201, msg=null, key=B32E23DD6D61705669BE18E213CB1898AA690315A075EC205F9ADE7559D9E5CE2C7130F9371987B6C74547C61F6112E4BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D302C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 15:23:55.050 6196-6287 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B32E23DD6D61705669BE18E213CB1898AA690315A075EC205F9ADE7559D9E5CE2C7130F9371987B6C74547C61F6112E4BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D302C312C302C302C302C302C30&sticky=nf1
2025-09-15 15:23:55.076 6196-6286 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757917436212, code=200, msg=null, key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=0, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=null, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 15:23:55.088 6196-6286 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 15:23:55.088 6196-6286 NetFUNNEL com...ample_android_single_activity D onSuccess(statusCode=200, message='Success')
2025-09-15 15:23:56.143 6196-6196 VRI[NetfunnelWebView] com...ample_android_single_activity D visibilityChanged oldVisibility=true newVisibility=false
2025-09-15 15:23:56.380 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Key return attempt detected. Work(projectKey=service_1, segmentKey=test_liam_01), Control(BASIC)
2025-09-15 15:23:56.383 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5004 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5004&key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30&sticky=nf1
2025-09-15 15:23:56.441 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5004 response. Response(timestamp=1757917437568, code=200, msg=null, key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=0, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=null, preBeginTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 15:23:56.443 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 15:23:56.448 6196-6288 NetFUNNEL com...ample_android_single_activity D Key returned: Key Return Successful

すべてが動作中であることを示す核心指標:

ログメッセージ意味状態
[NF4] Initial entry detectednfStart()が正常に呼び出された✅ 正常
[NF4] Loading the virtual room待合室WebViewがロード中✅ 正常
[NF4] Sending 5002 request(繰り返し)定期的な再進入リクエスト(ポーリング)✅ 正常
[NF4] Received 5002 response with code=200進入が許可された - 待合室が閉じられるべき✅ 正常
onSuccess(statusCode=200, message='Success')成功コールバックが発生✅ 正常
visibilityChanged oldVisibility=true newVisibility=false待合室WebViewが閉じられた✅ 正常
[NF4] Key return attempt detectednfStop()が呼び出された✅ 正常
[NF4] Sending 5004 requestキー返却リクエストがサーバーに送信された✅ 正常
[NF4] Received 5004 response with code=200キー返却成功✅ 正常
Key returned: Key Return Successful完了コールバックが発生✅ 正常

テスト順序:

  1. 進入許容数 = 0で開始: 待合室が表示され、5002リクエストが繰り返されます
  2. 進入許容数を1に変更: 5002応答がcode=200に変更され、待合室が閉じられます
  3. Fragmentロード: BasicControlFragment onViewCreated()nfStop()を呼び出します
  4. キー返却: 5004リクエスト/応答がキー返却を確認します

問題が発生した場合:

  • 5004ログがない: BasicControlFragmentでnfStop()が呼び出されているか確認してください
  • キー返却失敗: nfStart()nfStop()間のプロジェクト/セグメントキーが正確に一致しているか確認してください
  • Fragmentがロードされない: onSuccessコールバックがナビゲーションを正しく実行しているか確認してください
  • 待合室が閉じない: コンソールで進入許容数が1に設定されているか確認してください

待合室 → 進入 → Fragmentロード → キー返却の全体フローが表示されれば、実装が正しく動作しています!エラー処理を強化し、より堅牢なコールバック管理を追加できます。

5.4 主要な実装ポイント

ベストプラクティス: 即座にキー返却

ビジネスロジックが完了したらNetFUNNELキーを返却してください。NetFUNNELはタイムアウト後に自動的にキーを返却しますが、手動返却はより良いユーザー体験とキュー効率を提供します。

キー返却ルール:

  • 常に: ビジネスロジックが完了した後にキーを返却します(成功または失敗)
  • ⚠️ 自動タイムアウト: 手動で返却しない場合、NetFUNNELが自動的にキーを返却します
  • タイミング: nfStart()直後ではなく、ビジネスロジックが完了した後に呼び出します

実装チェックリスト:

  1. 正確なキー一致: nfStop()のキーはnfStart()と正確に一致する必要があります
  2. Fragmentライフサイクル: キー返却タイミングにonViewCreated()を使用します
  3. 完全なコールバック: 完了処理のために常にNetfunnelCompleteCallbackを実装します
  4. 一貫したキー: 全体フローで同じプロジェクト/セグメントキーを使用します
完全なAPIリファレンス

nfStopパラメータ、応答処理、および高度なキー返却パターンの詳細については、APIリファレンスを参照してください。


ステップ6: 待合室テスト(進入許容数 = 0)

アプリケーションでテスト

以下のテストステップはサンプルアプリケーションに基づいています。テストプロセスを実際のアプリケーションに合わせて調整してください - ボタン名、Fragmentナビゲーション、および確認ステップを特定の実装に合わせて置き換えてください。

6.1 作業トリガー

  1. Logcatログのクリア(クリーンな状態で観察したい場合)

    • Android StudioでLogcatのゴミ箱アイコンをクリックして以前のログをクリアします
    • またはコマンドを使用: adb logcat -c
  2. 保護されたボタンをクリック(例: "基本コントロール(コードベース統合)"ボタン)

予想結果: 現在の画面に待合室WebViewが表示されます

Android main screen before clicking Android waiting room WebView

6.2 待合室表示の確認

次の要素が正しく表示されているか確認してください:

進入許容数が0に設定され、1人のユーザーのみが接続されている場合、次を確認してください:

  • 私の待機順序: 1
  • 予想待機時間: 00:00:00(時:分:秒)
  • 私の後ろの待機者数: 0
Android waiting room WebView

6.3 Logcat活動の確認

NetFUNNELログの確認:

ApplicationクラスでprintLog = trueを設定してデバッグロギングを有効化し、Logcatでpackage:mine NetFUNNELでフィルタリングします。次のようなログが表示されるはずです:

2025-09-15 14:21:45.762  5659-5659  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 14:21:52.685 5659-5675 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5101), Work(projectKey=service_1, segmentKey=test_liam_01), Control(BASIC)
2025-09-15 14:21:52.727 5659-5677 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5101 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5101&sid=service_1&aid=test_liam_01
2025-09-15 14:21:54.177 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5101 response. Response(timestamp=1757913714588, code=201, msg=null, key=A06C985C93A27FA585B6EB31707D8F75560B09C0ABA476E93DAAFF65D8F81E1F2AA6D7A151BC9D46A7A70B04309F5684BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)
2025-09-15 14:21:54.184 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=test_liam_01), Status(WAIT)
2025-09-15 14:21:55.745 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Fetching HTML content from following URL. https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html
2025-09-15 14:21:56.368 5659-5676 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=A06C985C93A27FA585B6EB31707D8F75560B09C0ABA476E93DAAFF65D8F81E1F2AA6D7A151BC9D46A7A70B04309F5684BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D322C312C302C302C302C302C30&sticky=nf1
2025-09-15 14:21:56.406 5659-5765 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757913717559, code=201, msg=null, key=A06C985C93A27FA585B6EB31707D8F7501186C02D6377624BD336C0B9EABC7B23E0DA90D4459587BF1B066C976432A52BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897459E4B85A186035300FD8474FD450E3D31302C312C302C302C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=1, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=wait, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=0)

すべてが動作中であることを示す核心指標:

ログメッセージ意味状態
[NF4] Initialization successfulNetFUNNELエージェントが正しくロードされた✅ 正常
[NF4] Initial entry detectednfStart()が正常に呼び出された✅ 正常
[NF4] Sending 5101 requestNetFUNNELサーバーにリクエストが送信された✅ 正常
[NF4] Received 5101 response with code=201サーバーがWAIT状態で応答した✅ 正常
[NF4] Loading the virtual room待合室WebViewがロード中✅ 正常
[NF4] Fetching HTML content待合室HTMLがロード中✅ 正常
[NF4] Sending 5002 request定期的な再進入リクエスト(ポーリング)✅ 正常
[NF4] Received 5002 response with code=201サーバーがWAIT状態で応答した✅ 正常

応答確認:

  • ログでts.wseq?opcode=5002リクエストを見つけてください
  • 応答がcode=201(WAIT)を表示しているか確認してください
  • 201 = WAIT、200 = PASS(進入許可)
  • ここでは進入許容数が0であるため、正しい応答は201です

ステップ7: 進入テスト(進入許容数 = 1)

7.1 セグメント設定の更新

  1. NetFUNNELコンソールに戻ります
  2. セグメントの編集ボタンをクリックして編集画面を開きます

NetFUNNEL console edit segment button

  1. 進入許容数0から1に変更します
  2. 下部の確認をクリックします

Update limited inflow Confirm changes

即座に効果

確認をクリックするとすぐに待合室が消え、即座にBasicControlFragmentに移動します。この瞬間を観察するには、待合室が現在表示されている別の画面を開いておいてください。

7.2 進入確認

予想結果: 待合室が即座に消え、BasicControlFragmentに移動します

Android service entry successful

進入確認のためにLogcatを確認してください:

次のようなログが表示されるはずです:

2025-09-15 15:23:55.076  6196-6286  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Received 5002 response. Response(timestamp=1757917436212, code=200, msg=null, key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=0, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=null, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 15:23:55.088 6196-6286 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 15:23:55.088 6196-6286 NetFUNNEL com...ample_android_single_activity D onSuccess(statusCode=200, message='Success')
2025-09-15 15:23:56.143 6196-6196 VRI[NetfunnelWebView] com...ample_android_single_activity D visibilityChanged oldVisibility=true newVisibility=false

成功した進入の核心指標:

ログメッセージ意味状態
[NF4] Received 5002 response with code=200進入が許可された - 待合室が閉じられるべき✅ 正常
[NF4] "Success" response from NetFUNNEL Server成功応答が受信された✅ 正常
onSuccess(statusCode=200, message='Success')成功コールバックが発生✅ 正常
visibilityChanged oldVisibility=true newVisibility=false待合室WebViewが閉じられた✅ 正常

7.3 キー返却確認

成功したキー返却確認:

Logcatで次のログを見つけてください:

2025-09-15 15:23:56.380  6196-6213  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Key return attempt detected. Work(projectKey=service_1, segmentKey=test_liam_01), Control(BASIC)
2025-09-15 15:23:56.383 6196-6213 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5004 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5004&key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30&sticky=nf1
2025-09-15 15:23:56.441 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5004 response. Response(timestamp=1757917437568, code=200, msg=null, key=B32E23DD6D61705669BE18E213CB1898A1CB5D9BE6372F442714047E95693E10AD2F823D01AAF9EB91D8F2962E28A0031F1A3257C7780F8C2A1A1CBDFBB5888170442F1BB67CC53F28D02A19B48CDEE2071A87CC017BE50129F11B1499A36DF69C95FE37D4AB7D6900A9DFF3D496CDB1312C302C302C30, nwait=0, nnext=0, tps=0.0, ttl=0, ip=nf4-onprem-demo-4525.stclab.com, port=443, vwrHtml=https://nf4-onprem-demo-4525.stclab.com/content/netfunnel-statics/assets/vwr-page/page/1/1/1/index.html, vwrType=null, preBeginTs=null, preEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 15:23:56.443 6196-6288 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 15:23:56.448 6196-6288 NetFUNNEL com...ample_android_single_activity D Key returned: Key Return Successful

成功したキー返却の核心指標:

ログメッセージ意味状態
[NF4] Key return attempt detectednfStop()が呼び出された✅ 正常
[NF4] Sending 5004 requestキー返却リクエストがサーバーに送信された✅ 正常
[NF4] Received 5004 response with code=200キー返却成功✅ 正常
Key returned: Key Return Successful完了コールバックが発生✅ 正常

要約

必須事項(必ず実行)

設定:

  • インストールおよび初期化を完了し、NetFUNNELエージェントが正しくロードされているか確認します
  • コンソールで基本コントロールでセグメントを作成します
  • コンソールからプロジェクトキーとセグメントキーを取得します
  • テストのために進入許容数を0に設定し、本番では1以上に設定します

統合:

  • 必須import追加: com.nf4.Netfunnelおよびcom.nf4.NetfunnelCallback
  • すべてのコールバックメソッドを実装します(Androidインターフェース要件)
  • クリックハンドラーでビジネスロジックをNetfunnel.nfStart()で包みます
  • ビジネスロジックを実行するためにonSuccessコールバックを処理します
  • ビジネスロジックが完了した後にNetfunnel.nfStop()を呼び出します
  • nfStart()nfStop()の両方で同じキーを使用します

エラー処理:

  • onErrorを処理してビジネスロジックを継続進行します(サービス可用性維持)
  • onNetworkErrorはロギングのみ実行します(useNetworkRecoveryMode = trueを使用)
  • onBlockを処理して適切なユーザーメッセージを表示します
  • onCloseを処理して現在のFragmentに留まります(ユーザーがキャンセルした)
  • すべてのコールバック応答に対する包括的なロギングを実装します

テスト:

  • 進入許容数 = 0のときに待合室が表示されるかテストします
  • 進入許容数 = 1のときに進入が動作するかテストします
  • 完了後にキー返却が発生するか確認します
  • package:mine NetFUNNELフィルターでLogcatでNetFUNNELログを確認します

オプション(あれば良い)

エラー処理の強化:

  • 基本ロギングの代わりにユーザーフレンドリーなエラーメッセージを追加します
  • さまざまな応答タイプに対するカスタムエラー処理戦略を実装します
  • NetFUNNELイベントに対する分析追跡を追加します

コード構成:

  • 中央化された構成定数を生成します
  • 再利用可能なNetFUNNELラッパー関数を構築します
  • 複数のFragmentにわたるモジュール式統合パターンを実装します

ベストプラクティス

必須import

import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback
import com.nf4.NetfunnelCompleteCallback

これらのimportが重要な理由:

  • NetFUNNEL統合に必須です
  • NetFUNNELを使用するすべてのFragment/Activityに追加する必要があります
  • nfStart()およびnfStop()関数の両方に必要です

完全なコールバック実装

private val basicControlCallback = object : NetfunnelCallback() {
override fun onSuccess(statusCode: Int, message: String) {
// 進入が許可されたらビジネスロジックを実行
Log.d("NetFUNNEL", "onSuccess(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

override fun onError(statusCode: Int, message: String) {
// システムエラー - サービス可用性を維持するために継続進行
Log.d("NetFUNNEL", "onError(statusCode=$statusCode, message='$message')")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

override fun onNetworkError(statusCode: Int, message: String) {
// ネットワークエラー - ロギングのみ実行し、ネットワーク回復モードに依存
Log.d("NetFUNNEL", "onNetworkError(statusCode=$statusCode, message='$message')")
// ビジネスロジックはここで実行しない - 以下の説明を参照
}

override fun onBlock(statusCode: Int, message: String) {
// ユーザーがブロックされた - 適切なメッセージを表示
Log.d("NetFUNNEL", "onBlock(statusCode=$statusCode, message='$message')")
}

override fun onClose(statusCode: Int, message: String) {
// ユーザーが待合室を閉じた - 適切に処理
Log.d("NetFUNNEL", "onClose(statusCode=$statusCode, message='$message')")
// メインfragmentに留まる - ユーザーがキャンセルした
}

override fun onContinue(
statusCode: Int,
message: String,
aheadWait: Int,
behindWait: Int,
waitTime: String,
progressRate: Int
) {
Log.d("NetFUNNEL", "onContinue(statusCode=$statusCode, message='$message', aheadWait=$aheadWait, behindWait=$behindWait, waitTime='$waitTime', progressRate=$progressRate)")
}
}

核心原則: 常にすべてのコールバックメソッドを実装してください - Androidインターフェース要件です。

中央化された構成

// キーを1つの場所に保存します
companion object {
private const val PROJECT_KEY = "your_project_key"
private const val SEGMENT_KEY = "your_segment_key"
}

// すべての場所で同じ構成を使用します
Netfunnel.nfStart(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
callback = basicControlCallback,
activity = requireActivity()
)

Netfunnel.nfStop(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
completeCallback = completeCallback
)

利点:

  • アプリ全体でキーを簡単に更新できます
  • コピー&ペーストエラーを減らします
  • 構成の単一ソースです

堅牢なエラー処理戦略

// onErrorはビジネスロジックを実行するがonNetworkErrorは実行しない理由:

// onError(ステータスコード500)- サーバーエラー
override fun onError(statusCode: Int, message: String) {
// シナリオ: NetFUNNELサーバーが内部エラーに遭遇
// 戦略: サービス可用性を維持するためにビジネスロジックを実行
// 根拠: サーバーエラーは一般的に一時的であり、ユーザーアクセスをブロックすべきではない
// 結果: NetFUNNELに問題があっても継続する堅牢なサービス
businessLogic()
}

// onNetworkError(ステータスコード1001、1002)- ネットワーク問題
override fun onNetworkError(statusCode: Int, message: String) {
// シナリオ: ネットワーク接続の問題(オフライン、タイムアウト)
// 戦略: ロギングのみ実行し、ビジネスロジックは実行しない
// 根拠: 自動ネットワーク回復のためにuseNetworkRecoveryMode = trueを使用
// 結果: ネットワーク問題中にユーザーが待合室に留まり、接続が回復すると自動的に再開される
Log.d("NetFUNNEL", "onNetworkError(statusCode=$statusCode, message='$message')")
}

核心原則: サービス可用性を維持するために、システムエラーでは常にビジネスロジックを進行してください。

ネットワーク回復モードの構成

// SampleApplication.kt
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
useNetworkRecoveryMode = true // 自動ネットワーク回復を有効化
)

利点:

  • ネットワーク接続問題の自動処理
  • ネットワークが回復するとユーザーが自動的に再開されます
  • 手動ネットワークエラー処理の複雑さを減らします

常にキー返却

// 成功した作業後にキー返却
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

// Fragmentが完全にロードされるときにキー返却
Netfunnel.nfStop(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
completeCallback = completeCallback
)
}

private val completeCallback = object : NetfunnelCompleteCallback() {
override fun onComplete(statusCode: Int, message: String) {
Log.d("NetFUNNEL", "Key returned: $message")
}
}

キーを返却するとき:

  • Fragmentが完全にロードされた後
  • API呼び出しが完了した後
  • ビジネス作業が完了した後
  • 作業が失敗した場合でも

キー一致

// 開始と停止は同じキーを使用する必要があります
const val PROJECT_KEY = "your_project_key"
const val SEGMENT_KEY = "your_segment_key"

Netfunnel.nfStart(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
callback = callback,
activity = requireActivity()
)

Netfunnel.nfStop(
projectKey = PROJECT_KEY, // 正確に一致する必要があります
segmentKey = SEGMENT_KEY, // 正確に一致する必要があります
completeCallback = completeCallback
)

包括的なロギング

// Applicationクラスでデバッグロギングを有効化
Netfunnel.initialize(
clientId = "{{CLIENT_ID}}",
printLog = true // 詳細ロギングを有効化
)

// Logcatフィルタリング: package:mine NetFUNNEL

ロギングの利点:

  • NetFUNNEL統合問題の簡単なデバッグ
  • リクエスト/応答フローの追跡
  • キー返却作業のモニタリング
  • ネットワーク接続問題の識別

一般的な問題および問題解決

待合室が表示されない

症状: ボタンクリックは正常に動作しますが、待合室が表示されません

デバッグステップ:

  1. AndroidエラーのためにLogcatを確認: adb logcat | grep -i error
  2. ApplicationクラスでNetFUNNEL初期化を確認
  3. コンソールでセグメントが有効化されているか確認(無効化されていない)
  4. テストのために進入許容数が0に設定されているか確認
  5. プロジェクトキーとセグメントキーがコンソールと正確に一致しているか確認(大文字小文字を区別)

コールバックが発生しない

症状: nfStart()が呼び出されましたが、応答を受信できません

デバッグステップ:

  1. NetFUNNELログのためにLogcatを確認: adb logcat | grep NetFUNNEL
  2. NetFUNNELサーバーへのネットワーク接続を確認
  3. セグメントが有効化されているか確認(無効化されていない)
  4. 待合室を強制的に表示するために進入許容数 = 0で試行
  5. すべてのコールバックメソッドが実装されているか確認(Android要件)

ユーザーがキューに閉じ込められる

症状: 最初のユーザーは進入しますが、2番目のユーザーは決して通過しません

デバッグステップ:

  1. ビジネスロジックが完了した後にnfStop()が呼び出されているか確認
  2. nfStop()のキーがnfStart()と正確に一致しているか確認
  3. nfStop()実行を妨げるAndroidエラーを見つける
  4. Logcatで[NF4] Key return attempt detectedログを確認
  5. ログに[NF4] Sending 5004 requestが表示されるか確認

待合室が表示されるが進入を許可しない

症状: 待合室が表示されますが、進入許容数 = 1でもユーザーが決して通過しません

デバッグステップ:

  1. コンソールでセグメント状態を確認 - "ブロック"モードではないか確認
  2. 進入許容数が1以上に設定されているか確認
  3. Logcatで[NF4] Sending 5002 requestを確認(再進入リクエスト)
  4. NetFUNNELログでエラー応答を見つける
  5. NetFUNNELサーバーへのネットワーク接続を確認

NetFUNNEL呼び出し時にアプリクラッシュ

症状: nfStart()またはnfStop()呼び出し時にアプリがクラッシュします

デバッグステップ:

  1. 必須importが追加されているか確認: com.nf4.Netfunnelcom.nf4.NetfunnelCallback
  2. ApplicationクラスでNetFUNNELが初期化されているか確認
  3. すべてのコールバックメソッドが実装されているか確認(Androidインターフェース要件)
  4. nfStart()にactivityコンテキストが正しく渡されているか確認
  5. NetFUNNELエージェントが正しくインストールされているか確認

キー返却失敗

症状: nfStop()が呼び出されましたが、キーが返却されません

デバッグステップ:

  1. nfStop()のキーがnfStart()と正確に一致しているか確認(大文字小文字を区別)
  2. Logcatで[NF4] Key return attempt detectedメッセージを確認
  3. ログで[NF4] Sending 5004 requestを見つける
  4. [NF4] Received 5004 responsecode=200であるか確認
  5. NetfunnelCompleteCallbackが実装されているか確認

ネットワーク回復問題

症状: ネットワーク接続問題中にユーザーが閉じ込められます

デバッグステップ:

  1. Application初期化でuseNetworkRecoveryMode = trueを確認
  2. NetFUNNELサーバーへのネットワーク接続を確認
  3. ネットワーク問題をシミュレートするために機内モードのオン/オフでテスト
  4. LogcatでonNetworkErrorコールバック呼び出しをモニタリング
  5. onNetworkErrorがビジネスロジックを実行していないか確認(回復モードに依存)

QAチェックリスト

実装前の検証

  • プロジェクトキー / セグメントキーがコンソールと正確に一致する(コンソールで再確認)
  • ApplicationクラスでNetFUNNELエージェントが正しく初期化されている
  • 必須importが追加されている: com.nf4.Netfunnelcom.nf4.NetfunnelCallbackcom.nf4.NetfunnelCompleteCallback
  • すべてのコールバックメソッドが実装されている(Androidインターフェース要件)

待合室テスト(進入許容数 = 0)

  • 進入許容数 = 0のときに待合室WebViewが正しく表示される
  • 待合室が正しい詳細を表示する:
    • 私の待機順序: 1
    • 予想待機時間: 00:00:00(時:分:秒)
    • 私の後ろの待機者数: 0
  • 待機中にLogcatに**[NF4] Sending 5002 request**が定期的に表示される
  • **[NF4] Received 5002 responsecode=201(WAIT)**を表示する

進入テスト(進入許容数 = 1)

  • 進入許容数を1に変更するときにonSuccessコールバックが発生する
  • onSuccessコールバックが元のビジネスロジックを実行する
  • 進入時に待合室が即座に消える
  • 対象Fragmentへのナビゲーションが正常に発生する

キー返却検証

  • 完了ポイントでキー返却が正しく動作する
  • Logcatに**[NF4] Key return attempt detected**が表示される
  • [NF4] Sending 5004 requestHTTP 200で発生する
  • **[NF4] Received 5004 responsecode=200**を表示する
  • キー返却がnfStart呼び出しごとに正確に1回発生する
  • キー返却がビジネスロジック完了に発生する

エラー処理

  • コールバック分岐がすべての必須状態に対して実装されている:
    • onSuccess - 元のロジックを実行
    • onError - システムエラーを適切に処理する(ビジネスロジック進行)
    • onNetworkError - ネットワーク問題を適切に処理する(ロギングのみ実行)
    • onBlock - ブロック状態を適切に処理する
    • onClose - ユーザーキャンセルを適切に処理する
    • onContinue - 待機進行状況を適切に処理する
  • Application初期化でネットワーク回復モードが有効化されている
  • キー一致 - nfStartnfStopprojectKey/segmentKeyが同一である
  • すべてのコールバック応答に対する包括的なロギングが実装されている

Logcat検証

  • package:mine NetFUNNELフィルターでNetFUNNELログが表示される
  • 初期化成功メッセージが表示される
  • ボタンクリック時に初期進入検出メッセージが表示される
  • 仮想待合室ロードメッセージが表示される
  • キー返却試行検出メッセージが表示される
  • 完了コールバックにキー返却成功メッセージが表示される