macOS端Swift跨平台网络请求失败求助(iOS端正常)
问题:macOS上共享Swift网络代码无法运行,iOS正常
我有一段在macOS与iOS间共享的Swift代码,MacBook和iPhone连接同一WiFi,但仅iOS设备上代码可正常运行。当前系统为macOS Sonoma和iOS 17,但我认为这并非问题根源。
报错信息
Connection 1: received failure notification Connection 1: failed to connect 1:57, reason 18 446 744 073 709 551 615 Connection 1: encountered error(1:57) Task <D8541ECD-3BFA-4225-902F-DE2DB77DC000>.<1> HTTP load failed, 0/0 bytes (error code: 18 446 744 073 709 550 611 [1:57]) Task <D8541ECD-3BFA-4225-902F-DE2DB77DC000>.<1> finished with error [18 446 744 073 709 550 611] Error Domain=NSURLErrorDomain Code=-1005 UserInfo={_kCFStreamErrorCodeKey=57, NSUnderlyingError=0x600003bf5740 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 UserInfo={_NSURLErrorNWPathKey=satisfied (Path is satisfied), interface: en0[802.11], ipv4, dns, _kCFStreamErrorCodeKey=57, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=<private>, _NSURLErrorRelatedURLSessionTaskErrorKey=<private>, NSLocalizedDescription=<private>, NSErrorFailingURLStringKey=<private>, NSErrorFailingURLKey=<private>, _kCFStreamErrorDomainKey=1}
通过cURL执行相同网络请求可正常工作,说明服务端无问题,问题应出在macOS专属的Xcode设置中。
相关网络代码
func login(completion: @escaping (Result<String, Error>) -> Void) { let loginURLString = "\(baseURL)/Core/Default/Login" guard let loginURL = URL(string: loginURLString) else { completion(.failure(KayakoError.invalidURL)) return } var request = URLRequest(url: loginURL) request.httpMethod = "POST" configureRequestHeaders(&request) let bodyData = "username=\(username)&password=\(password)".data(using: .utf8) request.httpBody = bodyData let task = session.dataTask(with: request) { (data, response, error) in if let error = error { completion(.failure(error)) return } guard let httpResponse = response as? HTTPURLResponse else { completion(.failure(KayakoError.invalidResponse)) return } if httpResponse.statusCode == 200 { if let data = data { let parser = XMLParser(data: data) let loginResponseParser = LoginResponseParser() parser.delegate = loginResponseParser if parser.parse() { let sessionID = loginResponseParser.sessionID completion(.success(sessionID ?? "")) } else { completion(.failure(KayakoError.invalidData)) } } else { completion(.failure(KayakoError.invalidData)) } } else { completion(.failure(KayakoError.loginFailed)) } } task.resume() }
解决方案
1. 检查macOS应用网络权限
- 打开系统设置 → 隐私与安全性 → 网络,确认你的应用已被勾选允许访问网络。
- 若列表中无应用,重新构建运行一次,系统会弹出权限请求弹窗,选择允许。
2. 验证App Transport Security (ATS)配置
iOS和macOS共享ATS规则,但macOS可能存在默认行为差异:
- 在
Info.plist中添加目标域名的ATS例外(适用于HTTP或自签名HTTPS服务):<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的服务端域名</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> - 若使用HTTPS,优先确保证书被macOS信任,避免过度依赖ATS例外。
3. 检查URLSession配置差异
确认session对象的配置在macOS上无异常:
- 避免设置不必要的代理或超时规则,示例默认配置:
let config = URLSessionConfiguration.default config.connectionProxyDictionary = nil let session = URLSession(configuration: config)
4. 排查底层网络连通性
用nc命令测试macOS到服务端的TCP连接:
nc -zv 服务端IP 端口号
若连接失败,检查系统设置→网络→防火墙,确保允许应用出站连接。
5. 重置Xcode缓存
- 关闭Xcode,删除DerivedData目录:
rm -rf ~/Library/Developer/Xcode/DerivedData - 清理项目缓存:Xcode菜单→Product→Clean Build Folder
内容的提问来源于stack exchange,提问作者BobC
相关产品推荐
相关产品推荐

