2012-06-26 16 views
5

Ứng dụng của tôi bị từ chối vì dường như 7 mb được lưu trữ trong thư mục tài liệu và chúng được tự động gửi tới icloud. Vì vậy, tôi đã lặp tất cả các tệp sẽ được ghi vào thư mục tài liệu qua phương thức này:NSURLIsExcludedFromBackupKey - Ứng dụng phải tuân thủ Nguyên tắc lưu trữ dữ liệu iOS hoặc chúng sẽ bị từ chối

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL { 

    const char* filePath = [[URL path] fileSystemRepresentation]; 
    const char* attrName = "com.apple.MobileBackup"; 
    if (&NSURLIsExcludedFromBackupKey == nil) { 
    // iOS 5.0.1 and lower 
    u_int8_t attrValue = 1; 
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0); 
    return result == 0; 
} 
    else { 
    // First try and remove the extended attribute if it is present 
    int result = getxattr(filePath, attrName, NULL, sizeof(u_int8_t), 0, 0); 
    if (result != -1) { 
     // The attribute exists, we need to remove it 
     int removeResult = removexattr(filePath, attrName, 0); 
     if (removeResult == 0) { 
      NSLog(@"Removed extended attribute on file %@", URL); 
     } 
    } 

    // Set the new key 
    NSError *error = nil; 
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; 
    return error == nil; 
    } 

Phiên bản 1.1 của ứng dụng của tôi đã được phê duyệt sau khi thực thi mã này. Tuần trước tôi đã cố gắng gửi phiên bản 1.2 của cùng một ứng dụng (không có gì thay đổi trong quản lý tệp, tất cả các tệp được lưu trữ trong thư mục tài liệu được lặp qua phương thức addSkipBackupAttributeToItemAtURL). Ứng dụng của tôi đã bị từ chối một lần nữa vì lý do tương tự. Tôi không thể di chuyển tập tin của mình vào thư mục tạm thời hoặc bộ nhớ cache vì ứng dụng của tôi không thể khôi phục hoàn toàn tệp (một trong những tệp này là db, khôi phục db nghĩa là mất dữ liệu do người dùng chèn), vì vậy, đây không phải là giải pháp . Dù sao tôi đã tìm thấy một vấn đề trong mã, đây là cách tôi gọi phương thức:

[tự thêmSkipBackupAttributeToItemAtURL: [NSURL fileURLWithPath: fullPath]];

sử dụng thiết bị [NSURL fileURLWithPath: fullPath] với ios 5.1 trả lại lỗi và có vẻ như không thể tạo thuộc tính. Nếu tôi thay đổi khởi tạo của nsurl bằng [NSURL URLWithString: defaultStorePath], thiết bị có 5.1 dường như thêm đúng thuộc tính.

Với ios 5.0.1 tất cả được đảo ngược, [NSURL URLWithString: defaultStorePath] trả lại lỗi trong khi [NSURL fileURLWithPath: fullPath] hoạt động.

Có lẽ tôi có thể kiểm tra phiên bản ios và đặt khởi chạy thích hợp nsurl, nhưng nó vẫn là một vấn đề. Trong lời giải thích từ chối tôi đọc:

Cụ thể, chúng tôi nhận thấy rằng khi tải xuống và/hoặc nội dung tải xuống, ứng dụng của bạn lưu trữ 7mb. Để 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

Nếu tôi cố gắng kiểm tra giá trị này, tôi thấy 7 mb cũng với khởi tạo đúng nsurl (khi tất cả các thuộc tính được đặt chính xác). Hành vi chính xác là gì? Bất cứ ai có vấn đề này? Tôi có phải làm điều gì đó cụ thể trước khi kiểm tra lưu trữ ứng dụng được đề xuất bởi táo để làm cho nó đáng kể không?

Trả lời

0

Tôi đã gặp sự cố tương tự như bạn cho đến khi tôi xóa ứng dụng của mình khỏi thiết bị và được cài đặt lại. Tôi cũng phải xóa dữ liệu đã lưu trong bộ nhớ cache hiện tại khỏi bản sao lưu iCloud bằng cách đi tới Cài đặt-> Lưu trữ & Sao lưu -> Quản lý bộ nhớ

Điều đó dường như làm điều đó. Ngoài ra, mã của tôi để thêm thuộc tính bỏ qua là một chút khác nhau: Code lifted from this post

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL 
{ 
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); 

    if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1 
     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; 
    } 
    else { // iOS >= 5.1 
     NSError *error = nil; 
     [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error]; 
     return error == nil; 
    } 


} 
2

Tôi nghĩ rằng Bí quyết là để thêm NSURLIsExcludedFromBackupKey VÀ chắc chắn rằng thư mục nằm ngoài thư mục tài liệu. Tôi đã làm điều này bằng cách di chuyển tài liệu của mình vào thư mục Hỗ trợ Thư viện/Ứng dụng (vì nó không có ý nghĩa trong thư mục/tmp hoặc/Caches):

// store in /Library/Application Support/BUNDLE_IDENTIFIER/Reference 
// make sure Application Support folder exists 
NSURL *applicationSupportDirectory = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory 
                      inDomain:NSUserDomainMask 
                    appropriateForURL:nil 
                       create:YES 
                       error:&error]; 
if (error) { 
    NSLog(@"KCDM: Could not create application support directory. %@", error); 
    return nil; 
} 

NSURL *referenceFolder = [applicationSupportDirectory URLByAppendingPathComponent:@"Reference" isDirectory:YES]; 
if (![[NSFileManager defaultManager] createDirectoryAtPath:[referenceFolder path] 
           withIntermediateDirectories:YES 
               attributes:nil 
                error:&error]) { 
    NSLog(@"KCDM: Error creating Reference folder to store model %@: %@", modelName, error); 
    return nil; 
} 

BOOL success = [referenceFolder setResourceValue:@YES forKey: NSURLIsExcludedFromBackupKey error: &error]; 
if(!success){ 
    NSLog(@"KCDM: Error excluding %@ from backup %@", referenceFolder, error); 
} 
Các vấn đề liên quan