1

我一直在为 iPad 开发企业分布式应用程序大约一年。我们在那段时间发布了 5 个生产版本,从未遇到任何问题。每次我们的用户在旧版本上安装新版本时,我们的核心数据迁移总是运行良好。直到我们将视频录制添加到应用程序中。

我们一直将“媒体”存储在 Core Data Externally Managed 数据类型中。在我们开始允许用户创建大型视频之前,这一直很好。因此,我们随后发现 Core Data 迁移会丢弃任何超过 5mb 的文件。在这一点上,我们推出了自己的文件管理方案。这非常好,我们编写了我们自己的手动将文件从 Core Data 迁移到我们自己的方案中。这是毫无问题地发布的。

然后,当需要推出我们的下一组功能时,突然出现了一个问题。从 Xcode 构建时从来没有任何问题......但是,在使用 Enterprise Deployment 重新部署之后,在之前的构建中写入文件系统的任何文件突然变得不可读。如果将设备插入 XCode,则文件在 Organizer 中清晰可见。但是 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]);
}

我很难过

4

1 回答 1

0

我在SomethingAwful 的一些Goons 的帮助下找到了解决方案。问题是我存储的是完整路径,就像包含文档目录一样。这是 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/

应用程序启动部分。

瞧,文件继续工作。:)

于 2013-02-18T21:22:58.013 回答