2013-04-26 37 views
18

Ứng dụng của chúng tôi gần đây đã bị từ chối do vi phạm iOS Data Storage Guidelines về cách sao lưu các tệp trên iCloud.iOS: Không sao lưu thuộc tính?

Tôi phải đánh dấu dữ liệu bằng thuộc tính do not back up.

Tôi đang lưu trữ tất cả dữ liệu quan trọng trong cơ sở dữ liệu SQLite và tùy chọn người dùng của mình trong UserDefaults.plist. Tôi có phải đánh dấu các tệp database.sqlite của mình là do no back up không?

Tôi hỏi người đánh giá nếu tôi vô hiệu hóa iCloud trong AppID của mình, nó sẽ giúp tình huống của tôi và phản hồi rất khó hiểu và không thực sự cho tôi câu trả lời có hoặc không.

Không có gì trong ứng dụng của tôi thực sự cần được sao lưu, tôi có thể tắt hỗ trợ iCloud trong AppID của mình và không phải lo lắng về việc đánh dấu tệp là do not back up ??

Đây là phản ứng của nhà phê bình:

2,23

Chúng tôi cũng phát hiện ra rằng ứng dụng của bạn không tuân theo Nguyên tắc lưu trữ dữ liệu iOS, được yêu cầu theo hướng dẫn đánh giá App Store.

Cụ thể, chúng tôi nhận thấy rằng khi khởi chạy và/hoặc tải xuống nội dung, ứng dụng của bạn lưu trữ 4 MB. Để kiểm tra có bao nhiêu dữ liệu ứng dụng của bạn được lưu trữ:

  • Cài đặt và khởi động ứng dụng của bạn
  • Đến Cài đặt> iCloud> Storage & Sao lưu> Quản lý lưu trữ
  • Nếu cần thiết, hãy nhấp vào "Hiển thị tất cả các ứng dụng"
  • Kiểm tra bộ nhớ của ứng dụng của bạn

Nguyên tắc lưu trữ dữ liệu iOS chỉ ra rằng nội dung mà người dùng tạo bằng ứng dụng, ví dụ, tài liệu, tệp mới, chỉnh sửa, v.v. phải được sao lưu bởi iClo ud.

Tệp tạm thời được ứng dụng của bạn sử dụng chỉ nên được lưu trữ trong thư mục/tmp; hãy nhớ xóa các tệp được lưu trữ ở vị trí này khi người dùng thoát khỏi ứng dụng.

Dữ liệu có thể được tạo lại nhưng phải duy trì hoạt động đúng cho ứng dụng của bạn - hoặc vì khách hàng mong đợi nó khả dụng để sử dụng ngoại tuyến - phải được đánh dấu bằng thuộc tính "không sao lưu". Đối với các đối tượng NSURL, thêm thuộc tính NSURLIsExcludedFromBackupKey để ngăn sao lưu tệp tương ứng. Đối với các đối tượng CFURLRef, hãy sử dụng thuộc tính kCFURLIsExcludedFromBackupKey tương ứng.

Để biết thêm thông tin, vui lòng xem Technical Q & A 1719: Làm cách nào để ngăn tệp được sao lưu vào iCloud và iTunes ?.

Cần phải sửa đổi ứng dụng của bạn để đáp ứng các yêu cầu của Nguyên tắc lưu trữ dữ liệu iOS. Đối với các câu hỏi cấp mã riêng biệt, bạn có thể tham khảo ý kiến ​​với Bộ phận hỗ trợ kỹ thuật dành cho nhà phát triển của Apple.Hãy chắc chắn:

  • bao gồm các chi tiết đầy đủ về việc từ chối của bạn đưa ra
  • chuẩn bị bản ghi bất kỳ symbolicated sụp đổ, ảnh chụp màn hình, và các bước để tạo lại vấn đề khi các kỹ sư DTS sau lên.
+0

bạn có thể đăng bài trả lời của nhà phê bình? –

+0

