Я получаю «Ошибка домена = NSURLErrorDomain Code = -1001« Время ожидания истекло ». На устройствах iOS, но работает нормально на Android - PullRequest
0 голосов
/ 14 мая 2018

Сервер: Убунта с nodejs express и nginx proxy.

При использовании моего приложения для Android все работает нормально.

При использовании моего iOS-приложения я получаю:

"ошибка вызова GET on / district Ошибка Domain = NSURLErrorDomain Код = -1001 "Время ожидания истекло." UserInfo = {NSUnderlyingError = 0x1c0458db0 {Ошибка Домен = kCFErrorDomainCFNetwork Code = -1001 "(ноль)" UserInfo = {_ kCFStreamErrorCodeKey = -2102, _kCFStreamErrorDomainKey = 4}}, NSErrorFailingURLStringKey = http://xxx.xxx.xxx.xxx/api/district, NSErrorFailingURLKey = http://xxx.xxx.xxx.xxx/api/district, _kCFStreamErrorDomainKey = 4, _kCFStreamErrorCodeKey = -2102, NSLocalizedDescription = Время ожидания истекло.} "

Эта ошибка возникает только тогда, когда я выполняю GET-запросы. Я могу войти (POST) и добавить маркеры на мою карту и т. Д. Все это работает. Но получение данных через запросы get не дает.

Я думаю, что проблема связана с тем, что iOS имеет 30-секундный тайм-аут / остается активным на устройствах с iOS 6 или 7. Он автоматически устанавливает заголовок на 30 секунд.

У меня были похожие проблемы при работе на моем локальном Mac-сервере. Но я исправил это, отправив обратно заголовок с res.set («Соединение», «закрыть»); в моем nodejs маршруты обратно в iOS. Как это:

nodejs districtRoutes.js

router.get('/api/district', passport.authenticate('jwt', { session:false }), function(req, res, next) {
  log.info("inside getting districts");
  District.find({}, function(err, district) {
    if (err){
      res.set("Connection", "close");
      log.info("error getting districts");
      res.status(404).json({message:"no districts found" + err});
      res.end();
    }else{
      res.set("Connection", "close");
      log.info("success getting districts");
      res.json(district);
      res.end();
    }
  });
});

приложение для iOS. Внутри httpRequester вспомогательный класс

func getRequest (urlPath: String, body: [String:String], success:  @escaping (Data, HTTPURLResponse) -> ()) {
    let token: String! = KeychainWrapper.standard.string(forKey: "token")

    //check if url is a proper URL string
    guard let url = URL(string: baseUrl+urlPath) else {
        print("Error: cannot create URL")
        return
    }

    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "GET"
    urlRequest.addValue("JWT " + token, forHTTPHeaderField: "Authorization")
            //urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
            //urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")

    let jsonData: Data
    do {
        jsonData = try JSONSerialization.data(withJSONObject: body)
        urlRequest.httpBody = jsonData
    } catch {
        print("Error: cannot create JSON from body")
        return
    }
    let task = URLSession.shared.dataTask(with: urlRequest) { (data: Data?, response: URLResponse?, error: Error?) in
        guard error == nil else {
            if let httpResponse = response as? HTTPURLResponse {
                self.errorHandling(response: httpResponse)
            }
            print("error calling GET on /" + urlPath)
            print(error!)
            return
        }
        guard let responseData = data else {
            print("Error: did not receive any data")
            return
        }
        let httpResponse = response as! HTTPURLResponse
        success(responseData, httpResponse)
    }

    task.resume()
}

У меня тот же код на моем текущем сервере Ubunta и, как сказано, Android работает нормально. Так же как и запросы на iOS, но не GET. Проблема появляется на стенде Wi-Fi и 4g соединения на устройствах iOS.

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

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...