虽然我已经能够使用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错误.
有谁知道是否有办法绕过权限错误,以完成我正在尝试做的事情?
解决方法
我通过使用两个不同的文件位置解决了我的应用中的资源管理/版本控制问题.原始版本像往常一样在主包内.另一个位置是缓存目录或文档目录.然后我使用自定义资源处理程序返回提供的相对路径的完整路径.它的工作原理如下:
>如果可写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文档所在文件夹的相对路径).