インストールおよび初期化
このガイドは、NetFUNNEL iOSエージェントをアプリケーションに統合するための必須設定手順を説明します。
事前要件
システム要件
| 構成要素 | バージョン | 備考 |
|---|---|---|
| iOS | 12+ | アクティブなiOSデバイスの99%を含む |
| Storyboard | Objective-C, Swift | UIKitベースの開発用 |
| SwiftUI | 互換性あり | SwiftUIベースの開発用 |
ステップ1: SDKダウンロード
1.1 NetFUNNELコンソールからダウンロード

- NetFUNNELコンソールにログイン
- 移動: エージェント → モバイルエージェント → iOS
- クリック: "Traffic Control Installation File"ボタン
- ZIPファイルダウンロード:
netfunnel-ios-agent-{{version}}.zip
1.2 ファイル抽出
- ZIPファイルを抽出して以下を取得します:
netfunnel-ios-agent-{{version}}/
├── netfunnel-ios-agent-debug/
│ └── netfunnel_ios.xcframework // (開発用)
└── netfunnel-ios-agent-release/
└── netfunnel_ios.xcframework // (プロダクション用)
- 開発: debug xcframeworkを使用
- プロダクション: release xcframeworkを使用
ステップ2: 依存関係の追加
2.1 フレームワークの追加
-
プロジェクトルートに
Frameworksフォルダを作成 (.xcodeprojファイルと同じレベル) -
適切なxcframeworkを
Frameworks/にコピー:プロジェクト構造:
your-project/
├── YourProject/
│ ├── AppDelegate.swift
│ └── ...
├── Frameworks/
│ └── netfunnel_ios.xcframework // (debugまたはreleaseフォルダから)
└── YourProject.xcodeproj -
Xcodeでフレームワークを登録:
- Project Navigatorでプロジェクトを選択
- General → Frameworks, Libraries, and Embedded Contentに移動
- **+**をクリック → Add Files… →
netfunnel_ios.xcframeworkを選択 - Addをクリック
- EmbedをEmbed & Signに設定

