AndroidでCookieが送信されないという現象

不都合というかiOSと比べて意図した動きになってくれないことが多いAndroidですが(それを世間では不都合と呼んでいるかもしれない。)、Cookieが送信されない機種があり、これで大きくつまずきました。

今回のケースでは、スマホでPCサイトを閲覧する場合に、Cookieの有無で判別することにしていました。

  • Cookieがない場合は、スマホサイト表示
  • Cookieがある場合は、PCサイト表示

当然ながらという表現は微妙ですが、iOS4.2(iPhone4)とiOS5(iPhone4S)では問題無く、上記の条件において意図した表示になってくれました。
しかし、Android端末で検証すると、意図した表示になる機種もあれば、意図した表示にならない機種がありました。その機種が下記です。

  • IS03 (Android 2.2)
  • GALAXY S SC-02B (Android 2.2)
  • OPTIMUS CHAT (Android 2.2)
  • IS04 REGZA (Android 2.2)

意図した表示になったのが下記です。

  • GALAXY S SC-02B (Android 2.3)
  • GALAXY S SC-02B (Android 2.2)
  • OPTIMUS CHAT (Android 2.2)
  • Xperia SO-01B (Android 2.1)

※GALAXY S SC-02B (Android 2.2)とOPTIMUS CHAT (Android 2.2)は意図した表示になったり、ならなかったりしました。

Cookieは表示される

なぜこうなるのかの仮説として、「Cookieが消える?」とはじめに考えました。どこかで、勝手にCookieが消えたという現象はスマホとか関係なく聞いたことがあるので、このケースにも当てはまるのではないかと思い、Cookieがあるかどうかを確認するために、Androidの標準ブラウザのURLバーに下記のJavaScriptを実行。(めっちゃメンドーです。)

javascript:alert(document.cookie);

とすると、「あるやん!!」。

機種依存によるバグと期待したのですが、該当するCookieが表示されました。ならばなぜにCookieを判別してくれないのか、悩みまくっていたのですが、「Cookieが送信されてるのか確認した?」というアドバイスをいただきました。

これを確認するために、PHPでテストファイルを作成、ちなみにコードは下記です。下記のコードを適当なファイル名にして(拡張子は『.php』)、このファイルに実機でアクセスして検証という手順です。

<?php
var_dump($_COOKIE);
?>

Cookieが送信されていたら、下記のような表示が返ってきます。(Cookie名とかその辺りは捏造しています。)

array(2) { ["hoge"]=> string(4) "hoge" ["Cookieの内容"]=> string(3) "INT" }

しかし、IS03等で確認すると

array(2) { ["hoge"]=> string(4) "hoge" [""]=> string(3) "INT" }

Cookieの内容がありませんでした。ということでCookieが送信されていないということが判明しました。

結果的には、機種依存による不都合と捉えたのですが、検証になかなか時間を費やした結果となりました。いや本当にAndroidは鬼門すぎて泣きそうです(泣いてますけど・・・)。同じような現象で悩まれている型がおられば、一度お試しください。

他のサイトでは、Cookieをどのように扱っているんですかね?Cookieを使わずにlocalStorageでやっていたりするのでしょうか。そのあたり知りたいですね。