ios笔记

Wifi 定位原理及 iOS Wifi 列表获取

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列表回调

1、向 Apple 申请开发 Network Extension 权限

首先要先写封邮件给 [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.

。。。。

2、申请包含 Network Extension 的描述文件

选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。

3、配置 Info.plist

Xcode Info.plist 里 Required background modes 添加 一个 network-authentication(item)

4、配置 entitlements

Demo.entitlements(Demo是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES

enter image description here

5、iOS 获取 Wifi 列表代码实现

导入头文件

#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是否为网络的所选助手

官方文档连接

6、获取Wifi列表回调

当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:

  • 打开手机系统设置 -> WLAN -> 系统 Wifi 列表加载出来时,上面代码部分才会回调,才能获取到 Wifi 列表。

这个时候你就能看到控制台源源不断的Log。

注意事项

  • 1、获取Wifi列表功能由于是需要申请后台权限,所以能后台激活App(应用程序),而且激活后App的进程能存活几个小时。
  • 2、整个获取Wifi列表不需要App用户授权,也就是在App用户无感知下获取设备的Wifi列表信息,使用时请正当使用。
  • 3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已经覆盖很广了。

iOS - No account with iTunes Connect access have been found for the team “”.iTunes Connect access is

这里写图片描述

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了

通过iPhone搭建IPv6测试网络

从6月1日开始苹果要求之后审核的项目必须支持IPv6,如果不予以支持,应用将被拒绝。所以最近一次审核我的应用就被拒绝了…理由为下:

所以如何模拟IPv6网络用于开发中的测试,便成了棘手的问题。鉴于网上有很多解决方案都是通过使用RJ45端口后,采用网络共享的方式来予以解决。当前方案的确可以解决问题,但是鉴于最新的macbook都已取消了RJ45端口,采用此种解决方案无疑增加成本。所以本人采用了如下方式予以解决IPv6网络的模拟问题。

前期准备

  1. iPhone一台
  2. macbook一台
  3. 其他iOS设备一台(iPhone,iPad)
  4. 数据线一根

操作步骤

  1. 将iPhone通过数据线与mac相连;

  2. 打开个人热点,让mac连接到手机热点;

    ios笔记_第1张图片

    让mac连接到手机热点

  3. 打开系统偏好设置,并点击“共享”,(点击时,需要同时按住‘option’键

ios笔记_第2张图片

4.在‘共享以下来源的连接’中,选择‘iPhone USB’,然后在勾选‘Wi-Fi’,最后勾选’创建NAT64网络

ios笔记_第3张图片

5.点击’Wi-Fi选项’,进行热点共享的相关设置

ios笔记_第4张图片

6.点击’互联网共享’,开启热点

到此为止通过iPhone搭建IPv6测试网络的环境基本上完成了。

连接iOS设备进行测试

当前操作为,拿出我们准备的第二台用于测试的iOS设备,并且连接上刚才我们共享出的IPv6网络。

ios笔记_第5张图片

请注意IPv6连接完成后,DNS的区别

至此所有准备工作已经完成,我们可以继续调试代码了。

IOS12获取wifi信息

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

ios笔记_第6张图片

操作完毕后,会发现工程的.entitlements文件中多了一对Key-Value:

配置wifi权限

这样,就能在iOS 12+中正常获取到WiFi的SSID了。

你可能感兴趣的:(web前端)