Alamofire:有时会在没有任何特殊原因的情况下发生超时

Alamofire: Timeout happening sometimes without any particular reason

有时在启动应用程序时,所有请求都会超时并显示这些日志:

| request: <NSMutableURLRequest: 0x170006aa0> { URL: http://#host#/api/settings?version=1428591014 } 
| response: nil 
| json: nil
| error: Optional(Error Domain=NSURLErrorDomain Code=-1001 "La requête a expiré." UserInfo=0x1740f0380 {NSUnderlyingError=0x174056440 "L’opération n’a pas pu s’achever. (kCFErrorDomainCFNetwork erreur -1001.)", NSErrorFailingURLStringKey=http://#host#/api/settings?version=1428591014, NSErrorFailingURLKey=http://#host#/api/settings?version=1428591014, NSLocalizedDescription=La requête a expiré.}) 

这里是负责请求调用的代码示例:

Alamofire.request(AppRouter.Settings.RetrieveAppSettings(Settings.sharedInstance.version))
  .validate(contentType: ["application/json"])
  .validate(statusCode: [200])
  .responseJSON { (req, res, json, error) in

    if error != nil {
      // log error to local file
    }
    else {
      // do something with data
    }
}

发生这种情况时,所有请求都将失败并显示相同的日志。必须手动终止应用程序(主页按钮)并重新启动它,然后所有请求都会成功......

有人有想法吗?

据我所知,我遇到过同样的问题。这是一个默认情况下不允许使用较新版本的 Xcode 的 http 连接的问题。我在切换到 Xcode-beta 7.0 时遇到了这个问题,但也可能是更早的版本。

尝试将以下内容添加到您的 info.plist:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>--- YOUR DOMAIN NAME HERE - EXAMPLE: example.com ---</key>
    <dict>
      <key>NSIncludeSubdomains</key>
      <true/>
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>

这允许 http 连接到您想要的域。在 NSExceptionDomains 对应的字典中添加任意数量的域作为键字典对。

要将其作为 XML 插入,请右键单击 info.plist,然后单击 "Open as" -> "Source code"。

然后将上面的 XML 添加到文档末尾的标签之前。

希望这对你有用:)