西海岸より

つらつらざつざつと

iOS5で特定のディレクトリをバックアップ対象外とする方法

特定ファイル、ディレクトリをバックアップ対象外とする方法

エントリアプリのiOS5のアップデート対応でも記述した通り、iOS5からはDLファイル等の大容量ファイルをバックアップ対象としてはいけないポリシーとなりましたが、それを受けてかiOS5.0.1よりDocumentsディレクトリ以下であっても特定のディレクトリやファイルをバックアップ対象外とすることが可能になりました。

具体的には、以下のようなコードを記述し、バックアップ対象外としたいディレクトリに対してコールすると良いです。

#include <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];
 
    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;
 
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}

バックアップ対象外の確認方法

バックアップが対象外とされているか確認する方法としては、対象アプリをインストール、利用し、iTunesでアプリを同期した後、PCにバックアップされた中身を見るのが手っ取り早いです。
iTunesのバックアップは、実際には暗号化されてしまっていますが、それを復元するiphone backup extractorなどを利用すればすぐに複合化して取り出せます。

  • iPhone backup extractorを使う場合(Mac)
    • ツールをダウンロードし、インストール
    • アプリを起動
    • バックアップ端末を選択
    • アプリを選択
    • 抽出したバックアップの保存先を選択

この手順だけで、バックアップを抽出可能です。
バックアップを抽出したフォルダの中に、バックアップ対象外のファイルやフォルダが無ければ処理としては成功しているものと思います。(iCloudのバックアップもこれと同じ挙動、のはず)

注意点

前提としてiOS5.0.1以上 (iTunesを利用する場合は最新版が必須)です。

バックアップ対象外のフラグは、ファイル単位でやると将来的に対象ファイルが増えてきた場合に間違いがおこる可能性が高いので、特定のディレクトリをバックアップ対象外とし、バックアップ対象外のファイルをそのディレクトリ以下に配置していくとよいと思います。
また、既存のアプリからのバージョンアップする場合は、アップデート後の初回起動時にデータ配置移行等する必要があるなど、考えなくちゃいけないことは多々あります。。

iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎

iOSプログラミング入門 - Objective-C + Xcode 4で学ぶ、iOSアプリ開発の基礎