Сеть с Alamofire на WatchOS - PullRequest
       11

Сеть с Alamofire на WatchOS

0 голосов
/ 19 сентября 2018

Я создаю расширение приложения для WatchOS и хочу выполнить несколько URL-запросов в приложении Watch.Я использую 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]`

После получения этой ошибки в консоли теперь я вижузапрос по-прежнему отправляется и успешно выполняется.Я предположил, что это не так, увидев эту ошибку, но теперь я вижу, что после некоторой задержки запрос работает, как и ожидалось.

Таким образом, в конце концов приложение будет работать, однако остается вопрос:Почему я получаю эту ошибку и как от нее избавиться?

1 Ответ

0 голосов
/ 23 сентября 2018

Описание ошибки:

NSURLErrorCannotLoadFromNetwork

Эта ошибка отправляется, когда задача должна загружаться из сети, но заблокированадиректива «загрузить только из кэша».

Вы можете решить эту проблему, установив requestCachePolicy запроса Alamofire, например:

class RequestManager {

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

    func fetch() {

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

       ...
...