Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS NETunnelProviderManager saving multiple configurations

I'm trying to save my VPN configuration to the preferences, which already works (I'm able to connect to my VPN). But for some reason each time i run the code again instead of using the last configuration it creates a new one. So, i end up with a bunch of configurations.

Here is my current code, if anyone could let me know what's going wrong with it that would be awesome. Thanks!

// 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]];
                }

            }
        }];
    }
}];
like image 245
Nathan F. Avatar asked Mar 10 '23 22:03

Nathan F.


1 Answers

Use + (void)loadAllFromPreferencesWithCompletionHandler:(void (^)(NSArray<NEAppProxyProviderManager *> *managers, NSError *error))completionHandler API instead.

create new protocol only when managers.count == 0 in the block.

[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...
}];
like image 64
JZAU Avatar answered Apr 25 '23 03:04

JZAU