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

区間コントロール統合

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

統合方法

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


動作方式

ユーザー体験:

  1. ユーザーがボタンをクリックするか、アクションをトリガーします
  2. 現在の画面に待合室が表示されます
  3. 進入が許可されると待合室が閉じられ、ユーザーがアクティブ区間に進入します
  4. ユーザーは区間内で複数の画面をナビゲートできます
  5. ユーザーがプロセスを完了するとキーが返却され、次のユーザーが進入できます

最適な用途:

  • マルチステッププロセス(決済、登録、予約)
  • 特定の領域で固定された同時ユーザー数の維持
  • ユーザーセッション管理
  • 制御された同時ユーザー数が必要なリソース集約的なワークフロー

基本コントロールとの主な違い:

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

前提条件

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

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

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


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

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

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

1.1 新しいセグメントの作成

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

Create segment button

1.2 制御タイプの選択

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

Select Section Control

1.3 セグメント構成

セグメント名: 説明的な名前を入力します(例:「決済プロセス」、「登録フロー」、「予約区間」)

Enter section segment name

進入状態:

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

Entry section segment status settings

待合室適用:

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

Waiting room settings on section segment

進入許容数:

  • テストのために0に設定(誰も許可されない、待合室が常に表示される)
  • これは区間で同時にアクティブにできるユーザー数を制御します

Limited inflow setting on section segment

1.4 セグメント作成

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

Segment created of section segment


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

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

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

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

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

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

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

<!-- fragment_main.xml -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_section_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/colorSecondary"
app:strokeColor="?attr/colorSecondary"
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/section_control_function"
android:textAppearance="?attr/textAppearanceTitleLarge"
android:textColor="?attr/colorSecondary" />

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

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

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

  • 「区間コントロール(コードベース統合)」カード(card_section_control_function)はマルチステッププロセスを表します
  • これは決済フロー、登録プロセス、予約ワークフロー、またはマルチステップフォームである可能性があります
  • ユーザーは複数の画面をナビゲートします:Section1 → Section2 → End
  • この全体のフローで同時に存在できるユーザー数を制御する必要があります

2.2 このボタンのクリックリスナーの検索

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

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

2.3 区間フローの確認

全体の区間フロー:

  1. MainFragment: ユーザーが区間コントロールカードをクリックします
  2. SectionControlSection1Fragment: プロセスの最初のステップ
  3. SectionControlSection2Fragment: プロセスの2番目のステップ
  4. SectionControlEndFragment: 最終完了ステップ

統合戦略:

  • 区間進入: ナビゲーション前にMainFragmentでnfStartSection()を呼び出し
  • 区間活動: ユーザーはSection1 → Section2 → End内で自由にナビゲートできます
  • 区間終了: プロセスが完了するとSectionControlEndFragmentでnfStopSection()を呼び出し

2.4 統合ポイントの識別

  1. 対象カード: card_section_control_function(マルチステッププロセス進入)
  2. クリックリスナー: setupViews()メソッドがクリックハンドラーを設定します
  3. 統合位置: navigationManager.navigateWithDelay()が呼び出される直前
  4. ここで行う理由: 保護された区間に進入する直前の正確なタイミングです
  5. 保護戦略: 区間進入前にNetFUNNEL区間キューを追加します

全体フロー分析:

  1. Fragment作成: onViewCreated()setupViews()を呼び出します
  2. ボタン設定: setupViews()が各カードのクリックリスナーを設定します
  3. ユーザーアクション: ユーザーが「区間コントロール(コードベース統合)」カードをクリックします
  4. 現在の動作: navigationManager.navigateWithDelay()が即座に実行されます
  5. 区間ロード: これがマルチステッププロセス進入をトリガーします

ロジック:

  • NetFUNNELなし: カードクリック → 即座に区間進入 → 潜在的な同時ユーザー数超過
  • NetFUNNEL使用: カードクリック → キュー確認 → 制御された区間進入 → 同時ユーザー数維持

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

コードに合わせて調整

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

3.1 キーの取得

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

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

Project and segment keys of section control

3.2 nfStartSection関数の理解

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

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

Java同等コード:

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

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

3.3 現在のコードから開始

現在の実装:

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

核心概念:

  • ビジネスロジック: navigationManager.navigateWithDelay()はマルチステップ区間進入を表します
  • 統合ポイント: この区間進入をNetFUNNEL保護でラップする必要があります
  • ラップ戦略: マルチステッププロセスが開始される前にnfStartSection()を使用して同時ユーザー数を制御します

