2012-05-30 15 views
6

Tôi có một ứng dụng tải xuống hàng tấn ảnh và lưu trữ chúng trong thư mục con của thư mục Tài liệu mà dường như tốt cho đến khi iOS 5.1Ứng dụng bị từ chối do Bộ nhớ dữ liệu - làm cách nào để tôi bỏ qua tất cả các tệp trong một thư mục?

Bây giờ Apple đang nói với tôi rằng tôi cần lưu trữ chúng ở nơi khác hoặc bằng cách nào đó đánh dấu chúng không phải để sao lưu. Đây là bản cập nhật ứng dụng vì vậy đối với hầu hết người dùng của tôi, dữ liệu sẽ tồn tại trong các thư mục con này.

Làm cách nào để iOS có thể bỏ qua tất cả các tệp trong các thư mục con của Tài liệu hoặc bỏ qua một tệp cụ thể trong thư mục Tài liệu?

Nó sẽ là một cam kết HUGE để di chuyển tất cả các tệp vào bộ nhớ cache như chúng gợi ý.

tôi đọc điều này, nhưng tôi không chắc chắn chính xác nơi tôi giả sử để thực hiện điều này: https://developer.apple.com/library/ios/#qa/qa1719/_index.html

+0

thế nào là một cặp vợ chồng của 'moveItemAtURL: tourl: Lỗi:' cuộc gọi di chuyển các file đang tồn tại vào thư mục Caches một cam kết lớn? Có một cơ hội cao mà bạn không thể tránh làm điều đó anyway, vì không-sao lưu-cờ không hoạt động trên iOS 5.0 –

Trả lời

5

Bạn có thể sử dụng NSFileNanager để liệt kê tất cả các file, sau đó gọi hàm được đề xuất trong như của bạn. Mã của bạn sẽ là một cái gì đó như:

// From Apple FAQ 
#import <sys/xattr.h> 
- (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; 
} 


- (void) addSkipBackupAttributeToItemsInFolder:(NSString*)folder 
{ 
    NSFileManager *fm = [NSFileManager defaultManager]; 
    NSArray *dirContents = [fm contentsOfDirectoryAtPath:folder error:nil]; 

    for (int curFileIdx = 0; curFileIdx < [dirContents count]; ++curFileIdx) 
    { 
     NSString* curString = [folder stringByAppendingPathComponent:[dirContents objectAtIndex:curFileIdx]]; 
     NSURL* curFileUrl = [NSURL fileURLWithPath:curString]; 
     [self addSkipBackupAttributeToItemAtURL: curFileUrl]; 
    } 
} 

Và bạn sẽ sử dụng như thế:

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    [self addSkipBackupAttributeToItemsInFolder:documentsDirectory]; 
+1

Chỉ cần áp dụng addSkipBackuopAttribute vào thư mục chính nó ngăn cản bất cứ điều gì bên trong thư mục đó được sao lưu để không cần cho phương pháp thứ hai. – Slee

+0

Một câu hỏi. Chúng tôi đang mắc kẹt như bạn với dấu "không sao lưu". Và tôi thấy rằng bạn đã sử dụng trong iOS 5.1 phương pháp được mô tả bởi Apple để sử dụng trong iOS 5.0.1, phải không? Bởi vì, tôi không thể làm việc theo phương pháp mà Apple nói rằng chúng ta cần sử dụng trong iOS 5.1. Các tập tin không được đánh dấu, nhưng nếu chúng ta sử dụng phương pháp được mô tả để được sử dụng trong iOS 5.0.1 các tập tin cũng được đánh dấu. Nhưng .... Apple nói rằng phương pháp đó không được chấp nhận. Bạn đã giải quyết nó như thế nào? – FreelanceAr

Các vấn đề liên quan