我正在尝试在我的应用程序的/ sounds文件夹中创建一个文件夹。
-(void)productPurchased:(UAProduct*) product {
NSLog(@"[StoreFrontDelegate] Purchased: %@ -- %@", product.productIdentifier, product.title);
NSFileManager *manager = [NSFileManager defaultManager];
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSError *error;
NSString *dataPath = [NSString stringWithFormat:@"%@/sounds/%@", bundleRoot, product.title];
if (![manager fileExistsAtPath:dataPath isDirectory:YES]) {
[manager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"Creating folder");
}
NSLog(@"%@", error);
}
但是我收到了这个错误:
Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x175120 {NSFilePath=/var/mobile/Applications/D83FDFF9-2600-4056-9047-05F82633A2E4/App.app/sounds/Test Tones, NSUnderlyingError=0x117520 "The operation couldn’t be completed. Operation not permitted"}
我做错了什么? 感谢。
答案 0 :(得分:47)
如果您在错误域NSCocoaErrorDomain
上搜索Google,则会发现代码513
会转换为错误NSFileWriteNoPermissionError
。
这为您提供了解决此问题的关键线索:
具体来说,您无法修改已编译应用程序的文件夹文件夹的内容。这是因为bundle是已编译的应用程序。
当您最终通过iTunes App Store分发应用程序时,该应用程序具有验证应用程序内容的数字签名。此签名在编译时生成。
如果您尝试在编译后更改捆绑包,则应用程序会更改,并且数字签名不再有效。这使应用程序无效 - 谁知道那里有什么代码,对吧? - 最终用户将无法运行它。因此,如果您尝试修改捆绑包,Apple已设置iOS以引发错误。
您的应用可以写入one of three accepted app-specific folders:Documents
,Temp
和Cache
,而不是写入套装。最有可能的是,您需要写入Documents
文件夹。
这些文件夹只能供您的应用访问。没有其他应用可以访问这些文件夹的内容。 (同样,您的应用无法访问其他应用的文件夹。)
您可以设置应用以允许最终用户通过iTunes管理对文件数据的访问,desktop file sharing support。
答案 1 :(得分:6)
这是因为您不应该在运行时修改应用程序包。相反,您应该在其他位置添加资源。
编辑:
您看到的错误很可能是因为您无法写入捆绑包。
答案 2 :(得分:4)
使用 Log 库时遇到同样的问题。最后,它是路径格式问题。检查dataPath
格式。如果是Case 1
,则有效。就我而言,它是Case 2
,所以我无法创建目录。
// Case 1
/var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
// Case 2, invalid format
file://var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
如果dataPath
有前缀,例如:file://
,则无效。
对于NSURL
的实例,path
将返回类似case 1
的字符串,而absolutePath
将返回类似case 2
的字符串。
答案 3 :(得分:0)
在我的情况下,我仍然不太清楚513错误的含义,但是当我尝试使用[NSFileHandle fileHandleForReadingFromURL:theUrl error:&err ]
读取打开的文件URL时,我得到了它。
我从this answer意识到,在iOS 13上,我现在需要使用startAccessingSecurityScopedResource
来访问在应用程序中打开的外部文件。当我按如下方式包装文件调用时,错误513不再发生:
if( [myURL startAccessingSecurityScopedResource] )
{
NSFileHandle* myFile = [NSFileHandle fileHandleForReadingFromURL:myURL error:&err ];
// ...Do file reads here...
[theUrl stopAccessingSecurityScopedResource];
}