【问题标题】:Alamofire 4 FAILURE: Error Domain=NSURLErrorDomain Code=-999 "cancelled"Alamofire 4 失败:错误域=NSURLErrorDomain 代码=-999“已取消”
【发布时间】:2017-03-14 11:57:36
【问题描述】:

您好,我尝试在我的项目中使用 Alamofire,但出现了错误。 这是我的请求代码 //谷歌测试

  Alamofire.request("http://google.com").responseString{
        response in
        debugPrint(response)
    }.session.invalidateAndCancel()

结果]: FAILURE: Error Domain=NSURLErrorDomain Code=-999 "cancelled"

UserInfo={NSErrorFailingURLKey=http://google.com/,

NSLocalizedDescription=已取消,

NSErrorFailingURLStringKey=http://google.com/}

//自己的服务器测试

    Alamofire.request("https://10.68.24.127:4533").responseString{
        response in
        debugPrint(response)
    }.session.invalidateAndCancel()

同样的结果

    class NetworkManager {

var manager: SessionManager?

init() {
    let serverTrustPolicies: [String: ServerTrustPolicy] = [
        "https://10.68.24.127:4533" : .disableEvaluation
    ]
    let configuration = URLSessionConfiguration.default
    manager = Alamofire.SessionManager(
        configuration: configuration,
        serverTrustPolicyManager :ServerTrustPolicyManager(policies: serverTrustPolicies)
    )
}
    }

我将 NSAllowsArbitraryLoads 设置为 true 和 NSExceptionDomains。

问题出在哪里?

【问题讨论】:

  • 您立即致电invalidateAndCancel(),它确实如其所说。与 SSL 无关。

标签: ios ssl alamofire


【解决方案1】:

您的请求“取消”可能有很多原因。
如果您面临请求立即取消,您可以参考Alamofire repository issues中的此问题

jshier 于 2016 年 10 月 10 日发表评论

意外错误 -999 几乎总是意味着您的 SessionManager 解除分配,取消任何正在进行的请求。我建议你创建一个 您的自定义 SessionManager 的单例值,或者可能只是 重新评估你是否真的需要一个。

如果你为你的对象创建一个单例值,它会保留在内存中并防止释放

我避免的另一件事是将你的变量命名为不同的,一个 sessionManager 在 Alamofire 中,你的变量也称为 sessionManager。

Alamofire 4.7,斯威夫特 4

import Alamofire

class Networking {

  public static let sharedManager: SessionManager = {
      let configuration = URLSessionConfiguration.default
      configuration.timeoutIntervalForRequest=20
      let manager = Alamofire.SessionManager(configuration: configuration, delegate: SessionManager.default.delegate)
      return manager
  }()
}

Alamofire 5.4.4 , Siwft 5.2

import Alamofire

class Networking {

  static let APIManager: Session = {
      let configuration = URLSessionConfiguration.default
      configuration.timeoutIntervalForRequest = 20
      let delegate = Session.default.delegate
      let manager = Session.init(configuration: configuration,
                                 delegate: delegate,
                                 startRequestsImmediately: true,
                                 cachedResponseHandler: nil)
      return manager
  }()
}

【讨论】:

    【解决方案2】:

    您很可能应该检查是否存在身份验证质询委托方法的实现,并检查其是否调用 NSURLSessionAuthChallengeCancelAuthenticationChallenge。

    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
                                                 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
    

    【讨论】:

      【解决方案3】:

      查看来自 Alamofire app-transport-security 的文档

      尝试在您的 .plist 文件中添加以下内容

      <key>NSAppTransportSecurity</key><dict>
      <key>NSExceptionDomains</key>
      <dict>
          <key>url.com</key>
          <dict>
              <key>NSExceptionAllowsInsecureHTTPLoads</key>
              <true/>
              <key>NSExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
          </dict>
      </dict>
      

      【讨论】:

      • 试过但失败了。我只是改用 SwiftyHttp 来做我的工作
      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2019-04-22
      • 2020-02-22
      • 2015-11-18
      • 2018-11-04
      相关资源
      最近更新 更多