iOS设备上UI测试目标请求本地URL失败,求可行解决方案
设备UI测试本地网络URL请求失败的解决办法
在设备上运行UI测试时,使用URLSession.shared.dataTask发起本地网络URL请求会失败,报错信息如下:
HelloWorldUITests-Runner[20156:4946160] Task <7634F9E1-915D-400B-9B68-4A768D58A4DE>.<1> finished with error [-1003] Error Domain=NSURLErrorDomain Code=-1003 "A server with the specified hostname could not be found." UserInfo={_kCFStreamErrorCodeKey=-72000, NSUnderlyingError=0x28224def0 {Error Domain=kCFErrorDomainCFNetwork Code=-1003 "(null)" UserInfo={_NSURLErrorNWPathKey=satisfied (Path is satisfied), interface: utun5, ipv4, _kCFStreamErrorCodeKey=-72000, _kCFStreamErrorDomainKey=10}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <7634F9E1-915D-400B-9B68-4A768D58A4DE>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <7634F9E1-915D-400B-9B68-4A768D58A4DE>.<1>"), NSLocalizedDescription=A server with the specified hostname could not be found., NSErrorFailingURLStringKey=http://redacted.local/redacted, NSErrorFailingURLKey=http://redacted.local/redacted, _kCFStreamErrorDomainKey=10}
以下场景下URL请求可成功:
- UI测试目标在设备上请求外网URL
- UI测试目标在模拟器上请求本地URL
- App目标在设备上请求本地URL(需点击权限弹窗的「允许」,点击「不允许」则出现上述相同错误)
问题本质是UI测试运行器需要获得与App授权后相同的本地网络权限,当前环境为Xcode 14.0.1、iOS 15.6.1,解决办法如下:
1. 为UI测试Target配置本地网络权限相关Info.plist项
打开UI测试Target的Info.plist文件,添加以下配置:
- NSLocalNetworkUsageDescription:键值为权限申请描述(例如「测试需要访问本地网络资源」),用于向系统申请本地网络权限。
- NSBonjourServices:若本地请求依赖Bonjour服务,添加该数组键,填入对应服务类型(如
_http._tcp.、_https._tcp.),帮助系统识别本地网络访问需求。 - NSAppTransportSecurity > NSAllowsLocalNetworking:在
NSAppTransportSecurity字典下添加该键,值设为YES,确保ATS允许本地网络请求。
2. 在UI测试代码中自动处理权限弹窗
首次运行UI测试时,系统会弹出本地网络权限申请弹窗,可在测试的setUp方法中添加监听自动允许:
override func setUp() { super.setUp() let permissionMonitor = addUIInterruptionMonitor(withDescription: "Local Network Permission Alert") { alert in if let allowButton = alert.buttons["允许"].firstMatch { allowButton.tap() return true } return false } // 触发弹窗后需触发一次交互让监听生效 app.tap() removeUIInterruptionMonitor(permissionMonitor) }
3. 手动授予UI测试Runner权限
若上述方法无效,可直接在设备中手动开启权限:
- 打开设备「设置」→「隐私与安全性」→「本地网络」
- 找到名称为
[你的App名称]UITests-Runner的条目 - 开启其本地网络权限开关
内容的提问来源于stack exchange,提问作者ganzogo
相关产品推荐
相关产品推荐

