Включение файлов в путь к библиотеке комплектов iPhone - PullRequest
1 голос
/ 12 сентября 2010

У меня проблемы с логикой обновления.Мне нужно включить файл в комплект приложения, который содержит конкретные данные обновления.Когда приложение обнаруживает этот файл, оно проверяет, является ли это первой установкой (обновление не требуется) или предыдущей установкой (применить обновление).Каким бы ни был результат, файл обновления необходимо удалить, чтобы он не был найден снова, иначе приложение будет применять обновление при каждом запуске приложения, что плохо.

Поскольку невозможно удалить что-либо из [[NSBundle mainBundle], мне нужно найти лучший способ сделать это.Если бы я мог включить файл обновления в путь к библиотеке приложения, это было бы намного проще.

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

Может ли кто-нибудь помочь мне в этом?вот что у меня есть:

if ([self checkUpdateFile] == YES) {
    [self applyUpdate];
}

-(BOOL)checkUpdateFile {
NSString *updateFilePath = [[NSBundle mainBundle]pathForResource:@"updateData"
        ofType:@"dat" inDirectory:@"update"];
BOOL updateFileExists = [[NSFileManager defaultManager]
        fileExistsAtPath: updateFilePath];
NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
        NSUserDomainMask, YES) objectAtIndex:0];
NSString *programDataPath = [libraryPath stringByAppendingPathComponent: 
        @"programData.dat"];
BOOL programFileExists = [[NSFileManager defaultManager]fileExistsAtPath: 
        programDataPath];
if (programFileExists == YES && updateFileExists == YES) {
    NSLog(@"Update File is present, and so is a data file, so this is a previous install");
    return YES;
} else {
    NSLog(@"This is not an upgradeable version.");
    if (updateFileExists == YES) {
        NSLog(@"The update file is here but this is the first install.");
        [[NSFileManager defaultManager]removeItemAtPath: updateFilePath 
                        error:NULL];
        BOOL doesFileStillExist = [[NSFileManager defaultManager] 
                        fileExistsAtPath:updateFilePath];
        if (doesFileStillExist == YES) {
            NSLog(@"File still exists");
        } else {
            NSLog(@"File was deleted.");
        }
    }
    return NO;
}
}

-(void)applyUpdate {
NSLog(@"Applying Update");
NSString *filePath = [[NSBundle mainBundle]pathForResource:@"updateData" 
        ofType:@"dat" inDirectory:@"update"];
NSData *programData = [[NSData alloc] initWithContentsOfFile:filePath];
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] 
        initForReadingWithData:programData];
NSMutableArray *characterList = [[decoder 
        decodeObjectForKey:@"characterList"]retain];
int i = 0;
for (Character *player in characterList) {
    NSMutableArray *movesList = player.moves;
    Character *existingCharacter = [self.dataController.characterList 
                objectAtIndex:i];
    NSLog(@"Found Character: %@",existingCharacter.name);
    existingCharacter.moves = movesList;
    i++;
}

BOOL doesFileStillExist = [[NSFileManager defaultManager] 
         fileExistsAtPath:filePath];
if (doesFileStillExist == YES) {
    NSLog(@"File still exists");
} else {
    NSLog(@"File was deleted.");
}
[self writeDataToDisk];
[characterList release];
[decoder release];
[programData release];

}

Ответы [ 3 ]

1 голос
/ 13 сентября 2010

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

После того, как вы произвели обновление, запишите BOOL-запись в файл plist (что-то вроде appIsUpdated).

При последующих запусках проверьте наличие файла plist и значение appIsUpdated. Если! AppIsUpdated, обновите приложение.

1 голос
/ 11 апреля 2012

Я обнаружил, что при добавлении файлов в основной пакет он иногда не находит их в основном комплекте в вашем коде. Файл появится в области файлов, но он не будет распознан или найден с использованием этого кода:

NSString *file = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@"db"];

Выберите рассматриваемый файл и удалите только его ссылку, затем с помощью пункта меню: и добавьте файл обратно в проект. Это, кажется, вызывает некоторый внутренний флаг в Xcode, который заставляет компилятор перекомпилировать его в проект.

0 голосов
/ 13 сентября 2010

Вы ответили на свой вопрос;Вы не можете удалять файлы внутри пакета приложения.Относитесь ко всему пакету как к каталогу, доступному только для чтения.

Вам придется уточнить, почему вы пытаетесь это сделать, поскольку я не понимаю этого из вашего описания.Попробуйте объяснить это на высоком уровне («функциональное» описание) - что вы хотите и почему?(Не как вы хотите, чтобы что-то произошло, это низкоуровневое или «нефункциональное» описание.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...