PhoneGap(別名Cordova)を使用してiOSアプリケーションを作成しています。SSLを介した基本認証でXMLHttpRequestを使用してユーザーをログインさせる単純なhtmlログインページがあります。ユーザー名とパスワードを正しく入力すると、すべてが見事に機能します。ただし、間違ったユーザー名/パスワードを入力すると、コールバックは呼び出されません。
たとえば、Chromeで同じコードを間違ったユーザー名/パスワードで実行した場合、Chromeは認証チャレンジダイアログをポップアップすることを除いて、同じように動作します。Chromeのダイアログでキャンセルを押すと、JavaScriptコードに制御が戻ります。残念ながら、iOSでは、UIWebViewは認証ダイアログをポップアップすることすらなく、ハングするだけです。再試行できるように、間違ったユーザー名またはパスワードを入力したことをユーザーに通知する方法が必要です。
私が見つけた答えに最も近いのはこのhttp://www.freelock.com/2008/06/technical-note-http-auth-with-ajaxでしたが、サーバーからの応答ステータスを変更することは、正しいこと。
基本的に私のリクエストコードは次のようになりますが、不正なユーザー名またはパスワードが送信されても、onloadコールバックに到達することはありません(実際、onreadystatechangeコールバックは1回だけ呼び出され、readyState 1、別名OPEN)。
var req = new XMLHttpRequest();
req.onload = function(ev) {
if (req.status == 401) {
alert("Invalid Username/Password");
document.getElementById('password').focus();
} else if (req.status == 200) {
window.location.href = some_secure_site;
} else {
// edit //
alert("Some other status");
}
}
req.onerror = function (ev) { alert('Error'); };
req.ontimeout = function(ev) { alert('Timeout'); };
req.open('GET', uri, true, userValue, passValue);
req.withCredentials = true;
req.send();