iOS开发 App内自动连接指定Wi-Fi

目前很多智能设备配置网络的时候都有app内部直连Wi-Fi的功能(iOS11之前需要用户跳到Wi-Fi设置界面去连),iOS11后苹果提供 NEHotspotConfigurationManager 类用于app内直连周边的Wi-Fi;具体步骤:
1、向开发者中心申请使用NEHotspotHelper的权限(理由要充分,详述app使用NEHotspotHelper的理由,一般两周给结果);
2、给App ID的entitlements file配置权限:iOS开发 App内自动连接指定Wi-Fi_第1张图片
3、在Xcode-Build Phases中导入NetworkExtension.framework框架:
iOS开发 App内自动连接指定Wi-Fi_第2张图片
4、在Xcode - Capabilities 中开启Hostpot Configuration:
iOS开发 App内自动连接指定Wi-Fi_第3张图片
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;
}


你可能感兴趣的:(iOS开发笔记)