Телефонный запрос iOS ajax никогда не завершается

У меня есть приложение phonegap, которое подключается к веб-службе и проверяет подлинность с помощью HTTP-аутентификации. Он построен с использованием сборки phonegap и нацелен на Android и iOS.

В представлении входа в систему запрос ajax запускается против удаленного сервера, чтобы проверить правильность учетных данных, а затем, если это так, регистрирует пользователя в главном приложении.

Это успешно завершается в эмуляторе пульсаций на ПК, а также при развертывании на устройстве Android.

Однако, когда приложение развертывается на устройстве iOS (ipod touch), запрос на аутентификацию просто не завершается. Используя удаленный отладчик phonegap, я вижу, что запрос ajax начинается, но не завершается. Он всегда находится в состоянии ожидания. Я использую jquery ajax success, error и полные обработчики для запроса, но ни один из них никогда не попал, поэтому я не получаю возможность увидеть какие-либо сообщения об ошибках, возвращенные с сервера. Запрос никогда не завершается.

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

Любые идеи о том, что может быть проблемой?

Ответ 1

Прочитайте обновление этого ответа внизу.


Оригинальный ответ

Я нашел, что проблема, и удалось заставить выполнять базовую аутентификацию.

Проблема заключалась в том, что веб-сервер ожидал, что основные данные аутентификации будут предварительно отправлены с запросом.

Для этого используйте свойство заголовков "jquery ajax, как показано ниже:

$.ajax
({
  type: "GET",
  url: "https://webserver/authenticate",
  headers: {
    "Authorization": "Basic " + btoa(USERNAME + ":" + PASSWORD)
  }
})
.done(function(){
    alert('Authenticated!')
})
.fail(function(){
    alert('Error!')
});

См. соответствующий ответ: fooobar.com/info/20870/...


Обновление

В конце концов я обнаружил, что нет надежного способа использования базовой аутентификации в веб-представлении в iOS. I.e все нормально, если вводятся правильные учетные данные, но когда они отсутствуют, и ответ на вызов 401 возникает, веб-представление iOS не может справиться с этим.

В конце концов, аутентификация веб-службы была реализована простым передачей параметров "имя пользователя" и "пароль" как часть URL-адреса:

url: "https://webserver/authenticate?username=abc&password=123"

Это единственный последовательный способ, с помощью которого я получаю аутентификацию для работы через iOS и Android в веб-представлении (вообще избавляясь от базовой аутентификации). Это, конечно же, означало обновление самого веб-сервиса для принятия аутентификации таким образом.