應用有一些檔案需要永久儲存在本地以支援離線功能,但這些檔案不包含使用者資料,無需備份。如何防止這些檔案被備份到 iCloud 和 iTunes?
在 iOS 上,應用負責確保只有使用者資料而不包含應用資料被備份。具體步驟在不同 iOS 版本各有不同。關於哪些資料不應該被備份,請參閱《iOS App Programming Guide》中的 App Backup Best Practices 章節。
注意:應用應避免將應用資料和使用者資料混在同一檔案中,這會增加不必要的備份大小,且被視為違反 iOS 資料儲存指南。
從 iOS 5.1 開始,應用可以使用 NSURLIsExcludedFromBackupKey 或 kCFURLIsExcludedFromBackupKey 檔案屬性來防止檔案被備份。這些 API 是透過直接設定額外屬性來取代舊的、已棄用的方式。所有運行在 iOS 5.1 的應用都應使用這些 API 防止檔案被備份。
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
如果應用必須支援 iOS 5.0.1,可以使用設定「不要備份」的擴充屬性。當建立無需備份的檔案或資料夾時,寫入資料後呼叫此方法,傳入檔案 URL。
以下代碼已被棄用,僅應用於 iOS 5.0.1 及更早版本。在 iOS 5.1 上運行時,應用應使用 NSURL 和 CFURL 鍵來處理。
#import- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 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; }
無法在 iOS 5.0 上防止資料被備份。如果應用必須支援 iOS 5.0,則需要將應用資料保存在 Caches 目錄中以避免被備份。iOS 會在不需要時刪除 Caches 目錄中的資料,因此如果資料被刪除,應用將需要重新解壓這些資料。