异步调用NEHotspotConfigurationManager.apply后,如何提取NEHotspotConfigurationError类型错误?
异步调用NEHotspotConfigurationManager.apply后,如何提取NEHotspotConfigurationError类型错误?
这个问题我之前也踩过坑,主要是因为Swift async/await环境下抛出的any Error,和NEHotspotConfigurationError枚举的兼容逻辑不是直接强转那么简单。你遇到的“转换总是失败”的警告,本质是因为系统返回的错误其实是NSError实例,属于NEHotspotConfigurationErrorDomain这个错误域,而NEHotspotConfigurationError只是一个基于错误码的枚举,并没有实现和Error类型的直接桥接强转,所以不能直接用as?来转换。
下面是能正常工作的解决代码,我给你拆分下逻辑:
do { let config = NEHotspotConfiguration(ssidPrefix: prefix) config.joinOnce = false try await NEHotspotConfigurationManager.shared.apply(config) return .success } catch { // 先把通用Error转成NSError,方便读取domain和code let nsError = error as NSError // 首先判断是不是热点配置相关的错误 guard nsError.domain == NEHotspotConfigurationErrorDomain else { // 不是热点配置错误,直接返回原错误 return .failure(error) } // 用错误码初始化NEHotspotConfigurationError枚举 guard let hotspotError = NEHotspotConfigurationError(rawValue: nsError.code) else { // 没有对应的枚举值,处理未知的热点配置错误 return .failure(.unknownHotspotError(nsError)) } // 现在可以正常switch枚举值了 switch hotspotError { case .userDenied: return .failure(.userRejected) case .internalError: // 对应你日志里的Code=8,就是这个枚举值 return .failure(.internalConfigError) case .alreadyAssociated: return .failure(.alreadyConnectedToHotspot) // 这里可以根据你的业务需求,添加其他枚举值的处理逻辑 case .invalid, .applicationIsNotInForeground, .invalidSSID, .invalidWEPParameters, .invalidWAPIPassphrase: return .failure(.invalidConfiguration(hotspotError)) @unknown default: // 兼容未来系统新增的错误码,避免崩溃 return .failure(.unknownHotspotError(nsError)) } }
关键细节说明:
- 先转NSError:不管Swift抛出的是什么Error类型,转成NSError都能拿到最原始的错误域和错误码,这是处理系统框架错误的通用技巧。
- 校验错误域:确保我们处理的确实是热点配置相关的错误,避免误处理其他域的错误。
- 用rawValue初始化枚举:
NEHotspotConfigurationError的rawValue正好对应系统返回的错误码(比如你遇到的Code=8对应.internalError),所以用rawValue:初始化就能拿到对应的枚举值。 - @unknown default:一定要加这个分支,因为Apple可能在后续iOS版本里新增错误码,这个分支能避免枚举switch不完整导致的崩溃。
另外,你可以自己对照NEHotspotConfigurationError的枚举定义,把每个错误码对应的业务逻辑补全,比如.userDenied就是用户拒绝了权限请求,.alreadyAssociated是已经连接到目标热点了等等。
内容来源于stack exchange
相关产品推荐
相关产品推荐

