[英]Prevent iCloud sync of data (using .nosync?)
編輯:到目前為止,我能夠提出的最好的是一個彈出窗口,要求用戶禁用iCloud同步,同時將所有數據移動到Documents目錄,這樣就不會被擦除: 在iOS5中,是否可以檢測用戶是否設置了備份應用程序?
我為iPhone / iPad開發了離線地圖應用程序。
我們曾經在Caches目錄中存儲所有數據(可能有很多gigs)。
從iOS5開始,當用戶的硬盤驅動器開始變滿時,可以隨機刪除Caches目錄中的文件。
如何在不將數據同步到iCloud,iTunes且不隨機刪除的情況下存儲本地數據? 我的本地數據是一個包含許多小數據文件的大型目錄樹,存在於數千個子目錄中。
我將目錄樹從庫緩存目錄移動到文檔目錄中的data.nosync目錄,因為我們已經讀過這可能是一個解決方案。 但是,nosync文件夾中的數據仍將備份到iCloud。
現在我創建目錄:
NSString* noSyncDirectory() {
static NSString *directory = nil;
if (!directory) {
directory = [[NSString stringWithFormat:@"%@/%@",
documentsDirectory(), @"data.nosync"] retain];
[Constants createDirectoryIfNeeded:directory];
}
return directory;
}
來自: https : //developer.apple.com/library/ios/#qa/qa1719/_index.html
您可以使用以下方法設置“不備份”擴展屬性。 每當您創建不應備份的文件或文件夾時,請將數據寫入文件,然后調用此方法,並將URL傳遞給該文件。
#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;
}
可以找到更多信息: https : //developer.apple.com/icloud/documentation/data-storage/
進一步說明:雖然開發人員文檔錯誤地暗示(“這些文件不會被清除,也不會包含在用戶的iCloud或iTunes備份中。”),do-not-backup標志會兼作do-not-purge標志,事實並非如此。 只需將文件保留在緩存目錄中並將其標記為“不備份”就不會阻止其擦除。
此問題可能還沒有解決方法...您可以嘗試顯式調用URLForUbiquityContainerIdentifier ,因為它在第一次調用時進行了一些初始化。 然后創建一個帶有.nosync
后綴的.nosync
(基於此示例 )。
第一次為給定容器目錄調用此方法時,iOS會擴展應用程序沙箱以包含該容器目錄。 因此,在嘗試搜索iCloud中的文件之前,至少調用一次此方法非常重要。 如果您的應用程序訪問多個容器目錄,則應為每個目錄調用該方法一次。
.nosync
上的文檔 :
確保iCloud不同步持久性存儲本身:當您為NSPersistentStoreUbiquitousContentNameKey設置值時,UIManagedDocument將持久性存儲放在文檔包內的.nosync目錄中。 如果您使用其他內容(使用writeAdditionalContent:toURL:originalContentsURL:error:方法),則必須確保文檔目錄不是包。 通常,您為文檔目錄指定一個未被識別為文檔擴展名的擴展名。
您可能希望確保擁有com.apple.developer.ubiquity-container-identifiers
權利。
iCloud容器字段標識應用程序可以在用戶的iCloud存儲中訪問的容器目錄列表。 (此字段對應於com.apple.developer.ubiquity-container-identifiers權利。)
也許您可以禁用應用程序的備份並將數據文件存儲在應用程序樹中的其他位置。 任何需要備份的東西都可以放在應用程序外的公共區域。
您可以在配置中執行此操作: 無效的代碼簽名應用程序提交
或設置 :
當您想要為用戶提供完全為您的應用啟用或禁用iCloud使用的選項。 如果您的應用包含“設置”套件或內嵌首選項,則可以包含首選項以切換您的應用是否完全在iCloud中存儲內容。 例如,其數據完全由私有托管文件組成的應用程序可以執行此操作,以便用戶選擇如何存儲這些文件。
或者使用Xcode刪除com.apple.developer.ubiquity-container-identifiers
權利(可以自動添加): 配置應用程序的iCloud權利
否則,您可能需要發出警告,其中包含有關通過UI禁用的說明:
http://www.pcmag.com/article2/0,2817,2394702,00.asp#fbid=bpIwPLZ1HeQ
另一種解決方法是將映射分組為作為單獨的應用程序安裝的集合。 這將是一種存儲數據的方法,無需創建任何同步或備份的目錄。 數據將存儲在.app目錄中並受到保護。
根據緩存空間回收功能的工作方式,它可能不會刪除最近訪問或修改過的文件。 您可以嘗試定期觸摸它們。 您還可以添加一些舊文件作為誘餌,並檢測它們何時被刪除或空間不足以至少發出警告或重新下載已刪除的對象...
有一種更新的方法可以防止iCloud直接同步數據,而無需直接使用擴展屬性:
- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
NSURL* URL= [NSURL fileURLWithPath: filePathString];
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;
}
有關詳細信息,請參閱Apple的技術問答QA1719 。
也許在項目的摘要窗格中取消選中“啟用權利”或編輯配置文件以刪除* ubiquity設置。 ( ios 5 beta 7參考權利的注釋 。)
還有setUbiquitous
函數:
setUbiquitous:itemAtURL:DESTINATIONURL:錯誤:
設置指定URL處的項目是否應存儲在雲中。
參數
旗
指定YES將項目移至iCloud,或指定NO將其從iCloud中移除(如果當前存在)。
您是否嘗試僅在沒有前面數據的情況下命名目錄“.nosync”? 它可能是一般的。 目錄被忽略,或者可能是具體的。
但是,似乎行為就像用戶想要的那樣 - 可能是當前可能沒有使用的應用程序所使用的空間演出,其中空間可以自動回收。 我不確定,但你會認為系統只有在沒有選擇之后才能回收最近創建的文件,所以如果用戶最近剛剛存儲了地圖,除非沒有其他選擇,否則它們不會被刪除。
出於提交錯誤的目的,我將要求在刪除之前為用戶提示標記目錄的方法 - 這樣如果他們正在同步很多電影並且它會清除像你正在談論的地圖一樣的數據集,將詢問用戶是否要從應用程序“MyCoolMapper”中刪除數據“離線地圖”以繼續同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.