ここでラップする理由:

  • これは区間進入が開始される直前の正確なタイミングです
  • ここでラップすると、全体のマルチステップ区間を同時ユーザー数超過から保護します
  • ビジネスロジックは変更されません - 同時ユーザー数制御レイヤーのみが追加されます

3.4 必須importの追加

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

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

Java同等コード:

// MainFragment.java
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 Function button clicked")
lifecycleScope.launch {
navigationManager.navigateWithDelay(
R.id.action_mainFragment_to_basicControlFragment
)
}
}

binding.cardSectionControlFunction.setOnClickListener {
Log.d("MainActivity", "Section Control Function button clicked")
startSectionControl()
}
}

private fun startSectionControl() {
Netfunnel.nfStartSection(
projectKey = "your_project_key",
segmentKey = "your_segment_key",
callback = sectionControlCallback,
activity = requireActivity()
)
}

private val sectionControlCallback = 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_sectionControlSection1Fragment
)
}
}

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 17:10:41.744  6881-6881  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 17:10:47.409 6881-6897 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5101), Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:10:47.461 6881-6899 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=segKey_2548
2025-09-15 17:10:48.907 6881-6897 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5101 response. Response(timestamp=1757923849180, code=201, msg=null, key=72D5F5FB98C3C27813CF5B7106D11EDDFB3008B12E6BFFA493E027A749A853E1BE450D9D849A0A717DD25BEC75DE40A3BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897347B786360D662C7FD9BAB75A3C285D32C312C302C302C302C302C30, 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 17:10:48.915 6881-6897 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=segKey_2548), Status(WAIT)
2025-09-15 17:10:49.850 6881-6897 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 17:10:50.510 6881-6989 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=72D5F5FB98C3C27813CF5B7106D11EDDFB3008B12E6BFFA493E027A749A853E1BE450D9D849A0A717DD25BEC75DE40A3BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897347B786360D662C7FD9BAB75A3C285D32C312C302C302C302C302C30&sticky=nf1
2025-09-15 17:10:50.666 6881-6988 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757923851681, code=201, msg=null, key=72D5F5FB98C3C27813CF5B7106D11EDDF35A5F6A6BE9A186341F85B4481E24B2EB67CFE5013835FCED7D49E3D8A34875BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897347B786360D662C7FD9BAB75A3C285D3302C312C302C302C302C302C30, 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 17:10:51.694 6881-6988 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=72D5F5FB98C3C27813CF5B7106D11EDDF35A5F6A6BE9A186341F85B4481E24B2EB67CFE5013835FCED7D49E3D8A34875BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897347B786360D662C7FD9BAB75A3C285D3302C312C302C302C302C302C30&sticky=nf1

すべてが動作していることを示す核心指標:

ログメッセージ意味状態
[NF4] Initialization successfulNetFUNNELエージェントが正しくロードされた✅ 正常
[NF4] Initial entry detectednfStartSection()が正常に呼び出された✅ 正常
[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(同時ユーザー数 = 0)であるため、正しい応答は201です

問題が発生する場合:

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

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

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

より良いエラー管理およびユーザー体験のためにコールバック処理を改善します:

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

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

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

堅牢なエラー処理でsectionControlCallbackを向上:

// MainFragment.kt - 完全な処理を含むsectionControlCallbackの更新
private val sectionControlCallback = 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_sectionControlSection1Fragment
)
}
}

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

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

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

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

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

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

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

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

4.1 区間完了ポイントの識別

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

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

次に発生すること:

  1. ユーザーがSectionControlSection1Fragmentに移動 - プロセスの最初のステップ
  2. ユーザーがSectionControlSection2Fragmentに移動 - プロセスの2番目のステップ
  3. ユーザーがSectionControlEndFragmentに移動 - 最終完了ステップ
  4. ユーザーの区間セッションが完了 - ここでキーを返却する必要があります
  5. キーを返却する必要がある - キュー内の次のユーザーが区間に進入できるようにします

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

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

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

統合ポイント使用時期利点
区間終了Fragmentマルチステップ完了フロー明確な完了ポイント、ほとんどの場合に機能します
ビジネスロジック完了複雑なタスク(API呼び出し、処理)精密な制御、実際のタスク後にキー返却
ユーザー作業完了ユーザー開始完了ユーザーが作業を完了するときにキー返却

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

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

