微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以创建iOS应用程序包中文件的硬链接?

为了节省与我的iOS应用程序相关的服务器端带宽成本,我已经打包了一堆资产,否则这些资产可以在运行时下载到我的iOS应用程序包中.在编写应用程序的上下文中,如果我可以从用户可写目录之一(例如[App Dir] / Library / Application Support / My Custom Subfolder /)访问文件而不必复制直接在运行时存档(例如,在启动时,首次运行,等等).

虽然我已经能够使用NSFileManager API createSymbolicLinkAtURL:withDestinationURL:error:在… / My Custom Subfolder / bundle中的文件中成功创建符号链接,然后我使用一些框架API来访问内容get getofof up并返回有关符号链接而不是底层文件属性和数据.我可以通过利用一些其他框架API来缓解这些问题,但根据不正确的用法的范围,它可能最终会有很多工作.

在模拟器上,我能够通过使用NSFileManager API linkItemAtURL创建到内容的硬链接来成功避免这个问题:toURL:error:.硬链接适用于整个应用程序中使用的所有文件访问API,一切都很好.然而,在DEVICE上(在运行iOS 7.0.2的iPhone 5c和运行iOS 7.1的iPad上测试),我会收到NSCocoaErrorDomain 513错误(操作无法完成.操作不允许.).我可以在… /我的自定义文件夹/中创建一个测试文件并在同一个文件夹中创建一个链接就好了,但如果我尝试硬连接到只读应用程序包中的任何内容,我会得到513错误.

有谁知道是否有办法绕过权限错误,以完成我正在尝试做的事情?

解决方法

你根本无法绕过这个错误,我很确定.我没有找到任何正式的文档 – 但有几个教程解释了如何允许在越狱设备上使用符号链接.我没理由为什么iOS上的安全性与硬链接有所不同.在模拟器中,这是有效的,因为它在本地机器上的路径上运行(在〜/ Library / Application Support / iphone Simulator / iOsversion / Applications / …中)并具有本地安全性.作为一个反例,我不止一次地想到我在模拟器中工作的东西在设备上不起作用,反之亦然(例如当试图用sqlITE_WRITE标志打开主捆绑中的sqlite3 db时) .

我通过使用两个不同的文件位置解决了我的应用中的资源管理/版本控制问题.原始版本像往常一样在主包内.另一个位置是缓存目录或文档目录.然后我使用自定义资源处理程序返回提供的相对路径的完整路径.它的工作原理如下:

>如果可写dir中存在相对路径,则返回此路径.这应该是所请求的相对文件路径的更新版本
>如果上一次检查失败,请在主捆绑目录中查找,以从应用程序的主捆绑包中返回原始版本

一些代码(使用缓存目录作为可更新目录,您可能想要更改它):

#define UpdateableCacheResourcePath(path) \
[[ResourceHandler sharedManager] updateableCacheResourcePath:path]

- (Nsstring*)updateableCacheResourcePath:(Nsstring *)path
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
    Nsstring *_libraryCacheStorageDir = [[paths objectAtIndex:0] copy];
    Nsstring *updateablePath = [_libraryCacheStorageDir stringByAppendingPathComponent:path];
    // Cache Dir
    if ([_fileManager fileExistsAtPath:updateablePath]) {
        return updateablePath;
    }

    // mainBundle
    Nsstring *mainbundleResourcePath = [_mainBundlePath stringByAppendingPathComponent:path];
    if ([_fileManager fileExistsAtPath:mainbundleResourcePath]) {
        return mainbundleResourcePath;
    }

    NSLog(@"File not found: %@",path);
    return nil;
}

在您的代码中,您将使用UpdateableCacheResourcePath(“some.file”)而不是查看主包.它也适用于refrenced文件夹(拖放文件夹到xcode并选择创建引用而不是组).然后,您可以引用父文件夹的相对路径(如advertisements / adbanner.png).

唯一的缺点是,如果你有网页内容,你需要更新你的html网站引用的所有文件,原因显而易见(网页浏览器只能跟随html文档所在文件夹的相对路径).

原文地址:https://www.jb51.cc/iOS/333990.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