※2012/06/24追記 この方法では正常動作しません。修正版はこちら
TitaniumでGAEアプリからJSONでデータを取るような実装をしていて、認証部分の処理を書いていました。
//GAEに対するログイン //Googleに対してClient認証を行い、その結果をauthTokenに設定 function loginAppEngine(loginParam, authToken) { var appid = loginParam.appid; var baseUrl = "https://" + appid + ".appspot.com/"; var xhr = null; if(Ti.Platform.osname === 'android') { xhr = Titanium.Network.createHTTPClient(); } else { //iOSの場合、SSLチェックを緩くする xhr = Titanium.Network.createHTTPClient({ validatesSecureCertificate: false, tlsVersion: Titanium.Network.TLS_VERSION_1_0 }); } var url = baseUrl + "_ah/login"; xhr.open('GET',url); //レスポンスを受け取った際のイベント xhr.onload = function(){ indicator.hide(); //以降、ごにょごにょする }; // エラー発生時のイベント xhr.onerror = function(error){ indicator.hide(); //以降、ごにょごにょする }; //パラメータ作成 var param = {}; param["continue"] = encodeURI(baseUrl); param["auth"] = encodeURI(authToken); //リクエスト送信 var indicator = Ti.UI.createActivityIndicator({ message : "Loading..." }); indicator.show(); xhr.send(param); }
ところが、Androidでは問題なく動作するのに、iOSでは500エラーが発生します。
数日間悩んでいたのですが、理由は簡単
var url = baseUrl + "_ah/login";
を
var url = baseUrl + "_ah/login/";
とすれば良かったのです。
えー、Java(jmeter)だと大丈夫だったのになー。Objective-Cの仕様なんでしょうか?Androidで動いてiOSでエラーになるhttpリクエストがある場合、URLを見なおしてみると良いかもしれません。
あと、iOSの場合の
xhr = Titanium.Network.createHTTPClient({ validatesSecureCertificate: false, tlsVersion: Titanium.Network.TLS_VERSION_1_0 });
が異様にキモい。