在iPhone Bundle Library Path中包含文件

时间:2010-09-12 16:59:52

标签: iphone xcode ipad ios4

我的更新逻辑出现问题。我需要在app包中包含一个包含特定更新数据的文件。当应用程序发现此文件时,它会检查它是第一次安装(不需要更新)还是先前安装(应用更新)。无论结果如何,都需要删除更新文件,因此无法再次找到它,否则应用程序将在每次运行应用程序时应用更新,这很糟糕。

由于无法从[[NSBundle mainBundle]中删除任何内容,我需要找出执行此操作的最佳方法。如果我可以在应用程序的库路径中包含更新文件,那么它会更简单。

我需要这个的原因是因为在第一次加载时,应用程序会创建一个用户数据文件并将其存储在Library路径中。从那时起,应用程序加载该用户文件。在这种情况下,创建的文件具有过时的数据。我创建了一个包含更新数据的新文件,以应用于用户的主文件。

任何人都可以帮我解决这个问题吗?这就是我所拥有的:

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 个答案:

答案 0 :(得分:1)

如果应用在首次启动时运行,请进行更新。由于更新数据是主捆绑包的一部分,因此您将无法删除文件

完成更新后,将一个BOOL条目写入plist文件(类似于appIsUpdated)。

在后续启动时,检查plist文件是否存在以及appIsUpdated的值。如果!appIsUpdated,请更新应用程序。

答案 1 :(得分:1)

我发现在将文件添加到主包时,它有时会在代码的主包中找不到它们。该文件将显示在文件窗格中,但无法使用以下代码识别或找到该文件:

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

选择有问题的文件并仅删除它的参考,然后使用菜单项:  并将文件添加回项目。这似乎触发了Xcode中的一些内部标志,导致编译器将其重新编译到项目中。

答案 2 :(得分:0)

你回答了自己的问题;您无法删除应用程序包中的文件。将整个包视为只读目录。

你必须澄清你为什么要这样做,因为我从你的描述中不理解它。尝试高级解释(“功能”描述) - 你想要发生什么?为什么? ( 你想要发生什么事情,这是一个低级或“无功能”的描述。)