2014-03-02 49 views
11

通過將應用上傳到應用商店給我這個錯誤。2.23:應用必須遵循iOS數據存儲準則,否則將被拒絕

2.23:應用程序必須遵循的iOS數據存儲的準則,否則將被拒絕

我一直在看什麼是錯的,我使用不符合存儲的文件之一要求。

更具體地說,它是一個用route-me庫加載地圖脫機模式的sqlite。

我正在使用sqlite在離線模式下加載地圖,似乎這張地圖存儲爲iCloud備份,所以我跳過了存儲限制。

不知道怎麼說這個副本不是在iCloud中創建的。

的代碼如下:

[[RMDBMapSource alloc] initWithPath: @ "map.sqlite"]; 

的文件大小爲23MB

什麼想法?

+0

做一些搜索 - 從右邊顯示的相關問題列表開始。關於這個話題有很多現有的討論。 – rmaddy

回答

23

很可能您正在將「map.sqlite」存儲在應用程序的Documents目錄中。通常將Sqlite文件複製到Documents目錄,以便它們可寫。但默認情況下,iOS會嘗試將Documents目錄中的所有文件複製或備份到iCloud(如果啓用了iCloud備份)。因此,根據Apple的指導原則,您可以執行以下操作,以便您的數據庫文件不會被iCloud從您的Documents目錄備份。

您可以調用下面的函數來傳遞你的「map.sqlite」作爲NSURL路徑:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath]; 
[self addSkipBackupAttributeToItemAtURL:url]; 

功能在Apple提供爲:

- (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; 
} 

此功能可以確保該文件(作爲URL提供)不由iCloud備份。

您還可以將數據庫文件放在Documents目錄內的單獨目錄中,並通過調用此函數將整個子目錄標記爲「不備份」。希望能幫助到你。

+0

我需要使用哪個文件來執行此命令? – Jen143Me

0

基本上,它取決於您正在存儲的數據的種類。

如果可以重新生成數據(例如用戶在另一臺設備上安裝應用程序),則不應備份數據。

否則,iCloud備份是可以的,因爲用戶會希望他的數據可用,即使在其他設備上也是如此。

在第一種情況下,你有實現這一目標的主要兩個方面...

無論您使用NSURL設置kCFURLIsExcludedFromBackupKey上的文件,要麼你將它們存儲在該不會是backed-的位置如<Application_Home>/Library/Caches。請注意,第二種解決方案更好,恕我直言。

有關信息,kCFURLIsExcludedFromBackupKey可以採用這種方式:

NSURL * fileURL; 

fileURL = [ NSURL fileURLWithPath: @"some/file/path" ]; 

[ fileURL setResourceValue: [ NSNumber numberWithBool: YES ] forKey: NSURLIsExcludedFromBackupKey error: nil ]; 

對於第二種情形,有時蘋果評論家認爲你的數據可以被重新生成,當它不是。那麼你必須解釋爲什麼數據需要備份。

+0

切勿將您的數據庫文件存儲在'Caches'目錄下!當缺乏可用空間時,iOS會清除它們。 –

相關問題