Tôi không nghĩ rằng bạn chỉ có thể "tắt iCloud" nữa. Bạn cần chia dữ liệu của mình thành nội dung mà người dùng tạo/sửa đổi, nội dung được tải xuống động (và có thể được tải xuống lại), nội dung tạm thời và chỉ có thể được ném và nội dung đi kèm với cài đặt ứng dụng (và có thể được cài đặt lại). Chỉ loại đầu tiên phải là "hỗ trợ đám mây", –

+0

@Hot Licks: Trong phần Chứng chỉ, Số nhận dạng & Cấu hình của Cổng cấp phép trong ID ứng dụng, tôi có thể đặt iCloud để bật hoặc tắt. Tôi muốn biết nếu điều này sẽ ngăn chặn sao lưu iCloud vì vậy tôi không phải chia nhỏ các tập tin của tôi lên. Ngoài ra tôi không thể làm điều này với một hồ sơ phát triển vì vậy không có cách nào để kiểm tra. – PaulG

Trả lời

31

Về cơ bản, nó phụ thuộc vào loại dữ liệu bạn đang lưu trữ.

Nếu dữ liệu có thể được tạo lại (ví dụ: khi người dùng cài đặt ứng dụng trên thiết bị khác), thì không nên sao lưu dữ liệu đó.

Nếu không, sao lưu iCloud là OK, vì người dùng sẽ mong đợi dữ liệu của mình khả dụng, ngay cả trên một thiết bị khác.

Trong kịch bản đầu tiên, bạn có cơ bản hai cách để đạt được điều này ...

Hoặc bạn sử dụng NSURL để thiết lập kCFURLIsExcludedFromBackupKey trên các tập tin của bạn, hoặc là bạn lưu trữ chúng trong một vị trí đó sẽ không được backed- lên, như <Application_Home>/Library/Caches. Lưu ý rằng giải pháp thứ hai là tốt hơn, IMHO.

Đối với thông tin, kCFURLIsExcludedFromBackupKey thể được sử dụng theo cách này:

NSURL * fileURL; 

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

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

Đối với kịch bản thứ hai, đôi khi của Apple nhận xét nghĩ dữ liệu của bạn có thể được tái tạo, khi nó không phải. Sau đó, bạn sẽ phải giải thích lý do tại sao dữ liệu phải được sao lưu.

+0

Cảm ơn rất nhiều vì phản hồi. Vì vậy, để vô hiệu hóa iCloud 'hoàn toàn', tôi sẽ chỉ thiết lập đường dẫn của tôi vào thư mục tài liệu? Đó có phải là một giả định an toàn không? Ngoài ra tôi nghe nói rằng điều này chỉ hoạt động cho iOS 5.1 trở lên. Ngay bây giờ tôi hỗ trợ 5.0 trở lên, có bất kỳ lý do gì mà tôi không nên chỉ đặt lệnh cắt xuống 5.1 và sử dụng mã trên không? Cảm ơn một lần nữa! – PaulG

+0

Đó là một tùy chọn, nhưng tôi nghĩ bạn không nên lưu trữ loại dữ liệu đó vào thư mục "Tài liệu". Đây cũng là cách duy nhất nếu bạn cần hỗ trợ iOS <5.1, vì phương thức 'setResourceValue:' của NSURL chỉ có sẵn từ iOS 5.0 và 'kCFURLIsExcludedFromBackupKey' chỉ khả dụng kể từ iOS 5.1. – Macmade

+0

Cảm ơn! Nếu tôi phải làm điều này, thì điểm có thể bật hoặc tắt iCloud trong ID ứng dụng của tôi là gì? Điều đó không phục vụ một mục đích? – PaulG

3

Bạn có thể gọi hàm sau đây để vượt qua con đường của bạn "map.sqlite" như NSURL:

NSURL *url = [NSURL fileURLWithPath:yourSQLitePath]; 
[self addSkipBackupAttributeToItemAtURL:url]; 
The function is provided in Apple as: 

- (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; 
} 
Các vấn đề liên quan