iOS 上获取 Wifi 列表其实有很大限制,在 iOS 9 以前是不能获取Wifi列表的,只能获取当前连接的 Wifi 信息,也就表示只有连接了 Wifi 才能定位。
Apple 在 iOS 9 以后,提供了获取Wifi列表的API,但是获取Wifi列表是有门槛的,主要步骤有:
- 1、向 Apple 申请开发 Network Extension 权限
- 2、申请包含 Network Extension 的描述文件
- 3、配置 Info.plist
- 4、配置 entitlements
- 5、iOS 获取 Wifi 列表代码实现
- 6、获取Wifi列表回调
首先要先写封邮件给 [email protected] ,问苹果要开发 Network Extension 的权限。
苹果收到邮件后会自动回复邮件,在 https://developer.apple.com/contact/network-extension/ 里面填写申请表格,内容包括:
Organization:
Company / Product URL:
What's your product's target market?
What's your company's primary function?
Describe your application and how it will use the Network Extension framework.
What type of entitlement are you requesting?
。。。
申请后大概两周左右能收到 Aplle的 确认信,如:
Hi,
Thanks for your interest in the Network Extension APIs.
We added a new template containing the Network Extension entitlements to your team.
。。。。
选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。
Xcode Info.plist 里 Required background modes 添加 一个 network-authentication(item)
Demo.entitlements(Demo是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES
导入头文件
#import
代码实现
- (void)getWifiList {
if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
[NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
for (NEHotspotNetwork* network in cmd.networkList) {
NSLog(@"network.SSID = %@",network.SSID);
}
}
}];
}
kNEHotspotHelperCommandTypeFilterScanList: 表示扫描到 Wifi 列表信息。
NEHotspotNetwork 里有如下信息:
- SSID:Wifi 名称
- BSSID:站点的 MAC 地址
- signalStrength: Wifi信号强度,该值在0.0-1.0之间
- secure:网络是否安全 (不需要密码的 Wifi,该值为 false)
- autoJoined: 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false 。
- justJoined:网络是否刚刚加入
- chosenHelper:HotspotHelper是否为网络的所选助手
官方文档连接
当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:
这个时候你就能看到控制台源源不断的Log。
No account with iTunes Connect access have been found for the team "XXX".iTunes Connect access is required for App Store distribution.
解决办法:
1、关闭Xcode
2、终端命令:rm -fr ~/Library/Developer/Xcode/DerivedData/
3、重启Xcode,然后再重新上传App Store
就是说你要清理一下Xcode中缓存的派生数据,在重启Xcode就OK了
从6月1日开始苹果要求之后审核的项目必须支持IPv6,如果不予以支持,应用将被拒绝。所以最近一次审核我的应用就被拒绝了…理由为下:
所以如何模拟IPv6网络用于开发中的测试,便成了棘手的问题。鉴于网上有很多解决方案都是通过使用RJ45端口后,采用网络共享的方式来予以解决。当前方案的确可以解决问题,但是鉴于最新的macbook都已取消了RJ45端口,采用此种解决方案无疑增加成本。所以本人采用了如下方式予以解决IPv6网络的模拟问题。
4.在‘共享以下来源的连接’中,选择‘iPhone USB’,然后在勾选‘Wi-Fi’,最后勾选’创建NAT64网络’
5.点击’Wi-Fi选项’,进行热点共享的相关设置
6.点击’互联网共享’,开启热点
到此为止通过iPhone搭建IPv6测试网络的环境基本上完成了。
当前操作为,拿出我们准备的第二台用于测试的iOS设备,并且连接上刚才我们共享出的IPv6网络。
请注意IPv6连接完成后,DNS的区别
至此所有准备工作已经完成,我们可以继续调试代码了。
SSID全称Service Set IDentifier, 即Wifi网络的公开名称.在IOS 4.1以上版本提供了公开的方法来获取该信息。但是Xcode 10编译出的App在iOS 12中无法获取WiFi的SSID。在iOS 12+中需要在Xcode中为应用授权获取WiFi信息的能力。授权后,Xcode会自动在App ID和应用的权限列表中增加获取WiFi信息的权限。操作如下:
Xcode -> [Project Name] -> Targets -> [Target Name] -> Capabilities -> Access WiFi Information -> ON
操作完毕后,会发现工程的.entitlements文件中多了一对Key-Value:
这样,就能在iOS 12+中正常获取到WiFi的SSID了。