基本コントロール統合
コードベース統合を使用してNetFUNNEL Androidエージェントで基本コントロールを実装する完全なガイドです。
これは利用可能な2つの統合方法のうちの1つです。統合方法概要を参照して区間コントロールと比較し、ユースケースに最も適した方法を選択してください。
動作方式
ユーザー体験:
- ユーザーがボタンをクリックするか、作業をトリガーします
- 現在の画面に待合室が表示されます
- 進入が許可されると待合室が閉じられ、サービスが継続されます
最適用途:
- ボタンクリック保護(ログイン、決済、注文)
- API呼び出し制限
- 特定の作業に対する精密制御
区間コントロールとの主な違い:
- 基本コントロール: 進入速度を制御します(キーが迅速に返却される)
- 区間コントロール: 固定された同時ユーザー数を維持します(区間終了までキーが維持される)
事前要件
- インストールおよび初期化完了
- NetFUNNELコンソールアクセス権限
- Android開発環境
このガイドはサンプルアプリケーションを使用して基本コントロール統合パターンを示します。実際のアプリケーションコードは表示された例と異なる場合があります。統合概念を理解し、パターンを特定のコードベース、関数名、ビジネスロジックに合わせて調整することに集中してください。
💡 練習テンプレート: NetFUNNEL SDK統合練習のための**Androidアプリケーション(Single Activity)**テンプレートが準備されたサンプルプロジェクトを確認してください。
ステップ1: セグメント作成
コードベース統合は基本コントロールと区間コントロールの両方をサポートします。このガイドは基本コントロールを使用します。
1.1 新しいセグメント作成
- NetFUNNELコンソール →
プロジェクト→セグメントに移動します - **
+**ボタンをクリックして新しいセグメントを作成します

1.2 制御タイプ選択
基本コントロールを選択し、次へをクリックします

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

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

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

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

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

ステップ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 統合ポイントの識別
- 対象ボタン:
card_basic_control_function(リソース集約的なボタン) - クリックリスナー:
setupViews()メソッドがクリックハンドラーを設定します - 統合位置:
navigationManager.navigateWithDelay()が呼び出される直前 - ここで行う理由: サーバー処理が開始される直前の正確な時点です
- 保護戦略: サーバー呼び出し前にNetFUNNELキューを追加します
全体フロー分析:
- Fragment作成:
onViewCreated()がsetupViews()を呼び出します - ボタン設定:
setupViews()が各ボタンのクリックリスナーを設定します - ユーザー作業: ユーザーが"基本コントロール(コードベース統合)"ボタンをクリックします
- 現在の動作:
navigationManager.navigateWithDelay()が即座に実行されます - サーバー負荷: これがリソース集約的な作業をトリガーします
ロジック:
- NetFUNNELなし: ボタンクリック → 即座にサーバーリクエスト → 潜在的な過負荷
- NetFUNNEL使用: ボタンクリック → キュー確認 → 制御されたサーバーリクエスト → 成功
ステップ3: キー発行関数の実装(nfStart)
以下の例はサンプルアプリケーションのMainFragmentクリックハンドラーにNetFUNNELを統合する方法を示します。このパターンを実際のコード構造に合わせて調整してください - 保護が必要な他の関数名、イベントハンドラー、またはビジネスロジックがある場合があります。
3.1 キーの取得
まず、コンソールからプロジェクトキーとセグメントキーを見つけてください:
- NetFUNNELコンソール →
プロジェクト→セグメントに移動します - セグメントをクリックします
- プロジェクトキーとセグメントキーをコピーします

