我正在运行一个带有简单登录屏幕的ionic v1应用程序,该屏幕带有用户名和密码,并通过HTTP对远程API进行POST。成功登录后,用户将转到应用程序的主屏幕。
当我在任何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
NSLURLConnection错误1001表示超时。因此,我检查了Web服务器日志以验证曾经向API发送的请求。 我看到请求到达了服务器。服务器日志显示所有ios设备上的登录请求都将生成HEAD请求而不是POST。这样一来,网络服务器就会将HTML页面返回到请求,应用程序由于期望JSON响应而无法对其进行进一步处理。
从任何ios设备登录时的Web服务器日志
[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)
Web服务器从任何Android设备登录时登录。这项工作和应用程序用户进入主屏幕。这说明API正常工作。请注意,iOS设备的第一个请求(HEAD)和Android设备的第一个请求(POST)有所不同。
[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会生成不同的行为?可能是什么原因造成的?