在 iOS 中使用 NEHotspotConfiguration 保存 SSID 和密码后,可以实现再次连接时自动无感连接且不弹窗。具体实现逻辑和注意事项如下:
一、核心机制
- **
joinOnce
参数控制**
通过设置joinOnce
属性为NO
(默认值),系统会将此 Wi-Fi 配置保存到设备的全局网络列表中。下次设备检测到该 SSID 时,iOS 会自动尝试连接而无需再次弹窗8。 - 首次弹窗的必要性
首次连接时弹出的系统弹窗是 iOS 的安全机制,用于明确用户授权。此弹窗无法绕过,但仅需用户确认一次。
二、注意事项
-
权限配置
- 需在开发者账号中为 App ID 启用
Hotspot
权限8。 - 项目中需添加
NetworkExtension.framework
并开启Capabilities
中的Hotspot Configuration
。
- 需在开发者账号中为 App ID 启用
-
设备兼容性
- 仅支持 iOS 11 及以上版本8。
- 部分设备若存在网络配置冲突(如手动保存过相同 SSID),可能导致自动连接失效,需引导用户删除旧配置。
-
私有地址问题
- 如果设备启用了“私有地址”(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
}
}