現在のビジネスフロー: マルチステップナビゲーションプロセス

  • 実行するタスク: ユーザーがSection1 → Section2 → Endを通過します
  • 完了時点: SectionControlEndFragmentが正常にロードされるとき
  • 最適な統合ポイント: Fragmentライフサイクルイベント(onViewCreated、setupViews)

統合戦略:

  1. 区間完了: SectionControlEndFragmentが完全にロードされるときにキー返却
  2. シンプルで信頼できる: ナビゲーションベースの区間フローに機能します
  3. ユーザー体験: ユーザーが全体の区間を完了したときにキーが返却されます

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

全体フロー分析:

  1. ユーザーがボタンをクリックnfStartSection()が呼び出される
  2. 待合室が表示される → ユーザーがキューで待機
  3. 進入が許可されるonSuccessコールバックが発生
  4. 区間ナビゲーション開始 → ユーザーがSection1 → Section2 → Endを進行します
  5. SectionControlEndFragmentがロードされる → ユーザーが区間を完了しました
  6. キー返却が必要nfStopSection()を呼び出して区間スロットを解放

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

  • ユーザー体験: ユーザーが全体の区間を完了したときにキーが返却されます
  • 同時ユーザー数管理: 現在のユーザーが区間を完了するとすぐに次のユーザーが進入できます
  • リソース効率: 不要な同時ユーザー数ブロックを防止します
  • 実装の単純性: 実装および保守が容易です

核心洞察: nfStopSection統合ポイントは、ユーザーの意図した区間作業が実際に完了し、待機した区間使用を終えた位置である必要があります。

区間コントロール vs 基本コントロールキー管理

進入後キーが速く返却される基本コントロールとは異なり、区間コントロールは全体の区間が完了するまでキーを維持します。 この根本的な違いは、nfStopSection()をいつどこで呼び出す必要があるかに影響を与えます:

  • 基本コントロール: 進入直後にキー返却(例:Fragmentロード後)
  • 区間コントロール: 全体の区間中キー維持(例:Section1 → Section2 → End)

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

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

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

5.1 nfStopSection関数の理解

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

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

Java同等コード:

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

核心要件:

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

5.2 必須importの追加

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

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

核心Import:

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

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

SectionControlEndFragmentがロードされるときにキー返却:

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

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

// 区間終了Fragmentが完全にロードされるときにキー返却
Netfunnel.nfStopSection(
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", "Section key returned: $message")
}
}

変更点:

  • 区間ライフサイクル: SectionControlEndFragmentが完全にロードされるときにキー返却
  • 区間完了: マルチステップ区間シナリオに機能します
  • 直接呼び出し: NetFUNNELが初期化され、使用可能であると仮定

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

アプリを実行し、次のテストシーケンスに従ってください:

  1. 「区間コントロール(コードベース統合)」カードをクリックします - 待合室が表示されるのを確認できます
  2. NetFUNNELコンソールで進入許容数を0から1に変更します - これは進入を許可します
  3. 待合室が閉じるのを観察します - 待合室が消え、SectionControlSection1Fragmentに移動する必要があります
  4. Section1 → Section2 → Endをナビゲートします - 区間フローを完了します
  5. Logcatでキータイムアウト延長ログを確認します - 区間中に5003リクエストログが表示されるはずです
  6. Logcatでキー返却ログを確認します - 区間が完了するときに5004リクエストログが表示されるはずです

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

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

確認事項:

区間フローを完了すると(Section1 → Section2 → End)、次のようなログが表示されます:

