将应用程序更新到最新版本后,文件不再可读

时间:2013-02-11 21:57:59

标签: iphone ios objective-c ipad cocoa-touch

我一直在为iPad的企业分布式应用程序工作大约一年。我们在那个时候发布了5个生产版本,从未遇到任何问题。每当我们的用户在旧版本上安装新版本时,我们的Core Data迁移始终工作正常。直到我们在应用程序中添加了视频录制。

我们一直将“Media”存储在Core Data Externally Managed数据类型中。这一点工作正常,直到我们开始允许用户创建大型视频。因此,我们发现Core Data迁移会删除任何超过5mb的文件。此时,我们推出了自己的文件管理方案。这完全没问题,我们编写了我们自己的手动迁移文件,从Core Data到我们自己的方案。这是在没有问题的情况下发布的。

然后,当推出我们的NEXT功能集时,突然出现了一个问题。从Xcode构建时从来没有任何问题......但是,在使用Enterprise Deployment重新部署之后,在上一个版本中写入文件系统的任何文件都突然变得不可读。如果将设备插入XCode,则文件在管理器中清晰可见。但是NSFileManager / NSFileHandle / NSData找不到文件。他们总是报告他们经历过:

error: {
    NSFilePath = "/var/mobile/Applications/3CFB07B3-D17F-45D7-A233-4E56930D794C/Documents/ep_binary_data/9465C282-7ED2-428E-B7D3-545BCFE4DFC5";
    NSUnderlyingError = "Error Domain=NSPOSIXErrorDomain Code=2 \"The operation couldn\U2019t be completed. No such file or directory\"";
}

就像我说的,我可以使用XCode Organizer验证文件是否在该路径上实际存在。任何帮助将不胜感激。我整天都在试着弄清楚我的脑袋。

用于阅读的代码如下:

NSError *err = nil;
NSData *data = [[NSData alloc] initWithContentsOfFile:self.thumbnail_url 
                                              options:NSDataReadingMappedIfSafe 
                                                error:&err];
if (err != nil) logger(@"error: %@",[err userInfo]);

写下:

NSError *error = nil;
[thumbnail_ep_managed writeToFile:filePath options:NSDataWritingAtomic error:&error];
if(error != nil)
{
    NSLog(@"error writing file to path: %@\nerror: %@",filePath,[[error userInfo]description]);
}

我很难过

1 个答案:

答案 0 :(得分:0)

我在SomethingAwful的一些Goons的帮助下找到了解决方案。问题是我存储了FULL路径,就像包含文档目录一样。这是iOS设备上的错误。您无法保证升级后捆绑路径仍然相同。

有时,升级应用程序时会更改捆绑包标识符(安装应用程序的目录的名称)(即散列)。因此,如果存储完整路径,升级可能会制动存储的路径。解决方案是仅从文档目录开始持久保存相对路径。

然后,当您启动应用程序时,缓存文档目录,并附加您的持久相对路径。

从原来的路径开始:

/var/mobile/Applications/3CFB07B3-D17F-45D7-A233-4E56930D794C/Documents/ep_binary_data/9465C282-7ED2-428E-B7D3-545BCFE4DFC5

这部分可以改变:

3CFB07B3-D17F-45D7-A233-4E56930D794C

所以我应该只存储:

ep_binary_data/9465C282-7ED2-428E-B7D3-545BCFE4DFC5

抓住:

/var/mobile/Applications/3CFB07B3-D17F-45D7-A233-4E56930D794C/Documents/

部分应用程序启动。

Voila,文件继续有效。 :)