运行AlamoFire 4.5 Swift 4(我的项目)
我只在iOS 11中遇到此错误。
所以我最近开始为一个正在运行的api端点停止此错误:
Error Domain=NSPOSIXErrorDomain Code=100 "Protocol error" UserInfo={NSErrorPeerAddressKey=<CFData 0x1c40913f0 [0x1b2c04240]>{length = 16, capacity = 16, bytes = 0x100201bb36aec68a0000000000000000}, _kCFStreamErrorCodeKey=100, _kCFStreamErrorDomainKey=1}
这是我如何提出请求的主旨:
let urlPath = "SOME_PATH"
var params = [String:Any]()
params["app_version"] = version
params["apnsEnabled"] = apnsEnabled
params["ios_version"] = DeviceInfo.getIOSVersion()
params["model_name"] = UIDevice.current.modelName
let request = AFSessionManager.shared.manager.request(urlPath, method: HTTPMethod.get, parameters: params as Parameters, headers: ["requested-domain":ServerDomain.get()!] as HTTPHeaders)
request.responseJSON{ response in
if response.result.error == nil{
//DO STUFF
}else{
//HANDLE ERROR
}
}
编辑:
我最后只用URLSession尝试了这个:
func ping(){
let session = URLSession(configuration: URLSessionConfiguration.default)
let request = URLRequest(url: URL(string: "MY_PING_URL_STRING")!)
let task: URLSessionDataTask = session.dataTask(with: request) { (data, response, error) -> Void in
guard error == nil else {
//Handle Error
return
}
//DO STUFF
}
task.resume()
}
仅使用URLSession仍然出现协议错误。
此外,在MacOS High Sierra上的Safari中收到此错误。
答案 0 :(得分:1)
我经过苹果并得到了一些帮助。以下是他们的回复:
服务器在响应中发送“upgrade”标头。这是http请求中使用的标头,我们的内部实现不允许将其作为响应标头。删除或使用标题的其他名称(如果仍需要将此信息传递给客户端)将解决问题。
事实证明,Apache在标题中以upgrade
响应,告诉客户端升级到http / 2。但是,使用SSL / TLS时会中断。以下是关于Apache bugzilla的讨论。即使客户端使用http / 2,它看起来也总是被发送upgrade
标题。
您可以通过将其放入主机配置中删除Apache中的标头:
Header unset Upgrade