ios - iOS 9.2 中的 VPN 点播

标签 ios objective-c iphone vpn

我想使用网络扩展框架中提供的VPN on Demand功能,我想在浏览器中打开特定URL或站点时连接VPN .

例如:当我写 www.google.com 时,我的 VPN 将被连接,而不是在任何其他网站上。

经过网上大量搜索,我尝试了以下代码

NEVPNManager *manager = [NEVPNManager sharedManager];
 [manager loadFromPreferencesWithCompletionHandler:^(NSError *error) {
            if(error) {
                NSLog(@"Load error: %@", error);
            } else {


NEVPNProtocolIKEv2 *p = [[NEVPNProtocolIKEv2 alloc] init];
   p.username = @"Username";
   p.passwordReference = [res objectForKey:@"v_PersistentRef"];
   p.serverAddress = strAddress;
   p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
   p.serverCertificateIssuerCommonName = @"COMODO RSA Domain Validation Secure Server CA";
   p.serverCertificateCommonName =strAddress;
   p.identityData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"point-to-client2" ofType:@"p12"]];
   p.identityDataPassword = @"vpnuser";
   p.localIdentifier = strAddress;
   p.remoteIdentifier = strAddress;
   p.useExtendedAuthentication = YES;
   p.disconnectOnSleep = NO;
   [manager setProtocol:p];

   NSLog(@"password: %@", [manager protocol].passwordReference);
   [manager setOnDemandEnabled:YES];
   [manager setEnabled:YES];

然后通过以下代码设置onDemandRules:

 NEEvaluateConnectionRule * ru = [[NEEvaluateConnectionRule alloc] initWithMatchDomains:@[@"google.com"]  andAction:NEEvaluateConnectionRuleActionConnectIfNeeded];


ru.probeURL = [[NSURL alloc] initWithString:@"http://www.google.com"];


NSArray *arr = [[NSArray alloc] initWithObjects:ru, nil];
 NEOnDemandRuleEvaluateConnection *ec =[[NEOnDemandRuleEvaluateConnection alloc] init];
ec.interfaceTypeMatch = 2;
[ec setConnectionRules:arr];
 NSArray *arr2 = [[NSArray alloc] initWithObjects:ec, nil];
            NSLog(@"onDemandRules: %@", arr2);
//
            [manager setOnDemandRules:arr2];
            [manager setLocalizedDescription:@"VPN Profile"];
            [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
                if(error) {
                    NSLog(@"Save error: %@", error);
                }
                else {
                 NSLog(@"Saved");
                }

这里更新了VPN配置文件,然后通过以下代码启动VPN连接:

NSError *startError;
    [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
    if(startError) {
        NSLog(@"Start error: %@", startError.localizedDescription);
    } else {
        NSLog(@"Connection established!");
    }

现在我面临以下问题:

1)当配置文件更新时,点播功能无法正常工作,因为当我在浏览器中写入网址(即 www.google.com)时,VPN 未连接。所以我无法理解我在代码中做错了什么?

2)如何提供动态域或网址,就像我在 initWithMatchDomains:@[@"google.com"]probeUrl 中放置的那样适用于 google.com 以及 google.de 或任何 google 域?

我知道这是一个相当长且详细的问题,但我真的需要帮助。

任何帮助将不胜感激。

谢谢

最佳答案

好吧,我要回答我的问题了,因为我几乎解决了问题。 On Demand Vpn 功能完美运行,因为我对代码进行了稍微修改,如下所示:

我刚刚为域创建了一个数组

NSArray *arrDomains =[[NSArray alloc] initWithObjects:@"youtube.com","google.com",nil]; 

然后评估连接规则

 NEEvaluateConnectionRule * ru = [[NEEvaluateConnectionRule alloc] initWithMatchDomains:arrDomains  andAction:NEEvaluateConnectionRuleActionConnectIfNeeded];

然后使用该属性

ru.useDNSServers = arrDomains;

然后剩下的代码与上面问题中提到的相同。

NSArray *arrRules = [[NSArray alloc] initWithObjects:ru,nil];
                            NEOnDemandRuleEvaluateConnection *ec = [[NEOnDemandRuleEvaluateConnection alloc] init];
                            ec.interfaceTypeMatch = 2;
                            [ec setConnectionRules:arrRules];
                            NSArray *arr2 = [[NSArray alloc] initWithObjects:ec, nil];
                            NSLog(@"onDemandRules: %@", arr2);
                            [manager setOnDemandRules:arr2];

上面的代码可以在数组中定义的域上创建VPN连接,这是我第一个问题的答案。

为了回答我的第二个问题,我在互联网上搜索到要使动态域使用通配符 * 但它仅用作域名 的左标签例如*.example.com.* 无法使用其他位置。

我希望这能帮助其他也遇到同样问题的人。

关于ios - iOS 9.2 中的 VPN 点播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36482535/

相关文章:

ios - 群组发布如何在用户选择上传应用时刷新** APP **

ios - 'SecRandomCopyBytes' 的冲突类型

iphone - 如何为 iPhone ARM 二进制文件创建 NOP 指令?

iPhone 5 View 框架变化

ios - 如何让 iPhone 上的返回键让键盘消失?

ios - 从用户点击快速将图像添加到 UIImageView

ios - 带有 UIButtons 的 UIView 在单击或旋转之前未显示

iphone - 带有 UIButton 和 UITapGestureRecognizer 的 UIScrollView

iOS:无法获取缓存目录的内容

ios - 确定应用程序是否在 iPhone 6 键盘上以 "scaled"模式运行?