我的更新逻辑出现问题。我需要在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];
}
答案 0 :(得分:1)
如果应用在首次启动时运行,请进行更新。由于更新数据是主捆绑包的一部分,因此您将无法删除文件
完成更新后,将一个BOOL条目写入plist文件(类似于appIsUpdated)。
在后续启动时,检查plist文件是否存在以及appIsUpdated的值。如果!appIsUpdated,请更新应用程序。
答案 1 :(得分:1)
我发现在将文件添加到主包时,它有时会在代码的主包中找不到它们。该文件将显示在文件窗格中,但无法使用以下代码识别或找到该文件:
NSString *file = [[NSBundle mainBundle] pathForResource:@"fileName" ofType:@"db"];
选择有问题的文件并仅删除它的参考,然后使用菜单项: 并将文件添加回项目。这似乎触发了Xcode中的一些内部标志,导致编译器将其重新编译到项目中。
答案 2 :(得分:0)
你回答了自己的问题;您无法删除应用程序包中的文件。将整个包视为只读目录。
你必须澄清你为什么要这样做,因为我从你的描述中不理解它。尝试高级解释(“功能”描述) - 你想要发生什么?为什么? ( 你想要发生什么事情,这是一个低级或“无功能”的描述。)