2025-09-15 17:30:24.506  7138-7138  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 17:30:27.647 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5002), Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:27.696 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=72D5F5FB98C3C27813CF5B7106D11EDD7796632DC8DA328ACD21E27878B567DD43DDCFCA79225210E75F65F358703A67BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A89794D7C8E4BEA05A019FF78476D2CEAF2F2C312C302C302C302C302C30&sticky=nf1
2025-09-15 17:30:29.267 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757925029406, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC494399438D1C0EE7AA0512477FC651CDA8D0C0F1928FD7C09AB18E7593EAE92B7FBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897BD882ABDAC46FAEC31605E83E9F49CD72C312C312C302C302C302C30, 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 17:30:29.274 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=segKey_2548), Status(WAIT)
2025-09-15 17:30:30.007 7138-7156 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 17:30:30.396 7138-7230 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B04303FD454C5CA18924C54783F2BC494399438D1C0EE7AA0512477FC651CDA8D0C0F1928FD7C09AB18E7593EAE92B7FBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897BD882ABDAC46FAEC31605E83E9F49CD72C312C312C302C302C302C30&sticky=nf1
2025-09-15 17:30:30.462 7138-7157 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757925031536, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC496041E95666117EA3413E1FA1CF7D93C83F3BBCFCE4DDF36303B4D29BAB59285BBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A89724B5E2DCE14558567E22635B848476732C312C302C302C302C302C30, 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 17:30:36.726 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757925037810, code=200, msg=null, key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1302C302C30, 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 17:30:36.740 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 17:30:36.740 7138-7182 NetFUNNEL com...ample_android_single_activity D onSuccess(statusCode=200, message='Success')
2025-09-15 17:30:36.750 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] Key refresh attempt detected. Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:36.758 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5003 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5003&key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1302C302C30&sticky=nf1
2025-09-15 17:30:36.808 7138-7157 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5003 response. Response(timestamp=1757925037885, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1312C302C30, nwait=0, nnext=0, tps=0.0, ttl=5, 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 17:30:37.725 7138-7138 VRI[NetfunnelWebView] com...ample_android_single_activity D visibilityChanged oldVisibility=true newVisibility=false
2025-09-15 17:30:41.817 7138-7230 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5003 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5003&key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1312C302C30&sticky=nf1
2025-09-15 17:30:41.849 7138-7231 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5003 response. Response(timestamp=1757925042935, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC49C3E3247A56D8C04F7F9FA55FB70138558B8260BDD3FAE86F40C4139CBCBD20FB5F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A08001715A51C76F286957F8DE56D6092043B1312C302C30, nwait=0, nnext=0, tps=0.0, ttl=5, 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 17:30:59.015 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Key return attempt detected. Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:59.019 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5004 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5004&key=B04303FD454C5CA18924C54783F2BC49951551C40A5E72EE425E8BBE7154D8917EDEA09F96A8542EE989BA43DF1619125F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080018D551F84A0705E2E596EA1998D395695312C302C30&sticky=nf1
2025-09-15 17:30:59.062 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5004 response. Response(timestamp=1757925060140, code=200, msg=null, key=B04303FD454C5CA18924C54783F2BC49951551C40A5E72EE425E8BBE7154D8917EDEA09F96A8542EE989BA43DF1619125F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080018D551F84A0705E2E596EA1998D395695312C302C30, nwait=0, nnext=0, tps=0.0, ttl=5, 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, postEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 17:30:59.062 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 17:30:59.063 7138-7158 NetFUNNEL com...ample_android_single_activity D Section key returned: Key Return Successful

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

ログメッセージ意味状態
[NF4] Initial entry detectednfStartSection()が正常に呼び出された✅ 良好
[NF4] Loading the virtual room待合室WebViewがロード中✅ 良好
[NF4] Sending 5002 request(繰り返し)定期的な再進入リクエスト(ポーリング)✅ 良好
[NF4] Received 5002 response with code=200進入許可 - 待合室が閉じられる必要がある✅ 良好
onSuccess(statusCode=200, message='Success')成功コールバックが発生✅ 良好
[NF4] Key refresh attempt detected区間コントロール: 自動返却防止のためのキータイムアウト延長✅ 良好
[NF4] Sending 5003 request区間コントロール: キータイムアウト延長リクエスト(デフォルト20秒)✅ 良好
[NF4] Received 5003 response with code=201区間コントロール: キータイムアウトが正常に延長された✅ 良好
visibilityChanged oldVisibility=true newVisibility=false待合室WebViewが閉じられた✅ 良好
[NF4] Key return attempt detectednfStopSection()が呼び出された✅ 良好
[NF4] Sending 5004 requestキー返却リクエストがサーバーに送信された✅ 良好
[NF4] Received 5004 response with code=200キー返却成功✅ 良好
Section key returned: Key Return Successful完了コールバックが発生✅ 良好

テストシーケンス:

  1. 進入許容数 = 0で開始: 待合室が表示され、5002リクエストが繰り返される
  2. 進入許容数を1に変更: 5002応答がcode=200に変更され、待合室が閉じられる
  3. 区間進入: onSuccessコールバックが発生し、ユーザーが区間に進入する
  4. キータイムアウト延長: 区間コントロールが自動返却を防止するためにキータイムアウトを自動的に延長する(5003リクエスト)
  5. 区間ナビゲーション: ユーザーがSection1 → Section2 → Endを通過する
  6. 区間完了: SectionControlEndFragment onViewCreated()nfStopSection()を呼び出す
  7. キー返却: 5004リクエスト/応答がキー返却を確認する
区間コントロールキー管理

区間コントロールは基本コントロールと比較して固有のキー管理動作を持ちます:

  • キータイムアウト延長(5003): 区間中自動返却を防止するためにキータイムアウトを自動的に延長する(デフォルト20秒)
  • タイムアウト構成: NetFUNNELコンソール → セグメント → 高度な設定 → タイムアウトでタイムアウトを構成
  • 同時ユーザー数維持: 明示的な完了まで区間で固定された同時ユーザー数を維持する
  • 自動管理: NetFUNNELがタイムアウト延長を自動的に処理する - 手動介入不要
  • 手動返却: nfStopSection()が明示的に呼び出されるときのみキーが返却される

問題が発生する場合:

  • 5004ログがない: SectionControlEndFragmentでnfStopSection()が呼び出されているか確認
  • キー返却失敗: nfStartSection()nfStopSection()間のプロジェクト/セグメントキーが正確に一致しているか確認
  • 区間が完了しない: 区間ナビゲーションフローが正しく動作しているか確認
  • 待合室が閉じない: コンソールで進入許容数が1に設定されているか確認
  • キーが自動返却される: NetFUNNELコンソール → セグメント → 高度な設定 → タイムアウトでタイムアウトが短すぎるか確認
  • 5003ログがない: 区間継続時間がタイムアウト期間(デフォルト20秒)を超えているか確認

待合室 → 進入 → 区間ナビゲーション → 区間完了 → キー返却の全体フローが表示されれば、実装が正しく動作しています!次に、エラー処理を向上させ、より堅牢なコールバック管理を追加できます。

5.4 主要な実装ポイント

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

区間が完了したらNetFUNNELキーを返却してください。NetFUNNELはタイムアウト後(デフォルト20秒)自動的にキーを返却しますが、手動返却はより良いユーザー体験と同時ユーザー数管理効率を提供します。

キー返却ルール:

  • 常に: 区間が完了した後にキーを返却します(成功または失敗)
  • ⚠️ 自動タイムアウト: NetFUNNELはタイムアウト期間後に自動的にキーを返却します(コンソールで構成可能)
  • タイムアウト延長: NetFUNNELは区間中自動返却を防止するためにタイムアウトを自動的に延長します(5003リクエスト)
  • タイミング: nfStartSection()直後ではなく、区間が完了した後に呼び出します

実装チェックリスト:

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

nfStopSectionパラメータ、応答処理、および高度なキー返却パターンの詳細については、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 of Section Control

6.2 待合室表示の確認

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

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

  • 私の待機順序: 1
  • 予想待機時間: 表示されない(区間コントロールのみ)
  • 私の後の待機者数: 0
区間コントロール vs 基本コントロール待合室

区間コントロールは、すでに区間にいるユーザーの完了時間が多様で予測が困難なため、予想待機時間を表示しません。進入が速く予測可能な基本コントロールとは異なり、区間コントロールユーザーはマルチステッププロセスを完了するのに多様な時間を費やすことができます。

Android waiting room WebView of Section Control

6.3 Logcatアクティビティの確認

NetFUNNELログの確認:

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

2025-09-15 17:30:24.506  7138-7138  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Initialization successful. NetFUNNEL Version: 4.3.3-onprem
2025-09-15 17:30:27.647 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Initial entry detected. Request(5002), Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:27.696 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=72D5F5FB98C3C27813CF5B7106D11EDD7796632DC8DA328ACD21E27878B567DD43DDCFCA79225210E75F65F358703A67BCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A89794D7C8E4BEA05A019FF78476D2CEAF2F2C312C302C302C302C302C30&sticky=nf1
2025-09-15 17:30:29.267 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757925029406, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC494399438D1C0EE7AA0512477FC651CDA8D0C0F1928FD7C09AB18E7593EAE92B7FBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897BD882ABDAC46FAEC31605E83E9F49CD72C312C312C302C302C302C30, 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 17:30:29.274 7138-7156 NetFUNNEL com...ample_android_single_activity D [NF4] Loading the virtual room. Work(projectKey=service_1, segmentKey=segKey_2548), Status(WAIT)
2025-09-15 17:30:30.007 7138-7156 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 17:30:30.396 7138-7230 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5002 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5002&key=B04303FD454C5CA18924C54783F2BC494399438D1C0EE7AA0512477FC651CDA8D0C0F1928FD7C09AB18E7593EAE92B7FBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A897BD882ABDAC46FAEC31605E83E9F49CD72C312C312C302C302C302C30&sticky=nf1
2025-09-15 17:30:30.462 7138-7157 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5002 response. Response(timestamp=1757925031536, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC496041E95666117EA3413E1FA1CF7D93C83F3BBCFCE4DDF36303B4D29BAB59285BBCFD08B8F833299D4D743DBF3C84B6D4359F81879079494C2A0482939478A89724B5E2DCE14558567E22635B848476732C312C302C302C302C302C30, 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 detectednfStartSection()が正常に呼び出された✅ 正常
[NF4] Sending 5002 requestNetFUNNELサーバーにリクエストが送信された✅ 正常
[NF4] Received 5002 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 of section control

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

Update limited inflow of section control Confirm changes of section control

即座に効果

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

7.2 区間進入の確認

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

Android section entry successful - Section 1

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

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

2025-09-15 17:30:36.726  7138-7182  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Received 5002 response. Response(timestamp=1757925037810, code=200, msg=null, key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1302C302C30, 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 17:30:36.740 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 17:30:36.740 7138-7182 NetFUNNEL com...ample_android_single_activity D onSuccess(statusCode=200, message='Success')
2025-09-15 17:30:36.750 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] Key refresh attempt detected. Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:36.758 7138-7182 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5003 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5003&key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1302C302C30&sticky=nf1
2025-09-15 17:30:36.808 7138-7157 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5003 response. Response(timestamp=1757925037885, code=201, msg=null, key=B04303FD454C5CA18924C54783F2BC49C0C7D49B86899E082C565EED4F443625926DA265156909BA64B87F00F7C565325F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080019F32F0077492B7D5F8DB92356655AFF1312C302C30, nwait=0, nnext=0, tps=0.0, ttl=5, 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, postEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 17:30:37.725 7138-7138 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')成功コールバックが発生✅ 正常
[NF4] Key refresh attempt detected区間コントロール: キータイムアウト延長が開始された✅ 正常
[NF4] Sending 5003 request区間コントロール: キータイムアウト延長リクエストが送信された✅ 正常
visibilityChanged oldVisibility=true newVisibility=false待合室WebViewが閉じられた✅ 正常

7.3 区間ナビゲーションテスト

区間フローをナビゲート:

  1. Section1 → Section2 → End: マルチステップ区間プロセス完了
  2. 各ステップが正しく動作することを確認: Fragment間のスムーズなナビゲーションを保証
  3. タイムアウト延長ログの確認: 区間中の定期的な5003リクエストを探す
Android section navigation - Section 2

予想される動作:

  • ユーザーは区間内で自由にナビゲートできます(Section1 → Section2 → End)
  • NetFUNNELは区間中にキータイムアウトを自動的に延長します(5003リクエスト)
  • 明示的な完了まで同時ユーザー数が維持されます

7.4 キー返却の確認

成功したキー返却の確認:

Android section completion - End

End fragmentに到達したときにLogcatで次のログを探してください:

2025-09-15 17:30:59.015  7138-7158  NetFUNNEL               com...ample_android_single_activity  D  [NF4] Key return attempt detected. Work(projectKey=service_1, segmentKey=segKey_2548), Control(SECTION)
2025-09-15 17:30:59.019 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Sending 5004 request. https://nf4-onprem-demo-4525.stclab.com/ts.wseq?opcode=5004&key=B04303FD454C5CA18924C54783F2BC49951551C40A5E72EE425E8BBE7154D8917EDEA09F96A8542EE989BA43DF1619125F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080018D551F84A0705E2E596EA1998D395695312C302C30&sticky=nf1
2025-09-15 17:30:59.062 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] Received 5004 response. Response(timestamp=1757925060140, code=200, msg=null, key=B04303FD454C5CA18924C54783F2BC49951551C40A5E72EE425E8BBE7154D8917EDEA09F96A8542EE989BA43DF1619125F6C6B5A1410BD25FF45AAF2D0FCF38570442F1BB67CC53F28D02A19B48CDEE2902D1EA62CCD2C8E006BBC45D5A080018D551F84A0705E2E596EA1998D395695312C302C30, nwait=0, nnext=0, tps=0.0, ttl=5, 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, postEndTs=null, postBeginTs=null, postEndTs=null, sticky=nf1, liveMessage=null, chkEnterCnt=1)
2025-09-15 17:30:59.062 7138-7158 NetFUNNEL com...ample_android_single_activity D [NF4] "Success" response from NetFUNNEL Server.
2025-09-15 17:30:59.063 7138-7158 NetFUNNEL com...ample_android_single_activity D Section key returned: Key Return Successful

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

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

要約

必須事項(必ず実行)

設定:

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

統合:

  • 必須importの追加:com.nf4.Netfunnelcom.nf4.NetfunnelCallbackcom.nf4.NetfunnelCompleteCallback
  • すべてのコールバックメソッドを実装します(Androidインターフェース要件)
  • クリックハンドラーで区間進入をNetfunnel.nfStartSection()でラップします
  • 区間進入ロジックを実行するためにonSuccessコールバックを処理します
  • 区間が完了した後にNetfunnel.nfStopSection()を呼び出します
  • nfStartSection()nfStopSection()の両方で同じキーを使用します

エラー処理:

  • 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に追加する必要があります
  • nfStartSection()およびnfStopSection()関数の両方に必要です

完全なコールバック実装

private val sectionControlCallback = 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_sectionControlSection1Fragment
)
}
}

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

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.nfStartSection(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
callback = sectionControlCallback,
activity = requireActivity()
)

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

利点:

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

堅牢なエラー処理戦略

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

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

// 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)

// 区間終了に到達するとキー返却
Netfunnel.nfStopSection(
projectKey = PROJECT_KEY,
segmentKey = SEGMENT_KEY,
completeCallback = completeCallback
)
}

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

