5

TunnelProvider の XCode テンプレートから開始し、ホスト アプリにコードを追加して構成して開始することにより、カスタム TunnelProvider ネットワーク拡張機能を作成しようとしています。

NETunnelProviderManager のインスタンスを使用して構成していますが、saveToPreferencesWithCompletionHandler を呼び出すと、成功しました (エラー = 0)。ただし、(ゼロ以外の)接続で startVPNTunnelAndReturnError: を呼び出すと、常に次のエラーが発生します。

エラー Domain=NEVPNErrorDomain Code=1 "(null)"

関連する Apple のドキュメントをすべて読み、プログラムを SimpleTunnel テスト プログラムにできるだけ近づけようとしましたが、この「1」が表示される理由を特定できません (これは構成の問題を示しているようです)。 .

ネット上の投稿で同じ問題を抱えている人を何人か見ましたが、解決策はありません。

必要な特別な資格があり、適切なプロビジョニング プロファイルを使用した後、アプリの実行時に VPN を追加することを確認するポップアップが表示され、VPN の下の [設定] に追加されるため、それが問題ではないことがわかっています。 .

関連する場合の私のコードは次のとおりです。

NETunnelProviderManager * man = [[NETunnelProviderManager alloc] init];       
NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];

[protocol setServerAddress:@"aaa.bbb.ccc.ddd"]; // not actual value
[protocol setUsername:@"testuser"];

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

NSData *data = [[NSData alloc] init];
[dictionary setObject:@"UUID" forKey:(id)kSecAttrService];
[dictionary setObject:data forKey:(id)kSecValueData];
[dictionary setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(id)kSecAttrAccessible];
[dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(id)kSecClass];
[dictionary setObject:(__bridge id)kCFBooleanTrue forKey:(id)kSecReturnPersistentRef];

CFTypeRef passwordRef = nil;

OSStatus delStatus = SecItemDelete((__bridge CFDictionaryRef)dictionary);
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)dictionary, &passwordRef);

[protocol setPasswordReference:(__bridge NSData * _Nullable)(passwordRef)];

man.protocolConfiguration = protocol;
man.localizedDescription = @"My VPN";
man.onDemandEnabled = false;  
man.enabled = true;

[man saveToPreferencesWithCompletionHandler:^(NSError *err) {
    NSLog(@"saved preferences: error = %@", err);
    [man.connection startVPNTunnelAndReturnError:&err];        
    NSLog(@"after start tunnel: error = %@", err);
}];
4

1 に答える 1