TitaniumのaddHTTPCookieがAndroidで動かない件とその対処法
このシリーズ毎度タイトルがひどい。
はじめに
JavaScriptの共通コードでiPhoneとAndroidのアプリを同時に開発できる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:ああめんどくさい。