キーを返却するとき:

  • 区間が完了した後(Section1 → Section2 → End)
  • マルチステッププロセスが完了した後
  • ビジネス作業が完了した後
  • 作業が失敗した場合でも

キー一致

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

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

Netfunnel.nfStopSection(
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. プロジェクトキーとセグメントキーがコンソールと正確に一致しているか確認(大文字小文字を区別)

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

症状: nfStartSection()が呼び出されたが応答を受信しない

デバッグステップ:

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

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

症状: 最初のユーザーは進入するが、2番目のユーザーは決して通過しない

デバッグステップ:

  1. 区間が完了した後にnfStopSection()が呼び出されているか確認
  2. nfStopSection()のキーがnfStartSection()と正確に一致しているか確認
  3. nfStopSection()実行を妨げる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呼び出し時にアプリがクラッシュする

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

デバッグステップ:

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

キー返却失敗

症状: nfStopSection()が呼び出されたがキーが返却されない

デバッグステップ:

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

区間タイムアウト問題

症状: 区間完了前にキーが自動的に返却される

デバッグステップ:

  1. NetFUNNELコンソール → セグメント → 高度な設定 → タイムアウトでタイムアウト設定を確認
  2. 区間継続時間がタイムアウト期間を超えているか確認(デフォルト20秒)
  3. [NF4] Sending 5003 requestログを探す(キータイムアウト延長)
  4. タイムアウトが期限切れになる前にnfStopSection()が呼び出されているか確認
  5. 区間ナビゲーションフローがタイムアウト期間内に完了するか確認

ネットワーク回復問題

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

デバッグステップ:

  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
    • 予想待機時間: 表示されない(区間コントロールのみ)
    • 私の後の待機者数: 0
  • 待機中にLogcatに**[NF4] Sending 5002 request**が定期的に表示される
  • **[NF4] Received 5002 responsecode=201 (WAIT)**を表示する

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

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

区間ナビゲーションテスト

  • 区間ナビゲーションが正しく動作する(Section1 → Section2 → End)
  • キータイムアウト延長が自動的に発生する(5003リクエスト)
  • 区間中に**[NF4] Sending 5003 request**が定期的に表示される
  • **[NF4] Received 5003 responsecode=201**を表示する
  • 明示的な完了まで同時ユーザー数が維持される

キー返却検証

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

エラー処理

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

Logcat検証

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