2

VPNサーバーをプログラムで構成および接続するためにネットワーク拡張フレームワークを使用しています。VPN を開始および停止できます。viewDidLoad で VPN を構成する次のコードを作成しました。

NEVPNManager *manager = [NEVPNManager sharedManager];
[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {

        if(manager.protocol == nil)
        {
            NSString *filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"VPNCert" ofType:@"p12"];
            NSData *certData = [NSData dataWithContentsOfFile:filePath];
            NSString *certPassword = @"password";

            NSString *vpnUsername = @"username";
            NSString *vpnPassword = @"password";
            NSString *vpnUrl = @"VPN Server IP";

            // This saves my credentials to the keychain and returns a persistent keychain reference
            NSData *passRef = [self addVPNCredentialsToKeychain:vpnUsername withPassword:vpnPassword];

            NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
            p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
            p.serverAddress = vpnUrl;
            p.username = vpnUsername;
            p.passwordReference = passRef;
            p.identityData = certData;
            p.identityDataPassword = certPassword;
            p.disconnectOnSleep = NO;
            p.useExtendedAuthentication = YES;

            manager.protocol = p;
            manager.enabled = YES;
            [manager setOnDemandEnabled:NO];
            [manager setLocalizedDescription:@"VPN Network"];
            [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {

                if(error)
                {
                    NSLog(@"Load error: %@", error);
                }
            }];
        }
    }];

ボタンが押されたときに VPN を開始するためのコードも作成しました。

- (IBAction)buttonPressed:(id)sender {

    NEVPNManager *manager = [NEVPNManager sharedManager];
    [manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {

                if (!error)
                {
                    NSError *startError = [[NSError alloc] init];
                    [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
                }
            }];
}

私のために働いているケース。

  1. モバイルデータで VPN を接続し、wifi に切り替えた場合、この場合 VPN は切断されません。
  2. また、モバイル データで VPN に接続し、wifi に切り替えてからモバイル データ VPN に戻ると、VPN が切断されません。

問題は

WiFi で VPN に接続してからモバイル データに切り替えると、この場合 VPN が停止します。ユーザーが VPN を停止する場合にのみ、VPN を停止する必要があります。

VPN が停止しているため、VPN の構成中に欠落している手順はありますか?

前もって感謝します。

4

1 に答える 1

0

接続を維持するには、ルールを追加する必要があります。オンデマンドも有効にする [manager setOnDemandEnabled:YES];

迅速

    let connectRule = NEOnDemandRuleConnect()
    connectRule.interfaceTypeMatch = .any

    let disconnectRule = NEOnDemandRuleDisconnect()
    disconnectRule.probeURL = URL(string:VPNCredentialsModel.instance.vpnProbeURL()!)
于 2016-11-25T20:36:42.420 に答える