【问题标题】:iOS NETunnelProviderManager saving multiple configurationsiOS NETunnelProviderManager 保存多个配置
【发布时间】:2017-06-25 11:07:46
【问题描述】:

我正在尝试将我的 VPN 配置保存到首选项中,该首选项已经有效(我能够连接到我的 VPN)。但是由于某种原因,每次我再次运行代码而不是使用最后一个配置时,它都会创建一个新配置。所以,我最终得到了一堆配置。

这是我当前的代码,如果有人可以让我知道它出了什么问题,那就太棒了。谢谢!

// Initialize Manager
NETunnelProviderManager *manager = [[NETunnelProviderManager alloc] init];

[manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
    if (error) {
        NSLog(@"Load Error: %@", error.description);
    } else {

        // Create the protocol object
        NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init]; // Create the protocol object

        // Configure the protocol object
        protocol.providerBundleIdentifier = @"com.nfisc.testvpn.ptp";                 // Bundle ID of tunnel provider
        protocol.providerConfiguration = @{};                                         // Currently blank, but will be used later
        protocol.serverAddress = @"0.0.0.0";                                          // Ommited for security reasons
        protocol.username = @"username";                                              // The username for the configuration
        protocol.identityDataPassword = @"password";                                  // The password for the configuration
        protocol.disconnectOnSleep = NO;

        // Configure the manager with the protocol
        manager.protocolConfiguration = protocol;
        manager.enabled = true;

        [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
            if (error) {
                NSLog(@"Save Error: %@", error.description);
            } else {
                if ([[manager connection] status] != NEVPNStatusConnected) {
                    NSLog(@"Starting VPN");
                    [self start:manager];
                } else {
                    NSLog(@"VPN Already Connected");
                    [_statusLabel setText:@"Connected"];
                    [_statusLabel setTextColor:[UIColor greenColor]];
                }

            }
        }];
    }
}];

【问题讨论】:

    标签: ios objective-c network-programming networkextension nevpnmanager


    【解决方案1】:

    解决方案是先调用[NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:,然后再做其余的事情。

    固定代码:

    __block NETunnelProviderManager *manager = [[NETunnelProviderManager alloc] init];
    
    NETunnelProviderProtocol *protocol = [[NETunnelProviderProtocol alloc] init];
    protocol.providerBundleIdentifier = @"com.nfisc.testvpn.ptp";   // bundle ID of tunnel provider
    protocol.providerConfiguration = @{@"key": @"value"};
    protocol.serverAddress = @"0.0.0.0";        // VPN server address
    protocol.username = @"username";
    protocol.identityDataPassword = @"password";
    manager.protocolConfiguration = protocol;
    manager.enabled = true;
    
    [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray<NETunnelProviderManager *> * _Nullable managers, NSError * _Nullable error) {
        if ([managers count] > 0) {
            manager = [managers objectAtIndex:0];
            [self start:manager];
        } else {
            [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
                if (error) {
                    NSLog(@"Error 1: %@", error.description);
                } else {
                    [manager loadFromPreferencesWithCompletionHandler:^(NSError * _Nullable error) {
                        if (error) {
                            NSLog(@"Error 2: %@", error.description);
                        } else {
                            [self start:manager];
                        }
                    }];
                }
            }];
        }
    }
    

    【讨论】:

    • 嘿@jacky,我们必须同时提交,但我肯定会接受你的:) 不幸的是,我必须等待 24 小时才能奖励你。
    • 谢谢!我有一些开发 VPN 相关应用的经验。如果您还有任何问题,请随时告诉我。
    【解决方案2】:

    改用 + (void)loadAllFromPreferencesWithCompletionHandler:(void (^)(NSArray&lt;NEAppProxyProviderManager *&gt; *managers, NSError *error))completionHandler API。

    仅当块中 manager.count == 0 时创建新协议。

    [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray<NETunnelProviderManager *> * _Nullable managers, NSError * _Nullable error) {
        if (error) {
            NSLog(@"Load Error: %@", error.description);
        }
    
        NETunnelProviderManager *manager;
        if (managers.count > 0) {
            manager = managers[0];
        }else {
            manager = [[NETunnelProviderManager alloc] init];
            manager.protocolConfiguration = [[NETunnelProviderProtocol alloc] init];
        }
    
    //... your code here...
    }];
    

    【讨论】:

    • 感谢您的解决方案,但我收到了多个 vpn 状态通知的另一个问题,尽管我从控制器中删除了通知的观察者。对此有任何帮助吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多