読者です 読者をやめる 読者になる 読者になる

Titanium.Network.HTTPClientを使ってGAEの認証を通す

※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
		});

が異様にキモい。