Swift用Alamofire请求Flask服务器报错-1004:真机运行异常
解决Alamofire真机请求Flask服务器返回-1004错误的问题
嘿,这个-1004错误我之前踩过坑,它对应的是NSURLErrorCannotConnectToHost,本质就是你的iPhone真机没法成功连接到本地的Flask服务器。咱们一步步排查解决:
最常见的两个原因(优先检查)
- 模拟器和真机不在同一局域网:模拟器共享Mac的网络,而真机必须和Mac连同一个WiFi。另外绝对不能用
localhost或者127.0.0.1作为请求地址——这两个地址在真机上指向的是它自己,不是你的Mac。你得换成Mac的局域网IP地址,比如你的Mac IP是192.168.3.10,那请求URL应该是http://192.168.3.10:5000(默认Flask端口是5000)。 - Flask服务器仅绑定本地地址:默认情况下,Flask启动时只会监听
127.0.0.1,也就是只有Mac自己能访问。你需要让它监听所有网卡,这样局域网里的真机才能连接。启动Flask时加上--host=0.0.0.0参数:
或者在Flask代码里直接设置:flask run --host=0.0.0.0if __name__ == '__main__': app.run(host='0.0.0.0')
其他可能的问题及修复
- URL参数手动拼接导致编码错误:你现在直接把参数拼在URL里,如果
downloadLinks包含特殊字符(比如&、空格、中文),会直接破坏URL结构,导致请求失败。Alamofire推荐用parameters参数传递,它会自动帮你做URL编码:private func sendRequestToFlaskServer(url: String, uid: String, name: String, downloadLinks: String, type: String, completion :@escaping (String)->()){ let parameters: [String: Any] = [ "user": uid, "name": name, "type": type, "links": downloadLinks ] Alamofire.request(url, method: .get, parameters: parameters).responseData { response in if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) { completion(utf8Text) } } } - iOS ATS限制拦截请求:虽然现在ATS默认允许HTTP请求,但如果服务器配置不符合要求,可能会被拦截。你可以在
Info.plist里添加例外规则,允许访问你的服务器地址:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>你的Mac局域网IP(比如192.168.3.10)</key> <dict> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict> - Mac防火墙阻止连接:Mac的防火墙可能会拦截Flask服务器的端口请求。你可以去「系统设置」→「安全性与隐私」→「防火墙」里,允许Flask相关的进程接受传入连接,或者临时关闭防火墙测试是否能正常连接。
内容的提问来源于stack exchange,提问作者N.Barz
相关产品推荐
相关产品推荐

