ios 9.2 中的点播 Vpn
Vpn on demand in ios 9.2
我想使用 Network Extension framework
中可用的 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) 当我在浏览器中写入 Url 即 www.google.com,vpn 不是 connected.So 我不明白什么我在代码中做错了吗?
2) 如何提供动态域或 url 就像我在 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 连接,这是我第一个问题的答案。
然后回答我的第二个问题,我在互联网上搜索到使动态域使用通配符*
但它只会用作域名的左侧标签e.g. *.example.com.
, *
没有其他位置可用。
我希望这能帮助其他也面临同样问题的人。
我想使用 Network Extension framework
中可用的 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) 当我在浏览器中写入 Url 即 www.google.com,vpn 不是 connected.So 我不明白什么我在代码中做错了吗?
2) 如何提供动态域或 url 就像我在 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 连接,这是我第一个问题的答案。
然后回答我的第二个问题,我在互联网上搜索到使动态域使用通配符*
但它只会用作域名的左侧标签e.g. *.example.com.
, *
没有其他位置可用。
我希望这能帮助其他也面临同样问题的人。