フレームワークが疑問符(?)なしで表示されることを確認してください。疑問符が表示される場合は、右クリック → Source Control → Add netfunnel_ios.xcframework
2.2 App Transport Securityの構成 (必要な場合)
NetFUNNELサーバーがHTTPSの代わりにHTTPを使用する場合にのみ必要です。
- Modern Xcode (SwiftUI Templates)
- Legacy Xcode (UIKit Templates)
Info.plistが隠されているプロジェクト用
- Project Navigatorでアプリターゲットを選択
- Infoタブに移動
- 既存の行を右クリック → Add Row
- "App Transport Security Settings"を入力 → Dictionaryに設定
- App Transport Security Settingsを展開 → Add Row
- "Allow Arbitrary Loads"を入力 → "YES"に設定 (Boolean)
Info.plistファイルが表示されるプロジェクト用
Info.plistファイルを右クリック- "Open As" → "Source Code"を選択
- 次のXMLコードを追加:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
プロダクションビルドの場合、App Store審査拒否を避けるために、特定のサーバードメインと共にNSExceptionDomainsを使用してください。
2.3 設定確認
- プロジェクトクリーン: Product → Clean Build Folder (⌘+Shift+K)
- プロジェクトビルド: Product → Build (⌘+B)
ステップ3: エージェントの初期化
3.1 NetfunnelHandlerクラスの作成
NetFUNNELを初期化する前に、デリゲートメソッド用の専用ハンドラークラスを作成してください:
- NetfunnelHandlerファイルの作成:
- Swift
- Objective-C
- Xcodeでプロジェクトを右クリック
- New File → Swift Fileを選択
NetfunnelHandlerと名前を付ける- プロンプトが表示されたらプロジェクトターゲットに追加
重要: NetfunnelHandler.swiftを作成した後、プロジェクトターゲットに登録する必要があります。Xcodeがターゲットに追加するかどうかを尋ねます - アプリターゲットのチェックボックスを選択する必要があります。
NetfunnelHandler.swiftをAppDelegate.swiftと一緒にメインアプリフォルダに配置してください。
- Xcodeでプロジェクトを右クリック
- New File → Cocoa Touch Classを選択
- Class:
NetfunnelHandler - Subclass of:
NSObject - Language: Objective-C
- プロンプトが表示されたらプロジェクトターゲットに追加
重要: NetfunnelHandler.hとNetfunnelHandler.mを作成した後、プロジェクトターゲットに登録する必要があります。Xcodeがターゲットに追加するかどうかを尋ねます - アプリターゲットのチェックボックスを選択する必要があります。
NetfunnelHandler.hとNetfunnelHandler.mをAppDelegate.hとAppDelegate.mと一緒にメインアプリフォルダに配置してください。
- ハンドラー実装の追加:
- Swift
- Objective-C
// NetfunnelHandler.swift
import Foundation
import Netfunnel_iOS
class NetfunnelHandler: NSObject, NetfunnelDelegate {
static let shared = NetfunnelHandler()
var onSuccess: ((String, String, Int, String) -> Void)?
var onError: ((String, String, Int, String) -> Void)?
var onNetworkError: ((String, String, Int, String) -> Void)?
var onContinue: ((String, String, Int, String, Int, Int, String, Int) -> Void)?
var onBlock: ((String, String, Int, String) -> Void)?
var onClose: ((String, String, Int, String) -> Void)?
var onComplete: ((String, String, Int, String) -> Void)?
private override init() {
super.init()
}
func nfSuccess(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onSuccess?(projectKey, segmentKey, statusCode, message)
}
func nfError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onError?(projectKey, segmentKey, statusCode, message)
}
func nfNetworkError(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onNetworkError?(projectKey, segmentKey, statusCode, message)
}
func nfContinue(projectKey: String, segmentKey: String, statusCode: Int, message: String,
aheadWait: Int, behindWait: Int, waitTime: String, progressRate: Int) {
onContinue?(projectKey, segmentKey, statusCode, message, aheadWait, behindWait, waitTime, progressRate)
}
func nfBlock(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onBlock?(projectKey, segmentKey, statusCode, message)
}
func nfClose(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onClose?(projectKey, segmentKey, statusCode, message)
}
func nfComplete(projectKey: String, segmentKey: String, statusCode: Int, message: String) {
onComplete?(projectKey, segmentKey, statusCode, message)
}
}
// NetfunnelHandler.h
#import <Foundation/Foundation.h>
#import <Netfunnel_iOS/Netfunnel_iOS.h>
@interface NetfunnelHandler : NSObject <NetfunnelDelegate>
+ (instancetype)sharedInstance;
@property (nonatomic, copy) void(^onSuccess)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@property (nonatomic, copy) void(^onError)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@property (nonatomic, copy) void(^onNetworkError)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@property (nonatomic, copy) void(^onContinue)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message, NSInteger aheadWait, NSInteger behindWait, NSString *waitTime, NSInteger progressRate);
@property (nonatomic, copy) void(^onBlock)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@property (nonatomic, copy) void(^onClose)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@property (nonatomic, copy) void(^onComplete)(NSString *projectKey, NSString *segmentKey, NSInteger statusCode, NSString *message);
@end
// NetfunnelHandler.m
#import "NetfunnelHandler.h"
@implementation NetfunnelHandler
+ (instancetype)sharedInstance {
static NetfunnelHandler *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (void)nfSuccessWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onSuccess) {
self.onSuccess(projectKey, segmentKey, statusCode, message);
}
}
- (void)nfErrorWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onError) {
self.onError(projectKey, segmentKey, statusCode, message);
}
}
- (void)nfNetworkErrorWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onNetworkError) {
self.onNetworkError(projectKey, segmentKey, statusCode, message);
}
}
- (void)nfContinueWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message
aheadWait:(NSInteger)aheadWait
behindWait:(NSInteger)behindWait
waitTime:(NSString *)waitTime
progressRate:(NSInteger)progressRate {
if (self.onContinue) {
self.onContinue(projectKey, segmentKey, statusCode, message, aheadWait, behindWait, waitTime, progressRate);
}
}
- (void)nfBlockWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onBlock) {
self.onBlock(projectKey, segmentKey, statusCode, message);
}
}
- (void)nfCloseWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onClose) {
self.onClose(projectKey, segmentKey, statusCode, message);
}
}
- (void)nfCompleteWithProjectKey:(NSString *)projectKey
segmentKey:(NSString *)segmentKey
statusCode:(NSInteger)statusCode
message:(NSString *)message {
if (self.onComplete) {
self.onComplete(projectKey, segmentKey, statusCode, message);
}
}
@end
3.2 NetFUNNELコンソールから初期化コードを取得
- NetFUNNELコンソールにログイン
- 移動: エージェント → モバイルエージェント → iOS
- 実際のサーバーURLが含まれた初期化コードをコピー

