iOS 连接WIFI

144 阅读2分钟

在 iOS 中使用 NEHotspotConfiguration 保存 SSID 和密码后,‌可以实现再次连接时自动无感连接且不弹窗‌。具体实现逻辑和注意事项如下:

一、核心机制

  1. ‌**joinOnce 参数控制**‌
    通过设置 joinOnce 属性为 NO(默认值),系统会将此 Wi-Fi 配置保存到设备的全局网络列表中。下次设备检测到该 SSID 时,iOS 会自动尝试连接而无需再次弹窗‌8。
  2. 首次弹窗的必要性
    首次连接时弹出的系统弹窗是 iOS 的安全机制,用于明确用户授权。此弹窗无法绕过,但仅需用户确认一次‌。

二、注意事项

  1. 权限配置

    • 需在开发者账号中为 App ID 启用 Hotspot 权限‌8。
    • 项目中需添加 NetworkExtension.framework 并开启 Capabilities 中的 Hotspot Configuration‌。

image.png

  1. 设备兼容性

    • 仅支持 iOS 11 及以上版本‌8。
    • 部分设备若存在网络配置冲突(如手动保存过相同 SSID),可能导致自动连接失效,需引导用户删除旧配置‌。
  2. 私有地址问题

    • 如果设备启用了“私有地址”(iOS 14+),可能导致 MAC 地址变化,影响已保存网络的自动连接。建议提示用户关闭此功能(需手动操作)。

三、配置示例代码

#import <NetworkExtension/NetworkExtension.h>

-(**void**)connectSSID:(NSString *)ssid password:(NSString *)password connectHandle:(ConnectHandle)connectHandle;

{

    // 创建将要连接的WIFI配置实例

    **if** ( **@available**(iOS 11.0, *)) {
        //初始化 -- 创建持久化配置

        NEHotspotConfiguration *hotspotConfig = [NEHotspotConnectManager isBlankString:password] ? [[NEHotspotConfiguration alloc] initWithSSID:ssid] : [[NEHotspotConfiguration alloc] initWithSSID:ssid passphrase:password isWEP:**NO**];

        hotspotConfig.joinOnce = **NO**;// 必须设为 NO 以持久化

        

        // 检查是否已存在配置(避免重复弹窗)

        [[NEHotspotConfigurationManager sharedManager] getConfiguredSSIDsWithCompletionHandler:^(NSArray<NSString *> *ssids) {

            **if** ([ssids containsObject:ssid]) {

                // 已存在配置,直接静默连接

                [[NEHotspotConfigurationManager sharedManager] applyConfiguration:hotspotConfig completionHandler:**nil**];

            } **else** {

                // 首次连接(会弹窗)

                [[NEHotspotConfigurationManager sharedManager] applyConfiguration:hotspotConfig completionHandler:^(NSError *error) {

                    **if** (error) {

                        NSLog(@"首次配置失败: %@", error.localizedDescription);

                    } **else** {

                        NSLog(@"用户已授权,配置已保存");

                    }

                }];

            }

        }];

    } **else** {

        // Fallback on earlier versions

    }
}