使用私有API在iOS中检测热点

好的,所以我想检测天气用户已启用热点/ tethering或不在iOS设备。 我可以使用私人API知道它不会让它到应用程序商店。

我试图通过私人api的列表/运行时标题,但有太多,以决定哪些可能会有所帮助。

或者如果我能知道UIApplicationWillChangeStatusBarFrameNotification从私人API(可能被称为主动呼叫和激活热点等)被解雇,

我试图检测个人热点 ,也使用CaptiveNetwork,但它只返回连接的Wi – Fi ssid,而不是创build的热点。

任何知识共享将是非常有益的

更新:@creker

使用上面的代码编译器显示错误“SCDynamicStoreCreate不可用:iOS上不可用。所以我进入SCDynamicStore.h并更改以下

SCDynamicStoreRef SCDynamicStoreCreate ( CFAllocatorRef allocator, CFStringRef name, SCDynamicStoreCallBack callout, SCDynamicStoreContext *context ) __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_NA); 

  SCDynamicStoreRef SCDynamicStoreCreate ( CFAllocatorRef allocator, CFStringRef name, SCDynamicStoreCallBack callout, SCDynamicStoreContext *context ) __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_6_0); 

现在我能够得到与1022和1023状态的字典。只是想通过改变文件这样(以前没做过)来确认我将有任何问题在归档构build(或任何其他问题),除此之外,事实上,我们知道这个代码不会让它到应用程序商店

没有私人的API

您可以通过使用C API枚举networking接口来检测活动的个人热点。 当hotpost处于活动状态且有人连接到它时,将会有bridge前缀的接口。 在我的iPhone 5上它是bridge100 。 如果热点被禁用或没有人连接到它,接口甚至不会在列表中。

C API甚至会返回您在该networking中的IP地址和子网掩码。

这就是我用我的应用程序来检测活动热点。

要获得SSID,您需要[[UIDevice currentDevice] name] – 个人热点SSID始终匹配设备名称。

使用私有API

您可以使用此代码获取有关个人热点的所有信息:

 SCDynamicStoreRef sc = SCDynamicStoreCreate(NULL, CFSTR("com.apple.wirelessmodemsettings.MISManager"), NULL, NULL); NSDictionary* info = (__bridge_transfer NSDictionary*)SCDynamicStoreCopyValue(sc, CFSTR("com.apple.MobileInternetSharing")); CFRelease(sc); 

当热点处于活动状态并具有连接时, info字典将如下所示:

 { Errnum = 0; ExternalInterfaces = ( "pdp_ip0" ); Hosts = { Current = 1; Max = 5; MoreAllowed = 1; Type = { AirPort = 0; Bluetooth = 0; Ethernet = 0; "USB-Ethernet" = 1; }; }; InternalInterfaces = ( bridge100 ); Reason = 0; State = 1023; Version = 2; } 

当热点活跃但没有连接时:

 { Errnum = 0; ExternalInterfaces = ( ); Hosts = { Current = 0; Max = 5; MoreAllowed = 1; Type = { AirPort = 0; Bluetooth = 0; Ethernet = 0; "USB-Ethernet" = 0; }; }; InternalInterfaces = ( ); Reason = 0; State = 1023; Version = 2; } 

当热点不活跃时:

 { Errnum = 45; ExternalInterfaces = ( ); Hosts = { Current = 0; Max = 5; MoreAllowed = 1; Type = { AirPort = 0; Bluetooth = 0; Ethernet = 0; "USB-Ethernet" = 0; }; }; InternalInterfaces = ( ); Reason = 0; State = 1022; Version = 2; } 

无论活动连接如何,当热点处于活动状态时, State键将等于1023 。 我不知道这个值是否包含位标志。 iOS实际上是检查值是否等于1023

SCDynamicStore API来自公共SystemConfiguration框架,但在iOS平台上标记为不可用。 这意味着所有的标题都在那里,你只需要复制定义而不用__OSX_AVAILABLE_STARTINGmacros。

您甚至可以观察到该设置的更改 – 您可以指定一个您要观察的值。 阅读苹果文档的实施细节。

UPDATE

所以我进入SCDynamicStore.h并改变了以下内容

我不会这样做的。 它不应该引起任何问题,但对于我来说,更改SDK头不是一个好的解决scheme。 我build议如下。 不要包含框架标题。 使用__OSX_AVAILABLE_STARTING更改或删除所需的所有方法,制作自己的标题。