3.3 AppDelegateで初期化
メソッドの開始部分でapplication(_:didFinishLaunchingWithOptions:)に初期化してください。このステップを省略すると = バイパスモード (保護なし)。
3.3.1 プロジェクトタイプの確認
- UIKitプロジェクト: ✅ すでにAppDelegateがある - 3.3.3にスキップ
- SwiftUIプロジェクト: ⚠️ AppDelegateを作成する必要がある - 3.3.2に従ってください
3.3.2 AppDelegateの作成 (SwiftUIのみ)
AppDelegateファイルの作成
- Swift
- Objective-C
- Xcodeでプロジェクトを右クリック
- New File → Swift Fileを選択
AppDelegateと名前を付ける
- Xcodeでプロジェクトを右クリック
- New File → Cocoa Touch Classを選択
- Class:
AppDelegate, Subclass of:NSObject
SwiftUIに接続
- Swift
- Objective-C
メインAppファイル(例: YourAppNameApp.swift)を開いて以下を追加してください:
// YourAppNameApp.swift
import SwiftUI
@main
struct YourAppNameApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
SwiftUIがあるObjective-Cプロジェクトの場合、まだSwift Appファイルが必要です:
// YourAppNameApp.swift (Objective-CプロジェクトのSwiftファイル)
import SwiftUI
@main
struct YourAppNameApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
3.3.3 初期化コードの追加
NetFUNNELコンソールから初期化コードをコピーしてAppDelegateファイルに追加してください:
- コンソールからコピー: NetFUNNELコンソールからコピーした初期化コードを使用 (3.2)
- AppDelegateに追加:
application(_:didFinishLaunchingWithOptions:)メソッドに貼り付け
- Swift
- Objective-C
AppDelegate.swiftを開いてapplication(_:didFinishLaunchingWithOptions:)メソッドに初期化コードを追加してください:
// AppDelegate.swift
import UIKit
import Netfunnel_iOS
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// ここにNetFUNNELコンソール初期化コードを貼り付けてください
Netfunnel.initialize(
clientId: "{{CLIENT_ID}}",
delegate: self // デリゲートを指定されたデリゲートオブジェクトまたは'self'に設定します
)
return true
}
}
AppDelegate.mを開いてapplication:didFinishLaunchingWithOptions:メソッドに初期化コードを追加してください:
// AppDelegate.m
#import <UIKit/UIKit.h>
#import <Netfunnel_iOS/Netfunnel.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ここにNetFUNNELコンソール初期化コードを貼り付けてください
[agent initializeWithClientId:@"{{CLIENT_ID}}"
delegate:self];
return YES;
}
@end
3.3.4 初期化パラメータの修正
変更する必要がある重要な事項:
-
delegateパラメータの変更:
- コンソールコード:
delegate: self(Swift) またはdelegate:self(Objective-C) - 次に変更:
delegate: NetfunnelHandler.shared(Swift) またはdelegate:[NetfunnelHandler sharedInstance](Objective-C)
- コンソールコード:
-
テスト用にデバッグロギングを有効化:
- 変更:
printLog: false→printLog: true - 目的: デバッグのためにXcode ConsoleでNetFUNNELログを確認
- 変更:
修正されたAppDelegateコード:
- Swift
- Objective-C
// AppDelegate.swift - 修正版
import UIKit
import Netfunnel_iOS
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Netfunnel.initialize(
clientId: "{{CLIENT_ID}}",
delegate: NetfunnelHandler.shared // 'self'から変更
)
return true
}
}
// AppDelegate.m - 修正版
#import <UIKit/UIKit.h>
#import <Netfunnel_iOS/Netfunnel.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[agent initializeWithClientId:@"{{CLIENT_ID}}"
delegate:[NetfunnelHandler sharedInstance]]; // 'self'から変更
return YES;
}
@end
より良いパフォーマンスとセキュリティのために、プロダクションビルドでprintLog: falseに設定することを覚えておいてください。
プレースホルダー{{CLIENT_ID}}をNetFUNNELコンソールの実際のクライアントIDに置き換えてください。
高度: 例外処理
プロダクションアプリの場合、try-catchエラー処理を追加してprintLog: falseに設定してください:
- Swift
- Objective-C
import UIKit
import Netfunnel_iOS
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
do {
try Netfunnel.initialize(
clientId: "{{CLIENT_ID}}",
delegate: NetfunnelHandler.shared
)
} catch {
print("NetFUNNEL initialization failed: \(error)")
// エラー処理: エラー画面を表示またはアプリを終了
}
return true
}
}
#import <UIKit/UIKit.h>
#import <Netfunnel_iOS/Netfunnel.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
@try {
[agent initializeWithClientId:@"{{CLIENT_ID}}"
delegate:[NetfunnelHandler sharedInstance]];
} @catch (NSException *exception) {
NSLog(@"NetFUNNEL initialization failed: %@", exception.reason);
// エラー処理: エラー画面を表示またはアプリを終了
}
return YES;
}
@end
必須パラメータ
| パラメータ | タイプ | 必須 | 説明 |
|---|---|---|---|
clientId | String | はい | NetFUNNELコンソールから提供されるクライアントID |
delegate | NetfunnelDelegate | はい | プロトコルを実装するデリゲートオブジェクト |
clientIdの欠落 = バイパスモード (待合室保護なし)
networkTimeout、retryCount、printLogなどの追加初期化パラメータについては、初期化オプションリファレンスを参照してください。
ステップ4: ビルドおよびインストール確認
SDK設定および初期化を完了したので、プロジェクトをビルドしてNetFUNNELが正しく動作することを確認します。
4.1 プロジェクトビルド
同期およびビルド
-
プロジェクトクリーン
Product→Clean Build Folderに移動- クリーン完了を待つ
-
プロジェクトビルド
⌘+Bを押すかProduct→Buildに移動- Issue Navigatorでエラーを監視
ビルド成功確認
-
ビルド出力確認
- Issue Navigatorにコンパイルエラーがないことを確認
- 成功したフレームワークリンクメッセージを確認
- NetFUNNELフレームワークが正しく含まれていることを確認
-
依存関係確認
- Project Navigatorでプロジェクトを展開
netfunnel_ios.xcframeworkがリストされていることを確認- フレームワークが疑問符なしで表示されることを確認
4.2 NetFUNNEL初期化テスト
デバッグロギングの有効化
NetFUNNELが正しく初期化されることを確認するには、AppDelegateで一時的にデバッグロギングを有効にしてください:
より良いパフォーマンスとセキュリティのために、プロダクションビルドでprintLog = falseに設定することを覚えておいてください。
- Swift
- Objective-C
// AppDelegate.swift
Netfunnel.initialize(
clientId: "{{CLIENT_ID}}",
delegate: NetfunnelHandler.shared
)
// AppDelegate.m
[agent initializeWithClientId:@"{{CLIENT_ID}}"
delegate:[NetfunnelHandler sharedInstance]];
コンソール出力の監視
-
コンソールを開く
View→Debug Area→Activate Console(⌘+Shift+Y)に移動- または下部パネルの
Consoleタブをクリック
-
NetFUNNELログのフィルタリング
- コンソールフィルタフィールドに
NetFUNNELを入力してNetFUNNELログでフィルタリング - これにより、NetFUNNEL関連のログメッセージのみが表示されます
- コンソールフィルタフィールドに
-
アプリの実行
- デバイスまたはシミュレーターでアプリを実行
- Consoleで初期化成功メッセージを確認:
[NF4] Initialization successful. NetFUNNEL Version: {{version}}
トラブルシューティング
インストールまたは初期化中に問題が発生した場合、以下の一般的な問題に対する詳細な解決方法を含む包括的なトラブルシューティング & FAQガイドを参照してください:
- インストール問題: フレームワークローディング、プロジェクト構成、ビルド設定
- 初期化問題: エージェントが初期化されない、デリゲート登録、バイパスモード
- 関数呼び出しエラー: 初期化エラー、コールバック問題、コンテキスト問題
- ネットワークおよび接続問題: タイムアウトエラー、接続問題、サーバー通信
- ビルドおよび環境問題: Xcode構成、iOSバージョン互換性
一般的な問題に対する即座のヘルプ:
- コンソール確認:
NetFUNNELでフィルタリングして詳細ログを確認 - 構成確認: すべての設定がNetFUNNELコンソールと一致することを再確認
- シンプルな設定でテスト: まず基本構成で開始
- クライアントID確認: クライアントIDがNetFUNNELコンソールのものと一致することを確認