-->

2013年1月29日 星期二

如何不讓資料備份到iCloud

本篇會教你如何不讓app裡面的資料被備份到 iCloud上,上面這段是什麼意思?又為什麼要這麼做? 請聽筆者慢慢道來. 這是發生在第一次上架(手創小物 app),也是第一次被蘋果reject。理由是我違反了這個 iOS Data Storage Guidelines. 裡面羅列了4條規則,簡單的翻譯就是如下:

  1. <Application_Home>/Documents 裡面只能放使用者產生的東西。
  2. 如果你有想要放什麼東西在資料夾裡面,可能是為了能夠讓app能夠在沒網路的狀況下也能夠使用,就必須把這些東西放到 <Application_Home>/Library/Caches這裡面。
  3. 放在<Application_Home>/tmp 裡面的東西呢,用完就要去把它刪掉,不能留著佔使用者的空間。
  4. 第四點則是告訴你,有些東西使用者放到documents裡面去,你也可以把這些東西設定為不要備份到 iCloud上去,這樣可以讓使用者節省他的 iCloud空間。

筆者違反了上述的第四點,因為在 app中為了有 offline使用的功能,筆者把很多檔案都先下載下來放在 documents裡面了。筆者應該使用的是第二個規則。不過後來也不是完全依據第二條規則,因為筆者把第二和第四條規則結合了。既放在 Caches裡,又不讓它備份到iCloud上。說到這相信大家對每個資料夾會發生什麼事,都有了認知,在此就總結一下:

  • <Application_Home>/Documents 會備份到iCloud
  • <Application_Home>/Library/Caches 會備份到iCloud
  • <Application_Home>/tmp 不會備份到iCloud

以上說了這麼多,希望大家能夠避免在這部份被reject。詳細的東西當然還是得去看看蘋果的那篇規則,而筆者的方式就在這裡提供給大家參考。以下分為兩個步驟,依序進行就可以大功告成了。


將目標設定成不備份到iCloud中

在.h中加入:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL

在.m中加入:

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    NSError *error = nil;
    //設定這個URL指向的資料為不備份到iCloud
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] forKey: NSURLIsExcludedFromBackupKey error: &error];
    return success;
}

其實這個方法就是蘋果的方法裡面的範例,筆者稍微修改一下來使用的。完成這個步驟,已經成功了一半。

在Caches中新增一個資料夾

首先在你的.h中加入這行程式碼:

- (void)isFolderExist;

在.m中加入:

- (void)isFolderExist{
    //取得/Library/Caches的路徑
    NSString *cachesPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
    //建立路徑/Library/Caches/itemData
    NSString *itemDataPath = [cachesPath stringByAppendingPathComponent:@"itemData"];
    //判斷這個路徑是否存在(不存在則代表沒有這個資料夾)
    if (![[NSFileManager defaultManager] fileExistsAtPath:itemDataPath]) {
        NSError* error;
        //在/Library/Caches建立資料夾itemData
        [[NSFileManager defaultManager] createDirectoryAtPath:itemDataPath withIntermediateDirectories:NO attributes:nil error:&error];
        //把這個資料夾狀態設定為不備份到iCloud
        [self addSkipBackupAttributeToItemAtURL:[NSURL URLWithString:itemDataPath]];
    }
}

這個方法的功能是,檢查你<Application_Home>/Library/Caches中是否有 itemData這個資料夾,如果沒有就建立並使用前一個方法將它設定為不備份到iCloud。

到這裡已經大功告成了。相信大家已經看明白了,筆者的作法就是在Caches中新增一個資料夾,並且把它設定為不備份。如此一來,就同時滿足了iOS Data Storage Guidelines中的1、2、4三點。希望本篇對大家都有些許的幫助。至於如何確定資料確實沒有備份到iCloud上,可以接續閱讀"如何確認資料沒有備份到iCloud上"。

reference:

沒有留言:

張貼留言