Unityでhttpでのファイル取得時にキャッシュしておき、変更があった時にだけ取得する

2015-06-19

初回データ取得時

  • WWWクラスを使ってデータを取得した時にresponseHeadersにサーバからのレスポンスヘッダが入ってくるので、ETagLast-Modifiedを保存しておく(キーは大文字になっている)

2回目以降

  • 次回リクエスト時にリクエストヘッダにETagIf-Modified-Sinceに与えてリクエストする
IEnumerator requestSomething(string url) {
// prevResponseHeadersを前回取得したレスポンスヘッダとして
Dictionary<string, string> headers = new Dictionary<string, string>();
headers["If-Modified-Since"] = prevResponseHeaders["LAST-MODIFIED"];
headers["ETAG"] = prevResponseHeaders["ETAG"];

WWW www = new WWW(url, null, headers);
yield return www;
...
  • 変更がなければステータスコードに304 Not Modifiedが返ってくるので、そうしたらローカルに保存しておいたデータを利用する

ステータスコードの取得

  • サーバからのレスポンスが304かどうかを調べるには:
  • Unityエディタ上ではwww.responseHeaders["STATUS"]でステータスラインが得られるのだが、ビルドしてiOSやAndroidで動かした時に挙動が違って得られない
    • AndroidだとNULLというキー?で入ってるのだが、iOSだとどこにもない
  • Unity Issue Tracker - [WWW] [iOS] [Android] Status and other keys missing from WWW.responseHeaders on mobile
    • www.errorが空だったら200 OK、そうじゃなかったら先頭3文字がステータスコードだとして整数に変換してしのぐ
    • Status: Not Reproducible、だとぅ?こちとら4.6.6p1で再現済みじゃい
  • 304の場合はerrorが空で返ってくるので、上の方法ではダメだった
  • www.bytes.Lengthが0なので、それで区別するしかない