MoyaSystem

もやしです。

TitaniumのaddHTTPCookieがAndroidで動かない件とその対処法

このシリーズ毎度タイトルがひどい。

 

はじめに

JavaScriptの共通コードでiPhoneAndroidのアプリを同時に開発できるTitaniumだが、まったく同じコードで書けば良いかというとそうではない。その一例がcookie
iPhoneアプリではアプリ内で使われるcookieはすべて共通で、HTTP通信すべてに対して同じcookieが使用される。ところがAndroidアプリではcookieがHTTPClientで使われるHTTP cookieとWebViewで使われるSystem cookieの2種類に分かれており、両方で同じ値を使いたい場合は明示的に指定する必要がある。*1

System cookieをHTTP cookieにセットしたい...だができない...

Androidでのcookie操作を可能にするためTitaniumにはいくつかのメソッドが用意されている。たとえばSystem cookieをHTTP cookieにセットしたいときはこうすればよい……と思ったのですが……

var myClient = Ti.Network.createHTTPClient();
var systemCookies = Ti.Network.getSystemCookies("my.domain", "my/path", null);
if(systemCookies){
	systemCookies.forEach(function(cookie){
        myClient.addHTTPCookie(cookie);
        })
}

このコード動かない。getSystemCookieでcookieはちゃんと取ってこれているのだが、どうもaddHTTPCookieが思った通りに動いてくれない。ちなみにAndroidのバージョンは4.0.4。ほかのOSでは試していないので、別のOSではうまくいくかもしれませんが。

こうすれば動く

かなり無理矢理感のあるコードですが、これで動きます。

var myClient = Ti.Network.createHTTPClient();
var systemCookies = Ti.Network.getSystemCookies("my.domain", "my/path", null);
var cookiestring = "";
if(systemCookies){
	systemCookies.forEach(function(cookie){
	cookiestring += '; ' + cookie.name + '=' + cookie.value;
        })
	exhibitClient.setRequestHeader('Cookie:', cookiestring);
}

そのほかにも……

TitaniumのコードはiPhoneだと概ね期待通りに動くのですが、Androidでは動かないケースが多々あるので注意が必要。Androidアプリは素直にJavaで書いたほうがいいかもしれません。うーん。

*1:ああめんどくさい。