[Titanium Mobile]HTTPClientのSession(Cookie)をAndroidのWebViewに引き継ぐ

httpclient_sync_webviewWordPressとやり取りするアプリをTitanium Mobileで開発しているときに、HTTPClientでログインしておいたのにWebViewを使うとセッションが引き継がれないので調査したときの覚書。

表示するだけならHTTPClientでGETして、WebViewのhtmlに流し込んだ方が簡単。

問い合わせフォームなど入力してPOSTするページはWebViewのurl指定で表示させたい。

Androidのみ。iOSは何もしなくても引き継がれる。

参考になったサイト。

環境: Titanium SDK 3.1.3.GA, WordPress 3.6.1

 

まずは、HTTPClientしたときのCookieを覚えておく

xhr = Titanium.Network.createHTTPClient();

xhr.onload = function() {
    // Save cookie for Android WebView
    if (this.getResponseHeader('set-cookie')) {
        self.cookie = this.getResponseHeader('set-cookie');
    }
}

 

その後、WebViewを使用するときにevalJSを使ってCookieをセットする

view = Titanium.UI.createWebView();
view.addEventListener('beforeload', function() {
    cookie = self.cookie.split(/,\s(?=\w+=)/g);
    cookie.forEach(function(item) {
        item.split('; ').forEach(function(data) {
            view.evalJS('document.cookie="' + data + '";');
        });
    });
});

これでcookieは設定できるけど、実際は下記のことをしなければ引き継げなかった。今後のバージョンアップで直っているかも。

  • cookieをセットする前にdocument.cookieがなかったら強制的にreloadする。
  • Aタグなどクリックした先でまた引き継げなかったので(Android 4.0.3)、セットしたときのURLと現在のURL(location.href, location.pathname)を比較して、違っていたらsetUrlする。

確認したのは、Android 2.3.3, Android 4.0.3

WebView内のCookieをリセットするにはアプリケーション管理の「データ消去」をする。

Titanium SDKのバージョンが上がるたびに動作確認しないとダメそう。

 

 

< Related Posts >