PCページのスマホ最適化

とある、案件でPCページをViewのみスマホ最適化する案件がったので、その対応履歴をメモ。

要件としては、以下。

  • 要件:
    • 特定のURL経由の場合のみ、スマホ最適化を行う
    • 特定URL経由の場合、PCブラウザであってもスマホ最適化でよい
  • 案1:
    • ということで、考えたのが、Refererでの判定。
    • おそらく、最も効率がいい方法。

それを、phpのSessionへ保存後、常時判定に利用するようにした。
処理としては、以下のような感じ。

<?php
    pvivate $flag;

    public function __construct()
    {
        self::flag = false;
    }

    // URL判定メソッド
    static public function check()
    {
        if (isset($_SESSION&#91;'referer7}) {
            self::flag = true;
        }
        if (preg_match('/^http:\/\/xxxx\.com/', $_SERVER&#91;'HTTP_REFERER'&#93;)) {
            $_SESSION&#91;'referer'&#93; = $_SERVER&#91;'HTTP_REFERER'&#93;;
            self::flag = true;
        }

        return self::flag;
    }
?>

で、このメソッドを各スマホで呼び出してみると挙動が異なる。
Xperia(docomo)は想定通りの動作をするが、iPhone5が挙動がおかしい。
イメージとしては、SesstionIDをCookieに収めてるロジック辺りで、上手く行ったり、行かなかったりしている感じ。
仕様なのか、挙動が不安定。

そこで、セッションCookieを利用することにした。
(上記の不具合が、phpのSessionにあると仮定)

で、セッションCookie化したのが以下。

  • 案2:
    • セッションCookie(ブラウザを閉じるまで有効なCookie)を利用。
    • これが思わぬハマリを生むとは思わなかった・・
<?php
    pvivate $flag;

    public function __construct()
    {
        self::flag = false;
    }

    // URL判定メソッド
    static public function check()
    {
        if (isset($_COOKIE&#91;'referer7}) {
            self::flag = true;
        }
        if (preg_match('/^http:\/\/xxxx\.com/', $_SERVER&#91;'HTTP_REFERER'&#93;)) {
            setcookie('referer', $_SERVER&#91;'HTTP_REFERER'&#93;, 0, "/", "thekyo.jp");
            self::flag = true;
        }

        return self::flag;
    }
?>

上記コードのメソッドを使うと、iPhone5でもXperiaでも正常に動作した。
そこで、リリースを行ってみたら、以下の仕様確認漏れで大変なことに・・・

  • 問題点:
    • スマホのセッションCookieは、スマホの電源を落とすか、ブラウザアプリを終了するまでは、通常残される・・・という点。(盲点だった)

たしかに、スマホはアプリの起動を早くする為、アプリを「閉じる」という発想がない。
メモリを意識するユーザはアプリの終了や、キャッシュのクリアなどしているかもしれないが、通常のユーザが「ブラウザをいつも終了」する・・とは限らない。

  • 結果:
    • 結果として、セッションCookieが常時保存されたままで、そのメソッドを実行したページを経由した後、他のコンテンツを閲覧しても、セッションCookieが残っている為、スマホURL経由と判定され、痛い目を見た。

    • そこで、スマホでは「セッションCookie(Time=0)」を利用しない方がいい・・という尾話。逆に、永続的なログインを実装したい場合などには非常に有効。

    • PCと似たアプリケーションの割に、スマホ独自の「アプリを終了しない」仕様もあるので、この辺りは注意が必要。
    • phpのSessionを利用する場合は、サーバ側でGarvegeCollectionが働くので、事実上24~30分(デフォルト)でセッションは切れるが、永続的セッションCookieを利用する場合は、非常に注意が必要です。

    • ガラケーでも、Cookieが使えず、SessionIDをTransIdして、GETパラメータで持ちまわっていた時期もありましたが、最近のスマホではPC同様Cookieを使えるので、実装は楽になったものの、「電源を切る」 または 「ブラウザアプリを終了する」 まで、セッションCookieが削除されない点は、仕様として事前確認しておいた方がよい。

また、勉強になりました。