前段时间在开发蓝牙功能,蓝牙功能开发结束之后最近又在开发WiFi功能。WiFi功能也算简单,主需要导入使用苹果系统自带的框架即可,仅仅单纯的获取手机当前连接的WiFi名称,或者获取手机系统显示的WiFi列表,那就so easy了。这里我介绍一下WiFi开发主要的步骤和流程,一些其他的使用细节不再一一阐述。
苹果在iOS9.0以后提供了获取WiFi列表的API,但是需要开发人员主动发邮件给苹果,等待审核通过之后打开获取WiFi列表权限才能使用;但是在iOS9.0之前,只能获取到手机当前连接的WiFi名称等信息。
一、iOS9.0之前获取WiFi权限
1、导入头文件
#import
2、获取手机当前连接的WiFi信息的方法
//获取手机当前连接WiFi信息
- (NSString *)getWifiName {
NSString *wifiName = nil;
CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();
if (!wifiInterfaces) {
return @"未知";
}
NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;
for (NSString *interfaceName in interfaces) {
CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));
if (dictRef) {
NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef;
wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];
CFRelease(dictRef);
}
}
CFRelease(wifiInterfaces);
return wifiName;
}
3、直接使用第2步的方法,进一步操作
比如,这里我直接获取使用WiFi的名字,然后赋值给UItextfield:self.networkTF.text = [self getWifiName];
二、iOS9.0之后获取WiFi权限
iOS9.0之后获取WiFi权限需要以下几个主要步骤:
1、向 Apple 申请开发 Network Extension 权限;
写封邮件给 [email protected] ,向苹果要开发 Network Extension 的权限。申请邮件内容如下所示,仅供参考:
Hi, I am a personal developer on ios9, I am using xcode8.0 to develop app, AppleID:XXXXXXXXXX, I want to get SSID and BSSID and RSSI by scanning near WiFi, I hope to get the NetworkExtension permission, please approve!
苹果收到邮件后会自动回复邮件,然后根据苹果回复的邮件提供的链接,打开连接根据选项逐一填写,然后提交之后14天左右就可以收到苹果的确认回复邮件。
2、申请包含 Network Extension 的描述文件;
申请获取WiFi权限通过之后,需要进入开发者账号里面配置创建Network Extension的描述文件,配置成功之后点击下载,下载完成双击打开描述文件。
3、配置 Info.plist;
打开项目,在Xcode的Info.plist中Required background modes 添加一个 network-authentication(item)
4、配置 entitlements;
在Xcode的Info.plist中Entitlements File下添加一个键值对: com.apple.developer.networking.HotspotHelper -> YES
5、iOS 获取 Wifi 列表代码实现;
导入头文件:
#import
//实现部分
- (void)getWifiList {}
6、获取Wifi列表回调
以上的五个步骤操作之后,运行项目,会发现没有WiFi列表的回调,那是因为没有刷新WiFi列表,这时候就需要你手动打开手机系统设置—>WLAN—>系统WiFi列表加载出来的时候,上面的代码才会执行回调,才获取到WiFi列表。
三、代理方法
#pragma mark —Register a Hotspot Helper—
+ (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler
@param options
kNEHotspotHelperOptionDisplayName :WIFI注释tag字符串// 这里设置的内容将会在WiFi列表中每个WiFi下边展示
@param queue dispatch_queue_t 用来调用handle的block
@param handler NEHotspotHelperHandler block 用于执行处理helper commands.
@return 注册成功为YES, 否则NO.
@discussion 这个API一旦调用成功,应用程序有资格在后台启动,并参与各种热点相关的功能。 当应用程序启动此方法,应该调用一次,再次调用它,就不会产生影响,并且返回NO。
#pragma mark —Manage Hotspot Networks—
+ (BOOL)logoff:(NEHotspotNetwork *)network
@param network 对应当前关联的WiFi网络NEHotspotNetwork
@return 注销命令已成功进入队列为YES, 否则NO.
@discussion 调用这个方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向应用程序发出的“handler”模块,网络参数须符合当前关联的WiFi网络,必须来自对NEHotspotHelperCommand网络属性或者方法supportedInterfaces
+ (NSArray *)supportedNetworkInterfaces
@return 如果没有网络接口被管理就返回nil,否则就返回NEHotspotNetwork对象数组。
@discussion 每个网络接口由NEHotspotNetwork对象表示,当前返回的数组包含一个NEHotspotNetwork对象,代表Wi-Fi接口。
四、具体实现调用的方法,获取wifi列表,并给指定ssid做标记
- (void)getWifiList {
NSMutableDictionary* options = [[NSMutableDictionary alloc] init];
[options setObject:@“上网” forKey:kNEHotspotHelperOptionDisplayName];
dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", NULL);
BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
NEHotspotNetwork* network;
NSLog(@"COMMAND TYPE: %ld", (long)cmd.commandType);
[cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];
if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {
NSLog(@"WIFILIST: %@", cmd.networkList);
for (network in cmd.networkList) {
//NSLog(@"COMMAND TYPE After: %ld", (long)cmd.commandType);
if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"test"]) {
double signalStrength = network.signalStrength;
NSLog(@"Signal Strength: %f", signalStrength);
[network setConfidence:kNEHotspotHelperConfidenceHigh];
[network setPassword:@"password"];
NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];
NSLog(@"Response CMD %@", response);
[response setNetworkList:@[network]];
[response setNetwork:network];
[response deliver];
}
}
}
}];
NSLog(@"result :%d", returnType);
NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];
NSLog(@"wifiArray:%@", array);
NEHotspotNetwork *connectedNetwork = [array lastObject];
NSLog(@"supported Network Interface: %@", connectedNetwork);
}
以上就是本节的全部内容,欢迎关注山掌柜的微信公众号,更多精彩等你来!