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

我一直在为iPad开发企业分布式应用程序大约一年。 当时我们已经发布了5个生产版本,从来没有遇到任何问题。 每当我们的用户安装新版本的旧版本,我们的核心数据迁移总是正常工作。 直到我们将video录制添加到应用程序。

我们一直在核心数据外部pipe理的数据types中存储“媒体”。 这工作正常,直到我们开始允许用户创build大型video。 于是我们发现,Core Data迁移垃圾超过〜5MB的任何文件。 在这一点上,我们推出了自己的文件pipe理scheme。 这个工作完全没有问题,我们自己写了我们自己手动把文件从Core Data中移出来,然后写入我们自己的scheme中。 这是没有问题的发布。

那么,到了推出我们的下一个function时,突然出现了一个问题。 从Xcode构build时从来没有任何问题…但是,在使用Enterprise Deployment重新部署之后,写入到以前版本中的文件系统的任何文件都突然无法读取。 如果设备插入到XCode中,文件在pipe理器中清晰可见。 但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 Organizervalidation该文件是否在该path上实际存在。 任何帮助将不胜感激。 整天试图弄清楚这件事,我一直把头撞到桌子上。

用于阅读的代码如下所示:

 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]); } 

我很难过

我在SomethingAwful的一些Goons的帮助下find了解决办法。 问题是,我正在存储完整的path,如包含文档目录。 这是iOS设备上的错误。 你不能保证升级后,捆绑path仍然是一样的。

有时,在升级应用程序时,会更改散列标识符(安装该应用程序的目录的名称),这是散列。 所以,如果你存储完整的path,升级可能会制动存储的path。 解决的办法是只保留一个相对path,从文档目录开始。

然后,当您启动应用程序,caching文档目录,并附加您的永久相对path。

所以从我原来的path:

 /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/ 

部分在应用程序启动。

瞧,文件继续工作。 🙂