iPhone在没有私有库的情况下获得SSID

iPhone在没有私有库的情况下获得SSID

我有一个商业应用程序,它有一个完全合法的理由来查看它连接到的网络的SSID:如果它连接到一个第三方硬件设备的Adhoc网络,它需要以一种不同于连接到互联网的方式运行。

我所看到的有关获得SSID的一切都告诉我,我必须使用Apple80211,据我所知,它是一个私有库。我还读到,如果我使用一个私人图书馆,苹果将不会批准该应用程序。

我是被困在一个苹果和一个艰难的地方之间,还是这里缺少什么东西?


沧海一幻觉
浏览 610回答 3
3回答

慕桂英3389331

从iOS 7或8开始,您可以这样做,它利用ARC和模块,这些模块将自动链接到所需的框架中:@import&nbsp;SystemConfiguration.CaptiveNetwork;/**&nbsp;Returns&nbsp;first&nbsp;non-empty&nbsp;SSID&nbsp;network&nbsp;info&nbsp;dictionary. &nbsp;*&nbsp;&nbsp;@see&nbsp;CNCopyCurrentNetworkInfo&nbsp;*/-&nbsp;(NSDictionary&nbsp;*)fetchSSIDInfo{ &nbsp;&nbsp;&nbsp;&nbsp;NSArray&nbsp;*interfaceNames&nbsp;=&nbsp;CFBridgingRelease(CNCopySupportedInterfaces()); &nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"%s:&nbsp;Supported&nbsp;interfaces:&nbsp;%@",&nbsp;__func__,&nbsp;interfaceNames); &nbsp;&nbsp;&nbsp;&nbsp;NSDictionary&nbsp;*SSIDInfo; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(NSString&nbsp;*interfaceName&nbsp;in&nbsp;interfaceNames)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SSIDInfo&nbsp;=&nbsp;CFBridgingRelease( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CNCopyCurrentNetworkInfo((__bridge&nbsp;CFStringRef)interfaceName)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"%s:&nbsp;%@&nbsp;=>&nbsp;%@",&nbsp;__func__,&nbsp;interfaceName,&nbsp;SSIDInfo); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;isNotEmpty&nbsp;=&nbsp;(SSIDInfo.count&nbsp;>&nbsp;0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isNotEmpty)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SSIDInfo;}(这是为IOS 4.1+编写的代码示例的现代化。唯一的变化是引入了更清晰的变量名称,并采用了ARC和模块。示例输出:2011-03-04&nbsp;15:32:00.669&nbsp;ShowSSID[4857:307]&nbsp;-[ShowSSIDAppDelegate&nbsp;fetchSSIDInfo]:&nbsp;Supported&nbsp;interfaces:&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;en0)2011-03-04&nbsp;15:32:00.693&nbsp;ShowSSID[4857:307]&nbsp;-[ShowSSIDAppDelegate&nbsp;fetchSSIDInfo]:&nbsp;en0&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BSSID&nbsp;=&nbsp;"ca:fe:ca:fe:ca:fe"; &nbsp;&nbsp;&nbsp;&nbsp;SSID&nbsp;=&nbsp;XXXX; &nbsp;&nbsp;&nbsp;&nbsp;SSIDDATA&nbsp;=&nbsp;<01234567&nbsp;01234567&nbsp;01234567>;}请注意,模拟器中不支持任何ifs。在你的设备上测试。在4.1之前,您可能会很幸运地浏览系统配置字典。例如,使用scutil在我的Mac上:$&nbsp;scutil>&nbsp;show&nbsp;State:/Network/Interface/en1/AirPort<dictionary>&nbsp;{ &nbsp;&nbsp;Power&nbsp;Status&nbsp;:&nbsp;1 &nbsp;&nbsp;SecureIBSSEnabled&nbsp;:&nbsp;FALSE &nbsp;&nbsp;BSSID&nbsp;:&nbsp;<data>&nbsp;0xcafecafecafe &nbsp;&nbsp;SSID_STR&nbsp;:&nbsp;XXXX &nbsp;&nbsp;SSID&nbsp;:&nbsp;<data>&nbsp;0x012345670123456701234567 &nbsp;&nbsp;Busy&nbsp;:&nbsp;FALSE &nbsp;&nbsp;CHANNEL&nbsp;:&nbsp;<dictionary>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;CHANNEL&nbsp;:&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;CHANNEL_FLAGS&nbsp;:&nbsp;10 &nbsp;&nbsp;}}>&nbsp;exitIOS 12您必须启用从功能访问wifi信息。在iOS 12及更高版本中使用此功能非常重要,请在Xcode中为您的应用程序启用访问WiFi信息功能。启用此功能时,Xcode会自动将访问WiFi信息权限添加到应享权利文件和应用程序ID中。文档链接SWIFT 4.2func&nbsp;getConnectedWifiInfo()&nbsp;->&nbsp;[AnyHashable:&nbsp;Any]?&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;ifs&nbsp;=&nbsp;CFBridgingRetain(&nbsp;CNCopySupportedInterfaces())&nbsp;as?&nbsp;[String], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ifName&nbsp;=&nbsp;ifs.first&nbsp;as&nbsp;CFString?, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;info&nbsp;=&nbsp;CFBridgingRetain(&nbsp;CNCopyCurrentNetworkInfo((ifName)))&nbsp;as?&nbsp;[AnyHashable:&nbsp;Any]&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;info&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nil}

当年话下

以下是基于@elsurudo代码的清理后的ARC版本:-&nbsp;(id)fetchSSIDInfo&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSArray&nbsp;*ifs&nbsp;=&nbsp;(__bridge_transfer&nbsp;NSArray&nbsp;*)CNCopySupportedInterfaces(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"Supported&nbsp;interfaces:&nbsp;%@",&nbsp;ifs); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSDictionary&nbsp;*info; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(NSString&nbsp;*ifnam&nbsp;in&nbsp;ifs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;=&nbsp;(__bridge_transfer&nbsp;NSDictionary&nbsp;*)CNCopyCurrentNetworkInfo((__bridge&nbsp;CFStringRef)ifnam); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"%@&nbsp;=>&nbsp;%@",&nbsp;ifnam,&nbsp;info); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(info&nbsp;&&&nbsp;[info&nbsp;count])&nbsp;{&nbsp;break;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;info;}
打开App,查看更多内容
随时随地看视频慕课网APP