【发布时间】:2019-07-08 22:10:46
【问题描述】:
我正在尝试从沙盒应用程序中检测 macOS 中的 VPN 连接是否处于活动状态,但很难为各种 VPN 服务找到通用解决方案。目前,我正在使用 2 种方法(见下文),但这些方法似乎对所有 VPN 服务/客户端都不可靠。
以下方法适用于 Cisco AnyConnect 客户端和我的 VPN 服务,但对于其他 VPN 客户端/服务,例如 Viscosity(可能还有其他 OpenVPN 客户端),这些方法根本不起作用。在比较 not-active-VPN-connection 和 active-VPN-connection 的值时,在 DNS 服务器或主要服务值中均未检测到任何变化。
我还应该提到,我已经看到 this post 并且认为这不是这个特定用例的好解决方案。我不想假设对于每个 VPN 服务,总是会有一个主机在 VPN 连接处于活动状态时仅可用。
任何指导将不胜感激。先感谢您。
1) 查看当前的 DNS 服务器(取自here)
- (NSString *)getDNSAddressesCSV
{
NSMutableArray *addresses = [NSMutableArray new];
union res_sockaddr_union servers[NI_MAXSERV];
int serversFound = res_9_getservers(_state, servers, NI_MAXSERV);
char hostBuffer[NI_MAXHOST];
for (int i = 0; i < serversFound; i ++)
{
union res_sockaddr_union s = servers[i];
if (s.sin.sin_len > 0)
{
if (EXIT_SUCCESS == getnameinfo((struct sockaddr *)&s.sin, // Pointer to your struct sockaddr
(socklen_t)s.sin.sin_len, // Size of this struct
(char *)&hostBuffer, // Pointer to hostname string
sizeof(hostBuffer), // Size of this string
nil, // Pointer to service name string
0,
NI_NUMERICHOST))
{ // Flags given
[addresses addObject:[NSString stringWithUTF8String:hostBuffer]];
}
}
}
return [addresses componentsJoinedByString:@","];
}
2)从SCDynamicStore获取当前主服务(取自here)
- (NSString *) getVPNService
{
SCDynamicStoreRef dynamicStoreDomainState = SCDynamicStoreCreate(NULL,
CFSTR("appNameGoesHere"),
NULL,
NULL);
if (dynamicStoreDomainState)
{
NSString *netIPv4Key = [NSString stringWithFormat:@"%@/%@/%@/%@",
kSCDynamicStoreDomainState,
kSCCompNetwork,
kSCCompGlobal,
kSCEntNetIPv4];
NSMutableDictionary *netIPv4Dictionary = (NSMutableDictionary *) CFBridgingRelease(SCDynamicStoreCopyValue(dynamicStoreDomainState, (CFStringRef)netIPv4Key));
if (netIPv4Dictionary )
{
NSString *primaryService = [netIPv4Dictionary objectForKey:(NSString *)kSCDynamicStorePropNetPrimaryService];
if (primaryService)
{
CFRelease(dynamicStoreDomainState);
CFRelease((__bridge CFTypeRef)(netIPv4Key));
return primaryService;
}
else
{
CFRelease(dynamicStoreDomainState);
CFRelease((__bridge CFTypeRef)(netIPv4Key));
return @"";
}
}
CFRelease(dynamicStoreDomainState);
}
return @"";
}
【问题讨论】:
-
@GeneCode - Apple 禁止未经数据收集和存储 (developer.apple.com/app-store/review/guidelines/…) 中定义的同意收集用户和系统数据。数据收集和存储不同于观察网络配置,然后用于在应用中提供用户期望的功能。
标签: objective-c cocoa vpn