每次重新启动 iPhone App 时 NSHomeDirectory 返回不同的路径

Posted

技术标签:

【中文标题】每次重新启动 iPhone App 时 NSHomeDirectory 返回不同的路径【英文标题】:NSHomeDirectory returns different path each time iPhone App is restarted 【发布时间】:2010-01-28 12:51:31 【问题描述】:

我注意到每次我用 Xcode 重新启动应用程序时 NSHomeDirectory 返回一个不同的路径,显然即使我手动单击该图标,因为它不会加载文件的内容。我很震惊,每次我重新启动应用程序时它都会给我一个不同的目录。这发生在模拟器和设备上,即使我使用“ForUser”方法。我的电话是这样的:

NSString* fullPath = [NSHomeDirectory() stringByAppendingPathComponent:@"test.file"];

NSString* fullPath = [NSHomeDirectoryForUser(@"MrX") stringByAppendingPathComponent:@"test.file"];

甚至

NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [docsDirectory stringByAppendingPathComponent:@"test.file"];

两个应用启动的日志是这样的,注意GUID部分是如何变化的:

loadCharacters: /var/mobile/Applications/ABE7E33E-439B-4258-8FC1-127A3CD00D87/test.file
loadCharacters: /var/mobile/Applications/71C02507-6347-4693-8CC1-537BE223179E/test.file

我做错了什么,或者我错过了什么?

解决方案:

起初我保存到 NSHomeDirectory 本身,而不是“文档”子目录。由于每次部署都会更改 App 目录,但仅复制“文档”目录中的文件,因此每次部署后保存的文件都会丢失。然后我使用了“Documents”文件夹,但有人建议我应该把它放在“Documents”的子文件夹中,我只是这样做了,但忘记创建文件夹,因此文件没有保存。我在这个上双重失败。 :)

只需保存到 NSHomeDirectory() + "Documents/test.file" 即可。

【问题讨论】:

另见File System Basics & ios Standard Directories: Where Files Reside 【参考方案1】:

你做对了。每次将应用程序安装到模拟器或设备中时,它都会被放置到不同的目录中(我不知道为什么,但这就是发生的情况)。但是,它的所有目录结构都移动到了新位置。因此,您的 RELATIVE 路径将保持不变。

【讨论】:

那我该如何测试保存/加载这种方式呢? 是的,我知道它有效,因为我每次保存后都会加载。但是,当我构建临时分布式版本时,仍然会出现不同的路径。如果由于此问题而对测试人员不起作用,我如何证明保存/加载有效?换句话说:我的测试人员无法验证有效的保存/加载系统。 保存/加载是什么意思?下次安装时,您保存的所有数据应该仍然存在。 它可能在那里,但文件的路径已更改。那么我怎样才能访问它呢?还是应该由 iPhone SDK / Xcode 在每次部署时自动复制这些数据?如果是这样,那就不会发生。 如果您需要,请随意在 Documents 中创建目录结构。【参考方案2】:

应用主目录的 GUID 部分似乎只是一个随机 UUID(如第 3 组以“4”开头的十六进制数字和第 4 组以“8”、“9”、“A”开头的' 或 'B'。如果您想了解有关 UUID 和唯一 ID 的更多信息,请参阅 wikipedia entry on 'universally unique identifier' 作为一个很好的起点。在目录路径中使用唯一 ID 的原因只是为了分隔作为沙盒(恕我直言)的一部分,一个应用程序(以及同一应用程序的多个部署)相互之间。

【讨论】:

以上是关于每次重新启动 iPhone App 时 NSHomeDirectory 返回不同的路径的主要内容,如果未能解决你的问题,请参考以下文章

当我启动 iphone 模拟器时,Lion Osx 有时会导致所有应用程序崩溃

我应该在每次使用 ExpressJS/Node 更改时重新启动应用程序服务器吗? [复制]

检测 iPhone 音量按钮保持? (iOS 8)

iphone手机用safari上网每次app store都会自动跳出

可以运行一个应用程序然后重新启动 iPhone 吗?

监控 CLLocationManager 重大位置更改时应用程序不会重新启动 - iPhone