3.2 nfStart関数の理解
nfStart関数は次のような基本構造を持ちます:
- Kotlin
- Java
Netfunnel.nfStart(
projectKey = "your_project_key", // コンソールから取得
segmentKey = "your_segment_key", // コンソールから取得
callback = yourCallback, // 応答を処理するコールバック
activity = this // 現在のactivityコンテキスト
)
Netfunnel.INSTANCE.nfStart(
"your_project_key", // コンソールから取得
"your_segment_key", // コンソールから取得
yourCallback, // 応答を処理するコールバック
this // 現在のactivityコンテキスト
);
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を追加します:
- Kotlin
- Java
// MainFragment.kt
import com.nf4.Netfunnel
import com.nf4.NetfunnelCallback
// 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 (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では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 successful | NetFUNNELエージェントが正しくロードされた | ✅ 良好 |
[NF4] Initial entry detected | nfStart()が正常に呼び出された | ✅ 良好 |
[NF4] Sending 5101 request | NetFUNNELサーバーにリクエストが送信された | ✅ 良好 |
[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リファレンスを参照してください。
3.7 主要な実装ポイント
- Project/Segment keys: NetFUNNELコンソールから正確なキーを使用します
- 必須import:
com.nf4.Netfunnelおよびcom.nf4.NetfunnelCallbackのimportを追加します - コールバック実装: すべてのコールバックメソッドを実装します(Androidインターフェース要件)
- 堅牢なエラー処理:
onSuccessおよびonErrorはサービス可用性のためにビジネスロジックを実行しますonNetworkErrorはロギングのみ実行します(自動回復のためにuseNetworkRecoveryMode = trueを使用)
- Activityコンテキスト: 常に現在のactivityコンテキストを
nfStart()に渡します - 包括的なロギング: デバッグのためにすべてのコールバック応答をロギングします
ステップ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
)
}
}
次に発生すること:
- ユーザーがBasicControlFragmentに移動 - Fragmentライフサイクルが開始されます
- Fragmentが完全にロードされる -
onCreateView()、setupViews()完了 - ユーザーセッションがアクティブになる - これで保護された機能を使用できます
- キーを返却する必要がある - キュー内の次のユーザーが進入できるようにします
nfStop実装に関する重要な注意事項:
nfStopはnfStartが先に呼び出される必要なく、独立して呼び出すことができます。nfStartが呼び出されなかった場合、NetFUNNELは必要に応じてキー解放を自動的に処理するか、キーがなければ何も実行しません。これにより、条件付き確認なしでどのシナリオでもnfStopを安全に呼び出すことができ、実装が単純になります。
4.2 キー返却のための統合ポイントの識別
統合ポイントオプション:
| 統合ポイント | 使用時期 | 利点 |
|---|---|---|
| Fragmentライフサイクル | シンプルなナビゲーションフロー | 実装が簡単で、ほとんどの場合に動作します |
| ビジネスロジック完了 | 複雑な作業(API呼び出し、処理) | 精密な制御、実際の作業後にキー返却 |
| ユーザー作業完了 | ユーザー開始作業 | ユーザーが作業を完了するときにキー返却 |
4.3 適切な統合ポイントの選択
サンプルアプリケーションの場合:
現在のビジネスロジック: navigationManager.navigateWithDelay()
- 実行する作業: サーバー処理をシミュレートし、BasicControlFragmentに移動します
- 完了時点: BasicControlFragmentが正常にロードされるとき
- 最適な統合ポイント: Fragmentライフサイクルイベント(onViewCreated、setupViews)
統合戦略:
- Fragment作成: BasicControlFragmentが完全にロードされるときにキー返却
- シンプルで信頼できる: ナビゲーションベースのフローに動作します
- ユーザー体験: ユーザーが実際にサービスを使用できるときにキーが返却されます
4.4 統合ポイントロジックの検証
全体フロー分析:
- ユーザーがボタンをクリック →
nfStart()が呼び出される - 待合室が表示される → ユーザーがキューで待機
- 進入が許可される →
onSuccessコールバックが発生 - ビジネスロジックが実行される →
navigationManager.navigateWithDelay()が実行される - BasicControlFragmentがロードされる → ユーザーがこれでサービスを使用できる
- キー返却が必要 →
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が初期化され、使用可能であると仮定します
キー返却実装が正しく動作するかテストしてみましょう。
アプリを実行し、次のテスト順序に従ってください:
- "基本コントロール(コードベース統合)"ボタンをクリックします - 待合室が表示されるはずです
- NetFUNNELコンソールで進入許容数を0から1に変更します - これは進入を許可します
- 待合室が閉じることを観察します - 消えてBasicControlFragmentに移動するはずです
- 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 detected | nfStart()が正常に呼び出された | ✅ 正常 |
[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 detected | nfStop()が呼び出された | ✅ 正常 |
[NF4] Sending 5004 request | キー返却リクエストがサーバーに送信された | ✅ 正常 |
[NF4] Received 5004 response with code=200 | キー返却成功 | ✅ 正常 |
Key returned: Key Return Successful | 完了コールバックが発生 | ✅ 正常 |
テスト順序:
- 進入許容数 = 0で開始: 待合室が表示され、5002リクエストが繰り返されます
- 進入許容数を1に変更: 5002応答が
code=200に変更され、待合室が閉じられます - Fragmentロード: BasicControlFragment
onViewCreated()がnfStop()を呼び出します - キー返却: 5004リクエスト/応答がキー返却を確認します
問題が発生した場合:
- 5004ログがない: BasicControlFragmentで
nfStop()が呼び出されているか確認してください - キー返却失敗:
nfStart()とnfStop()間のプロジェクト/セグメントキーが正確に一致しているか確認してください - Fragmentがロードされない:
onSuccessコールバックがナビゲーションを正しく実行しているか確認してください - 待合室が閉じない: コンソールで進入許容数が1に設定されているか確認してください
待合室 → 進入 → Fragmentロード → キー返却の全体フローが表示されれば、実装が正しく動作しています!エラー処理を強化し、より堅牢なコールバック管理を追加できます。
5.4 主要な実装ポイント
ビジネスロジックが完了したらNetFUNNELキーを返却してください。NetFUNNELはタイムアウト後に自動的にキーを返却しますが、手動返却はより良いユーザー体験とキュー効率を提供します。
キー返却ルール:
- ✅ 常に: ビジネスロジックが完了した後にキーを返却します(成功または失敗)
- ⚠️ 自動タイムアウト: 手動で返却しない場合、NetFUNNELが自動的にキーを返却します
- タイミング:
nfStart()直後ではなく、ビジネスロジックが完了した後に呼び出します
実装チェックリスト:
- 正確なキー一致:
nfStop()のキーはnfStart()と正確に一致する必要があります - Fragmentライフサイクル: キー返却タイミングに
onViewCreated()を使用します - 完全なコールバック: 完了処理のために常に
NetfunnelCompleteCallbackを実装します - 一貫したキー: 全体フローで同じプロジェクト/セグメントキーを使用します
nfStopパラメータ、応答処理、および高度なキー返却パターンの詳細については、APIリファレンスを参照してください。
ステップ6: 待合室テスト(進入許容数 = 0)
以下のテストステップはサンプルアプリケーションに基づいています。テストプロセスを実際のアプリケーションに合わせて調整してください - ボタン名、Fragmentナビゲーション、および確認ステップを特定の実装に合わせて置き換えてください。
6.1 作業トリガー
-
Logcatログのクリア(クリーンな状態で観察したい場合)
- Android StudioでLogcatのゴミ箱アイコンをクリックして以前のログをクリアします
- またはコマンドを使用:
adb logcat -c
-
保護されたボタンをクリック(例: "基本コントロール(コードベース統合)"ボタン)
予想結果: 現在の画面に待合室WebViewが表示されます
6.2 待合室表示の確認
次の要素が正しく表示されているか確認してください:
進入許容数が0に設定され、1人のユーザーのみが接続されている場合、次を確認してください:
- 私の待機順序: 1
- 予想待機時間: 00:00:00(時:分:秒)
- 私の後ろの待機者数: 0
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 successful | NetFUNNELエージェントが正しくロードされた | ✅ 正常 |
[NF4] Initial entry detected | nfStart()が正常に呼び出された | ✅ 正常 |
[NF4] Sending 5101 request | NetFUNNELサーバーにリクエストが送信された | ✅ 正常 |
[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 セグメント設定の更新
- NetFUNNELコンソールに戻ります
- セグメントの
編集ボタンをクリックして編集画面を開きます

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

確認をクリックするとすぐに待合室が消え、即座にBasicControlFragmentに移動します。この瞬間を観察するには、待合室が現在表示されている別の画面を開いておいてください。
7.2 進入確認
予想結果: 待合室が即座に消え、BasicControlFragmentに移動します
進入確認のために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 detected | nfStop()が呼び出された | ✅ 正常 |
[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統合問題の簡単なデバッグ
- リクエスト/応答フローの追跡
- キー返却作業のモニタリング
- ネットワーク接続問題の識別
一般的な問題および問題解決
待合室が表示されない
症状: ボタンクリックは正常に動作しますが、待合室が表示されません
デバッグステップ:
- AndroidエラーのためにLogcatを確認:
adb logcat | grep -i error - ApplicationクラスでNetFUNNEL初期化を確認
- コンソールでセグメントが有効化されているか確認(無効化されていない)
- テストのために進入許容数が0に設定されているか確認
- プロジェクトキーとセグメントキーがコンソールと正確に一致しているか確認(大文字小文字を区別)
コールバックが発生しない
症状: nfStart()が呼び出されましたが、応答を受信できません
デバッグステップ:
- NetFUNNELログのためにLogcatを確認:
adb logcat | grep NetFUNNEL - NetFUNNELサーバーへのネットワーク接続を確認
- セグメントが有効化されているか確認(無効化されていない)
- 待合室を強制的に表示するために進入許容数 = 0で試行
- すべてのコールバックメソッドが実装されているか確認(Android要件)
ユーザーがキューに閉じ込められる
症状: 最初のユーザーは進入しますが、2番目のユーザーは決して通過しません
デバッグステップ:
- ビジネスロジックが完了した後に
nfStop()が呼び出されているか確認 nfStop()のキーがnfStart()と正確に一致しているか確認nfStop()実行を妨げるAndroidエラーを見つける- Logcatで
[NF4] Key return attempt detectedログを確認 - ログに
[NF4] Sending 5004 requestが表示されるか確認
待合室が表示されるが進入を許可しない
症状: 待合室が表示されますが、進入許容数 = 1でもユーザーが決して通過しません
デバッグステップ:
- コンソールでセグメント状態を確認 - "ブロック"モードではないか確認
- 進入許容数が1以上に設定されているか確認
- Logcatで
[NF4] Sending 5002 requestを確認(再進入リクエスト) - NetFUNNELログでエラー応答を見つける
- NetFUNNELサーバーへのネットワーク接続を確認
NetFUNNEL呼び出し時にアプリクラッシュ
症状: nfStart()またはnfStop()呼び出し時にアプリがクラッシュします
デバッグステップ:
- 必須importが追加されているか確認:
com.nf4.Netfunnel、com.nf4.NetfunnelCallback - ApplicationクラスでNetFUNNELが初期化されているか確認
- すべてのコールバックメソッドが実装されているか確認(Androidインターフェース要件)
nfStart()にactivityコンテキストが正しく渡されているか確認- NetFUNNELエージェントが正しくインストールされているか確認
キー返却失敗
症状: nfStop()が呼び出されましたが、キーが返却されません
デバッグステップ:
nfStop()のキーがnfStart()と正確に一致しているか確認(大文字小文字を区別)- Logcatで
[NF4] Key return attempt detectedメッセージを確認 - ログで
[NF4] Sending 5004 requestを見つける [NF4] Received 5004 responseがcode=200であるか確認NetfunnelCompleteCallbackが実装されているか確認
ネットワーク回復問題
症状: ネットワーク接続問題中にユーザーが閉じ込められます
デバッグステップ:
- Application初期化で
useNetworkRecoveryMode = trueを確認 - NetFUNNELサーバーへのネットワーク接続を確認
- ネットワーク問題をシミュレートするために機内モードのオン/オフでテスト
- Logcatで
onNetworkErrorコールバック呼び出しをモニタリング onNetworkErrorがビジネスロジックを実行していないか確認(回復モードに依存)
QAチェックリスト
実装前の検証
- プロジェクトキー / セグメントキーがコンソールと正確に一致する(コンソールで再確認)
- ApplicationクラスでNetFUNNELエージェントが正しく初期化されている
- 必須importが追加されている:
com.nf4.Netfunnel、com.nf4.NetfunnelCallback、com.nf4.NetfunnelCompleteCallback - すべてのコールバックメソッドが実装されている(Androidインターフェース要件)
待合室テスト(進入許容数 = 0)
- 進入許容数 = 0のときに待合室WebViewが正しく表示される
- 待合室が正しい詳細を表示する:
- 私の待機順序: 1
- 予想待機時間: 00:00:00(時:分:秒)
- 私の後ろの待機者数: 0
- 待機中にLogcatに**
[NF4] Sending 5002 request**が定期的に表示される - **
[NF4] Received 5002 responseがcode=201(WAIT)**を表示する
進入テスト(進入許容数 = 1)
- 進入許容数を1に変更するときに
onSuccessコールバックが発生する -
onSuccessコールバックが元のビジネスロジックを実行する - 進入時に待合室が即座に消える
- 対象Fragmentへのナビゲーションが正常に発生する
キー返却検証
- 完了ポイントでキー返却が正しく動作する
- Logcatに**
[NF4] Key return attempt detected**が表示される -
[NF4] Sending 5004 requestがHTTP 200で発生する - **
[NF4] Received 5004 responseがcode=200**を表示する - キー返却が
nfStart呼び出しごとに正確に1回発生する - キー返却がビジネスロジック完了後に発生する
エラー処理
- コールバック分岐がすべての必須状態に対して実装されている:
-
onSuccess- 元のロジックを実行 -
onError- システムエラーを適切に処理する(ビジネスロジック進行) -
onNetworkError- ネットワーク問題を適切に処理する(ロギングのみ実行) -
onBlock- ブロック状態を適切に処理する -
onClose- ユーザーキャンセルを適切に処理する -
onContinue- 待機進行状況を適切に処理する
-
- Application初期化でネットワーク回復モードが有効化されている
- キー一致 -
nfStartとnfStopでprojectKey/segmentKeyが同一である - すべてのコールバック応答に対する包括的なロギングが実装されている
Logcat検証
-
package:mine NetFUNNELフィルターでNetFUNNELログが表示される - 初期化成功メッセージが表示される
- ボタンクリック時に初期進入検出メッセージが表示される
- 仮想待合室ロードメッセージが表示される
- キー返却試行検出メッセージが表示される
- 完了コールバックにキー返却成功メッセージが表示される