iOS7 Mobile SafariがAjax POSTでキャッシュするか確認してみた
iOS6 Mobile Safariで困った方へ
以前、iOS6 Mobile SafariでAjax POST通信時にキャッシュをしてしまうという挙動が問題になったことがありました。今回、iOS7 Mobile Safariはどうなんだ?というご質問を頂きましたので改めて試して動作を確認したいと思います。
iOS6 Mobile SafariがAjax POSTでキャッシュする問題を回避する方法
結論から先に述べます。iOS7 Mobile Safariは、Ajax POSTをキャッシュしません!!!
iOS7のリモートデバッガで確認する
まずは動作を検証するためにiOS7端末のWebインスペクタをONにします。
Safariの環境設定画面で開発タブを表示する
MacのSafariで開発タブを表示します。これでiPhoneのMobile Safariで行ったアクションについてサーバーとの通信情報を確認することができます。
キャッシュの動作を確認する
簡単なWebサーバーを作成して挙動を確認したいと思います。node.jsがインストールされていると仮定します。
以下はindex.htmlのソースです。
<html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> <script> function formPost(){ $.ajax( { type: "Post", url : "/dopost", data : { param:"hogehoge" }, dataType: "json", success : function( json ){ $("#msg").append(json.timestamp+"<br>"); }, error : function (xhr,text,thrown){ $("#msg").text("error : "+text); } }); } </script> </head> <body> <input type="button" value="POST test" onclick="formPost()"> <p id="msg"></p> </body> </html>
以下はnode.jsのソースです。
var http = require('http'), sys = require('sys'), fs = require('fs'); http.createServer(function (req, res) { console.log('accessed'); if(req.method == 'POST') { var body=''; req.on('data', function (data) { body +=data; }); req.on('end',function(){ console.log(body); }); res.writeHead(200, {'Content-Type':'application/json'}); res.end('{"timestamp":"'+new Date().toString()+'"}'); }else{ fs.readFile('index.html', function(err, content) { if (err) { throw err; } console.log('loaded'); res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); res.end(content); }); } }).listen(80); process.on('uncaughtException', function (err) { console.log('uncaughtException => ' + err); });
node.jsのプログラムを起動します。
$ node app.js
そしてブラウザから動作確認をしてみます。ボタンをクリックするとサーバへAjaxでPOSTを行います。サーバ側では現在の時刻を文字列にして返しています。iOS6の時は何度ボタンを押しても時刻が変わりませんでしたが。しかし、iOS7になったことで挙動が変わりました。ヘッダに関係なくPOSTはキャッシュしない仕様になったのです!!
まとめ
iOS6で変わってしまったMobile Safariの仕様ですが、iOS7で元に戻ったようです!今回は最も基本的な動作を確認しましたが、他にもiOS6と7で違いがありそうですね。以上、ご報告でした〜。