Я запускаю приложение ionic v1 с простым экраном входа в систему, который принимает имя пользователя и пароль и выполняет POST для удаленного API через HTTP. При успешном входе пользователь переходит на домашний экран в приложении.
Когда я развертываю приложение на любом устройстве Android, оно работает просто отлично. Но когда я развертываю одно и то же приложение на любом устройстве ios, нажатие на кнопку входа ничего не дает. Когда я проверяю логи xcode, он показывает
IC TCP Conn Failed [3:0x600000173e00]: 1:60 Err(60)
2018-09-13 02:16:07.004607+0530 MyApp[15053:1613654] Task <5E324292-7D81-481B-B905-2522BC11A23E>.<0> HTTP load failed (error code: -1001 [1:60])
2018-09-13 02:16:07.005251+0530 MyApp [15053:1612177] NSURLConnection finished with error - code -1001
NSLURLC Ошибка соединения 1001 относится к тайм-ауту. Поэтому я проверил журналы веб-сервера, чтобы проверить запросы, когда-либо поступавшие к API.
Я вижу, что запросы доходят до сервера. Журналы сервера показывают, что со всех устройств ios запросы на вход в систему генерируют запрос HEAD вместо POST. Это заставляет веб-сервер возвращать HTML-страницу на запрос, который приложение не может обрабатывать дальше, поскольку ожидает ответа JSON.
Веб-сервер регистрирует при входе с любого устройства ios
[root@ip-10-0-0-151 log]# cat production.log
I, [2018-09-12T20:38:35.976774 #12603] INFO -- : Started HEAD "/users/sign_in" for 69.162.124.237 at 2018-09-12 20:38:35 +0000
I, [2018-09-12T20:38:35.977758 #12603] INFO -- : Processing by Devise::SessionsController#new as HTML
I, [2018-09-12T20:38:35.979483 #12603] INFO -- : Rendering devise/sessions/new.html.erb within layouts/login
I, [2018-09-12T20:38:35.981128 #12603] INFO -- : Rendered devise/shared/_links.html.erb (0.3ms)
I, [2018-09-12T20:38:35.981456 #12603] INFO -- : Rendered devise/sessions/new.html.erb within layouts/login (1.9ms)
I, [2018-09-12T20:38:35.981987 #12603] INFO -- : Completed 200 OK in 4ms (Views: 2.7ms | ActiveRecord: 0.0ms)
Веб-сервер Журналы при входе с любого устройства Android. Это работает и в приложении пользователь попадает на домашний экран. Это показывает, что API работает правильно. Обратите внимание на разницу в первом запросе (HEAD) от устройств ios и (POST) от устройств Android.
[root@ip-10-0-0-151 log]# cat production.log
I, [2018-09-12T20:39:25.064640 #12603] INFO -- : Started POST "/api/users/sign_in" for 110.227.177.4 at 2018-09-12 20:39:25 +0000
I, [2018-09-12T20:39:25.065825 #12603] INFO -- : Processing by Api::SessionsController#create as HTML
I, [2018-09-12T20:39:25.065903 #12603] INFO -- : Parameters: {"user"=>{"email"=>"johndoe@gmail.com", "password"=>"[FILTERED]"}, "request_type"=>"json", "session"=>{"user"=>{"email"=>"johndoe@gmail.com", "password"=>"[FILTERED]"}, "request_type"=>"json"}}
Ионный код JS
$scope.login = function() {
$http({
method: 'POST',
headers:
{
'Content-Type': 'application/json',
},
url: config.apiUrl+"users/sign_in",
data: {user: {email: $scope.data.email, password: $scope.data.password}, request_type: 'json' }
}).then(function successCallback(response) {
$state.go('tab.nearby');
}, function(err) {
alert('code: ' + err.code + '\n' +
'message: ' + err.message + '\n');
console.log(err);
$state.go('tab.nearby');
});
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
$ionicPopup.alert({
title: 'Problem with authentication',
template: '<div style="text-align:center">'+response.data.message+'</div>',
});
});
Итак, моя проблема в том, что если код кроссплатформенный и работает правильно для устройств Android, почему ios генерирует другое поведение? Что может быть причиной этого?