目前很多智能设备配置网络的时候都有app内部直连Wi-Fi的功能(iOS11之前需要用户跳到Wi-Fi设置界面去连),iOS11后苹果提供 NEHotspotConfigurationManager 类用于app内直连周边的Wi-Fi;具体步骤:
1、向开发者中心申请使用NEHotspotHelper的权限(理由要充分,详述app使用NEHotspotHelper的理由,一般两周给结果);
2、给App ID的entitlements file配置权限:
3、在Xcode-Build Phases中导入NetworkExtension.framework框架:
4、在Xcode - Capabilities 中开启Hostpot Configuration:
5、代码实现:
//导入头文件
#if TARGET_IPHONE_SIMULATOR
#else
#import <NetworkExtension/NetworkExtension.h>
#endif
//1、app内直连Wi-Fi:
NEHotspotConfiguration * hotmode = [[NEHotspotConfiguration alloc] initWithSSID:@"wifiSSID" passphrase:@"password" isWEP:NO];
__weak typeof(self) weakSelf = self;
[[NEHotspotConfigurationManager sharedManager] applyConfiguration:hotmode completionHandler:^(NSError * _Nullable error) {
if (error) {
if (error.code == NEHotspotConfigurationErrorAlreadyAssociated) {
//已连接
}
else if (error.code == NEHotspotConfigurationErrorUserDenied) {
//用户点击取消
}
else{
//注:这个方法存在一个问题,如果你加入一个不存在的WiFi,会弹出无法加入WiFi的弹框,但是本方法的回调error没有值。在这里,我是通过判断当前wifi是否是我要加入的wifi来解决这个问题的
}
}
}];
//2、获取配置过的WIFI列表:
if (@available(iOS 11.0, *)) {
[[NEHotspotConfigurationManager sharedManager] getConfiguredSSIDsWithCompletionHandler:^(NSArray * array) {
}];
}
//3、获取当前手机连接的wifi:
//导入
#import<SystemConfiguration/CaptiveNetwork.h>
- (NSString *)getWifiName {
NSArray *ifs = (__bridge id)CNCopySupportedInterfaces();
id info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge id)CNCopyCurrentNetworkInfo((CFStringRef)CFBridgingRetain(ifnam));
if (info && [info count]) {
break;
}
}
if ([info isKindOfClass:[NSDictionary class]]) {
NSString *wifiSsid = [info objectForKey:@"SSID"];
return wifiSsid;
}
return nil;
}