【发布时间】:2014-05-25 20:40:14
【问题描述】:
为了节省与我的 iOS 应用程序相关的服务器端带宽成本,我将一堆资产打包到我的 iOS 应用程序包中,否则这些资产可以在运行时下载。在编写的应用程序上下文中,如果我可以从用户可写目录之一(例如[App Dir]/Library/Application Support/My Custom Subfolder/)访问文件,而不必在运行时直接复制文件(例如在启动时,首先跑,随便)。
虽然我已经能够使用 NSFileManager API createSymbolicLinkAtURL:withDestinationURL:error: 在 .../My Custom Subfolder/ 中成功创建指向捆绑包中文件的符号链接,但我随后用来访问内容的一些框架 API 却被搞砸了向上并给我与符号链接而不是基础文件有关的属性和数据。我可能可以通过使用其他一些框架 API 来缓解这些问题,但最终可能需要大量工作,具体取决于不正确使用的范围。
在模拟器上,我能够通过使用NSFileManager API linkItemAtURL:toURL:error: 创建指向捆绑内容的硬链接来成功规避此问题。硬链接对于整个应用程序中使用的所有文件访问 API 都非常有效,而且一切都很顺利。然而,在 DEVICE 上(在运行 iOS 7.0.2 的 iPhone 5c 和运行 iOS 7.1 的 iPad 上测试),我会收到 NSCocoaErrorDomain 513 error (Operation could not be completed. Operation not permitted.)。我可以在.../My Custom Subfolder/ 中创建一个测试文件并在同一个文件夹中创建一个硬链接,但如果我尝试硬链接到只读应用程序包中的任何内容,我会收到 513 错误。
有谁知道是否有办法绕过权限错误以完成我想要做的事情?
【问题讨论】:
-
@danh,感谢您的回复。但是,您的代码 sn-p 只是将文件复制到用户可写目录中,有效地使资源在磁盘上占用的空间量增加了一倍。我的意图是避免复制文件,而是使用“硬链接”指向文件,该文件的行为类似于文件,而不会消耗额外的磁盘空间。
-
为什么需要硬链接到应用程序包中的文件而不是复制它们?听起来您正试图绕过修改应用程序包的禁令。如果允许这样做,就会造成巨大的安全漏洞。
-
@WilliamShakespeare 在我的情况下,我想使用硬链接而不是从捆绑包中复制文件,这更慢并且使用额外的磁盘空间。我不想修改包中的任何文件;只读没问题。我会使用符号链接(顺便说一句,我可以很好地创建它),但我们在通过符号链接播放视频时发现了错误。
-
@Michael Melanson 我错过了什么吗?如果您不打算修改文件,为什么不直接从应用程序包中使用它们?
-
@HotLicks 也许我会。但请记住,我也会将赏金奖励给提供“关于为什么这是不可能的权威解释”的人。
标签: ios iphone symlink nsfilemanager hardlink