【问题标题】:Networking with Alamofire on WatchOS在 WatchOS 上与 Alamofire 联网
【发布时间】:2019-02-23 13:30:23
【问题描述】:

我正在为 WatchOS 构建一个应用扩展,我想在 Watch 应用中执行一些 URL 请求。我正在使用 Alamofire 作为网络部分。

每当我做一个简单的请求时,我都会在模拟器和真实设备上收到这些错误: load failed with error Error Domain=NSURLErrorDomain Code=-2000 "can’t load from network"

我不清楚为什么会发生这种情况。手表与手机配对。 使用 Charles Proxy 我可以看到请求不是通过网络发送的,所以在发送之前它就失败了。

欢迎提出任何想法。

编辑 这是我的通信类的工作摘录:

import Foundation
import Alamofire

class Communication {
    internal lazy var manager = Communication.getSessionManager()

    typealias SuccesBlock = (DataResponse<Any>?) -> ()
    typealias FailureBlock = (DataResponse<Any>?, Error) -> ()
    typealias ProgressBlock = (Progress) -> ()

    internal static var serverTrustPolicyManager: ServerTrustPolicyManager {
        get {
            return ServerTrustPolicyManager(policies: [:])
        }
    }

    static func getSessionManager(_ serializeRequest:Bool = false) -> Alamofire.SessionManager {
        let manager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default, delegate: Alamofire.SessionManager.default.delegate, serverTrustPolicyManager: serverTrustPolicyManager)
        return manager
    }

    static var httpHeaders: HTTPHeaders {
        get {
            var httpHeaders = HTTPHeaders()
            httpHeaders["Accept"] = "application/json"
            return httpHeaders
        }
    }

    func get(_ url: URL, parameters: [String: Any]?, success: @escaping SuccesBlock, failure: @escaping FailureBlock) {
        manager.request(url, method: HTTPMethod.get, parameters: parameters, encoding: URLEncoding.default, headers: Communication.httpHeaders).validate().responseJSON { [weak self] (response) in
            self?.handle(response, success: success, failure: failure)
        }
    }

    internal func handle(_ response: DataResponse<Any>, success: @escaping SuccesBlock, failure: @escaping FailureBlock) {
        switch response.result {
        case .success:
            DispatchQueue.main.async {
                success(response)
            }
        case .failure(let error):
            DispatchQueue.main.async {
                failure(response, error)
            }
        }
    }
}

我发送给get(_ url: URL, parameters: [String: Any]?, success: @escaping SuccesBlock, failure: @escaping FailureBlock) 函数的任何内容都会给出-2000 错误。 .responseJSON 代码块永远不会执行。

编辑 2

我得到的完整错误如下:

`2018-09-20 12:12:48.006544+0100 My App Watch Extension[61347:2465172] Task <F80A9AD4-519B-424C-868A-8E239C949016>.<7> load failed with error Error Domain=NSURLErrorDomain Code=-2000 "can’t load from network" UserInfo={NSLocalizedDescription=can’t load from network, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <F80A9AD4-519B-424C-868A-8E239C949016>.<7>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <F80A9AD4-519B-424C-868A-8E239C949016>.<7>"
), NSErrorFailingURLStringKey=https://my.request.url, _kCFNetworkErrorConditionalRequestKey=<CFMutableURLRequest 0x78f37a70 [0x201628c]> {url = https://my.request.url, cs = 0x0}, _kCFNetworkErrorCachedResponseKey=<CFCachedURLResponse 0x7b3d7f20 [0x201628c]>, NSUnderlyingError=0x7b436380 {Error Domain=kCFErrorDomainCFNetwork Code=-2000 "(null)" UserInfo={_kCFNetworkErrorCachedResponseKey=<CFCachedURLResponse 0x7b3d7f20 [0x201628c]>, _kCFNetworkErrorConditionalRequestKey=<CFMutableURLRequest 0x78f37a70 [0x201628c]> {url = https://my.request.url, cs = 0x0}}}, NSErrorFailingURLKey=https://my.request.url} [-2000]`

在控制台中收到此错误后,我现在可以看到请求仍在发送并成功。在看到此错误后,我认为情况并非如此,但我现在看到,经过一些延迟后,请求按预期工作。

所以最终应用程序会运行,但是,剩下的问题是:为什么会出现此错误以及如何消除它?

【问题讨论】:

  • edit 将您的问题包含在minimal reproducible example 中以使其成为主题。
  • @DávidPásztor 公平点,谢谢。请看我的编辑。
  • @Bocaxica 你解决过这个问题吗?在我的应用程序中具有相同的功能。
  • @Hannes 不,我没有,但是尽管出现错误,网络仍然可以工作。如果您解决了,请告诉我,我仍然对解决方案感兴趣!

标签: swift alamofire watchkit


【解决方案1】:

错误描述是

NSURLErrorCannotLoadFromNetwork

当任务需要从网络加载时发送此错误,但被“仅从缓存加载”指令阻止。

你可以通过设置Alamofire请求的requestCachePolicy来解决,像这样即:

class RequestManager {

    let manager: SessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
        return SessionManager(configuration: configuration)
    }()

    func fetch() {

       manager.request("https://www.bla.blub") 

       ...

【讨论】:

  • 您好,感谢您的回复。不幸的是,这并没有解决问题。我看到的错误可能与您提到的错误不同。
  • 奇怪,您在帖子 -2000 中写道“无法从网络加载”是您的错误(请参阅完整的错误日志),所以应该是正确的错误。无论如何,祝你好运。
  • 我现在也遇到同样的问题,有解决办法吗?
  • 您尝试过我上面描述的修复方法吗?如果你有 NSURLErrorDomain Code=-2000 "can't load from network",它应该可以解决你的问题。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多