ちょっと前にこんな記事が Twitter や Facebook で話題になっていました。PC とスマホ両対応しているサービスは要注意かもしれません。
グーグル、スマホ対応が不適切なサイトの検索順位を引き下げへ - CNET Japan
Twitter や Facebook でシェアされた URL を踏むと、強制的にスマートフォン向けのトップに飛ばされるサイトってありますよね。どうやら、そういうページは Google では検索順位が下げられるようです。
ソーシャル対応を考えると、PC 向けとスマホ向けを同一の URL で運用したいものです。ちなみにはてなブログはちょっと前に同じ URL で表示されるようになりました。
これまでは、はてなブログをスマートフォンで閲覧すると、次の表のように「/touch」を含むURLで表示されていました。このため、ソーシャルメディア等にシェアする際に複数のURLに分散したり、閲覧時のスタイルが適切でなかったりといった問題がありました。
スマートフォンでも、PCと同じURLでブログを表示するようにしました! 利便性と表示速度が向上しています。 - はてなブログ開発ブログ
割と単純に見えるんですが、ゼロから作ろうとするとかなりめんどくさいんですよね。
しかし、ASP.NET MVC 4 というか Web Pages 2 で追加された Display Mode を使えば、同一 URL で PC 向けとスマホ向けのページを提供できるし、切り替えだってブラウザオーバーライド機能があるから、何もしなくても対応出来るので最高に楽ですね。
という訳で、今回は ASP.NET MVC 4 でスマートフォン対応の方法を振り返りつつ、総集編的な感じにまとめておきます。
ビューだけ用意して対応
Display Mode の機能を使って、ビューを複数用意して対応します。実際に作成したビューは以下のようになります。
簡単ですね。Display Mode を使ったビューの切り替えは部分ビューに対しても有効なので、以下のようなコードを書いても意図したとおりに動作します。
@* ページャを表示する *@ @Html.Partial("_Pager", Model.Items)
Display Mode を使っている限り、ビューに関しては何も考える必要が無いです。
ビューとアクションを用意して対応
しかし、ビューだけ用意すれば対応できるのかと言えば、そうは問屋が卸さないのがこの世の中。
殆どの場合は表示する内容が PC 版と微妙に異なってくる現実が待ってます。実際にはビューだけで対応できることなんて少ないと思うので、アクションも部分的に別々に用意してしまいましょう。
拙作の NuGet Gallery | SwissKnife.Mvc 0.0.17 にある DisplayMode 属性を使えば、簡単に実装できます。*1
public class HomeController : Controller { public ActionResult Index() { return View(); } [DisplayMode("Mobile")] public ActionResult Index(string userAgent) { return View(); } }
引数の userAgent というのはオーバーロード用の意味のないものです。別に ActionName 属性を使って名前を割り当ててやればいいんですが、見た目分かりにくくなるのでこんな方法をとってます。
アクションが 2 つになるからコードが増えるとか言われそうですが、綺麗に作っておけばコントローラのコードなんて数行で済むはずなので、アクションが増えても問題ないと思います。
表示の切り替え
当然ながらスマホ向けから PC 向けのページを表示したいという需要は存在しています。さて、それにどうやって対応しようかという話になるのですが、Display Mode には User-Agent をオーバーライドする機能が用意されているので、それを利用すれば簡単に対応出来ます。
// スマホ向けに切り替える HttpContext.SetOverriddenBrowser(BrowserOverride.Mobile); // PC 向けに切り替える HttpContext.SetOverriddenBrowser(BrowserOverride.Desktop);
Display Mode のブラウザ情報はデフォルトではクッキーに格納されているので、以下の記事のようにクッキーを直接操作すればクライアントサイドで完結することもできます。
ASP.NET MVC 4 のブラウザオーバーライドを JavaScript から設定する - しばやん雑記
リクエストが 1 回分減るのでお得ですね。
ちなみに、ブラウザ情報をクッキー以外に保存したい場合には、以下の記事を参照してください。
まとめ
今までの記事からも引っ張りつつ、理想的なスマホサイトを作る方法を紹介しました。
ASP.NET MVC 4 にはスマホ対応のために必要な機能がすべて用意されているので、ぶっちゃけかなりおすすめです。拡張性が高いのも非常に良いですね。
*1:ステマ