iPhone: переместите ресурсы в пакет приложений

Моя заявка только что была отклонена Apple, потому что я храню свои ресурсы в папке «Документы»! Папка «Документы» автоматически синхронизируется с 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: @""]];

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

[РЕДАКТИРОВАТЬ]

- (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;

Спасибо.


person AlienMonkeyCoder    schedule 21.11.2011    source источник


Ответы (2)


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

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

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

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
person Felix Lamouroux    schedule 21.11.2011
comment
OMG, тогда как я могу поддерживать свои автоматические материалы CMS с веб-сайта? Если я обновляю свое приложение с веб-сайта, мое приложение для iPhone автоматически загружает его и обновляет папку с документами. Я не могу позволить себе загружать весь ZIP-файл приложения, если он недоступен локально из-за его огромного файла! После обновления локальных файлов я хочу убедиться, что он является постоянным, потому что он обновляет версию и синхронизируется с сервером, чтобы сервер знал, какая версия файлов есть у iPhone, и при необходимости отправлял изменения. Если файлы удалены, мое приложение может перейти в несогласованное состояние! - person AlienMonkeyCoder; 21.11.2011
comment
В этом случае вам нужно будет пометить его как постоянный. Для этого в iOS 5.0.1 добавлены атрибуты файловой системы. - person Felix Lamouroux; 21.11.2011
comment
Привет, Феликс, на основе developer.apple.com/library/ios/ #qa/qa1719/_index.html, я не должен помечать не резервное копирование файлов в папке «Документы». поэтому я должен пойти на то, что вы предложили здесь. Apple также упомянула, что файлы кэша могут быть удалены в случае нехватки памяти. Я не мог найти, как сделать мои файлы постоянными. Не могли бы вы привести пример? - person AlienMonkeyCoder; 23.11.2011
comment
Автономные данные Это данные, которые могут быть загружены или иным образом воссозданы, но пользователь ожидает, что они будут надежно доступны в автономном режиме. Автономные данные должны быть помещены в каталог ‹Application_Home›/Documents или в каталог ‹Application_Home›/Library/Private Documents (подробности см. в QA1699) и помечены атрибутом do not backup. Данные, хранящиеся в любом месте, будут сохраняться в ситуациях с нехваткой памяти, а атрибут «не создавать резервные копии» не позволит iTunes или iCloud выполнять резервное копирование данных. Автономные файлы данных должны быть удалены, как только они больше не... - person Felix Lamouroux; 23.11.2011
comment
Получается, что нужно хранить файлы в Document, но с атрибутами No backup - person Felix Lamouroux; 23.11.2011
comment
Круто! Обновленный код и отправленное приложение. Надеюсь, в этот раз все пройдет! - person AlienMonkeyCoder; 23.11.2011
comment
Привет, Феликс, я добавил код. Пожалуйста, дайте мне знать, если я что-то упустил. Спасибо. - person AlienMonkeyCoder; 23.11.2011
comment
@AppleDeveloper прошло ли ваше приложение? как вы управляете хранилищем iOS 5? - person Desmond; 01.02.2012
comment
Да, наше приложение было одобрено после того, как я пометил папку DoNotBackup, чтобы не выполнять автоматическое резервное копирование в iCloud. Что вы подразумеваете под хранилищем iOS 5? Как вы видите в моем отредактированном вопросе, я проверяю, является ли версия системы iOS 5 или выше. Я отметил свою папку, иначе нет! - person AlienMonkeyCoder; 02.02.2012

в 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);
}
person javieralog    schedule 21.11.2011