iPhone: переместить ресурсы в комплект приложений - PullRequest
1 голос
/ 21 ноября 2011

Мое приложение только что было отклонено от Apple, потому что я храню свои ресурсы в папке Documents! Папка «Документы» автоматически синхронизируется с iCloude, поэтому в «Документах» должны храниться только данные, созданные пользователем. Все данные приложения должны идти в комплекте приложений.

Я использую следующий метод в моем проекте

- (NSString *)filePath:(NSString *)fileName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];
    return path;
}   

Например, в следующей строке разархивируйте мои ресурсы в папке документов.

[SSZipArchive unzipFileAtPath: zipFileName toDestination: [self filePath: @ ""]];

Как я могу переместить эти файлы и образы папки ресурсов в комплект приложений и получить к ним доступ?

[EDIT]

- (NSString *)filePath:(NSString *)fileName {
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/DoNotBackUp"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
        // Set do not backup attribute to whole folder
        if (iOS5) {
            BOOL success = [self addSkipBackupAttributeToItemAtURL:path];
            if (success) 
                NSLog(@"Marked %@", path);
            else
                NSLog(@"Can't marked %@", path);
        }
    }
    path = [path stringByAppendingPathComponent:fileName];

    return path;
}

/*
 set the document files attribute to marked "do not backup"
*/
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSString *)path
{
    const char* filePath = [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;
}

Где iOS5 - это переменная BOOL:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

iOS5 = NO;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0.1")) 
    iOS5 = YES;

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

в iOS 5.0.1 вы можете добавить новый файл атрибута, чтобы пометить их как не синхронизируемые с iCloud:

#include <sys/xattr.h>
- (void) AddSkipBackupAttributeToFile: (NSURL*) url
{
    u_int8_t b = 1;
    setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}
1 голос
/ 21 ноября 2011

Вы не можете писать в Bundle во время выполнения.Вы можете добавлять ресурсы в пакет только при создании бинарного файла.Вам нужно будет поместить результаты процесса распаковки в каталог Caches.

Поскольку содержимое этой папки может быть удалено системой в любое время, вы должны проверять при каждом запуске, нужно ли файлразархивируйте снова.

Скорее всего, вам потребуется изменить только первую строку описанного выше метода на:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
...