hakobera's blog

技術メモ。たまに雑談

Titanium で ImageView の Cache をアプリ起動時に削除する方法

Titanium 1.8 では ImageView に表示したリモートの画像は自動的に Cache されて、オフラインでも閲覧できて、とても便利なのですが、致命的な欠点があります。

  • 永遠に削除されない
  • キャッシュをクリアするメソッドが提供されていない

もしかしたらバグで今後直るかも知れませんが、現状は自力で対応しなければいけません。

画像のキャッシュなので起動時(もしくは終了時)に全部消してしまってもよいのですが、ある一定期間は保持したいという要望もあったので、指定期間更新が無い画像キャッシュファイルを削除するコードを書いてみました。

Titanium で ImageView のキャッシュを起動時に消す (for iOS only) — Gist

/**
 * 指定した時間更新されていない画像キャッシュを削除する。
 * iOS にのみ対応。
 * 
 * @param {Number} expiredTime キャッシュ保持期限 (ms)
 */
module.exports = function(expiredTime) {
  var cachePath = Ti.Filesystem.applicationDataDirectory + '../Library/Caches/',
      cacheDir = Ti.Filesystem.getFile(cachePath),
      now = new Date().getTime();
    
  if (cacheDir) {
    var files = cacheDir.getDirectoryListing();
    if (files) {
      for (var i = 0, l = files.length; i < l; ++i) {
        var file = Ti.Filesystem.getFile(cachePath, files[i]),
            filename = file.name;
            
        // 画像キャッシュは '.' で終わるファイル名で保存されている
        if (filename[filename.length - 1] === '.') {
          if (now - file.modificationTimestamp() > expiredTime) {
            Ti.API.debug(files[i]);
            file.deleteFile();
          }
        }        
      }
    }
  }
};

あとは起動時か、終了時に以下のようにして呼び出してください。

// 7日間更新がない画像キャッシュを削除する場合
require('deleteImageCache')(7 * 24 * 60 * 60 * 1000);

とりあえず手元の iOS 5.0.1 の iPhone4S の実機で動作することは確認しました。