24

我正在尝试在我的应用程序的 /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"}

我究竟做错了什么?谢谢。

4

4 回答 4

55

如果您在错误域上搜索 Google,NSCocoaErrorDomain您会发现代码513转换为错误NSFileWriteNoPermissionError

这为您提供了解决此问题的关键线索:

这是包含应用程序本身的捆绑目录。由于必须对应用程序进行签名,因此您不得在运行时更改此目录的内容。这样做可能会阻止您的应用程序稍后启动。

具体来说,您不能修改已编译应用程序包文件夹的内容。这是因为捆绑包是已编译的应用程序。

当您最终通过 iTunes App Store 分发该应用程序时,该应用程序具有验证该应用程序内容的数字签名。此签名在编译时生成。

如果您在编译后尝试更改捆绑包,则应用程序会更改并且数字签名不再有效。这会使应用程序无效——谁知道里面有什么代码,对吧?— 因此,Apple 已将 iOS 设置为在您尝试修改应用程序时抛出错误。

您的应用程序可以写入三个已接受的应用程序特定文件夹之一,<Application_Home>/Documents而不是写入包:<Application_Home>/tmp<Application_Home>/Library/Caches.

最有可能的是,您将要写入该<Application_Home>/Documents文件夹。

这些文件夹只能由您的应用访问。没有其他应用程序可以访问这些文件夹的内容。(同样,您的应用无法访问其他应用的文件夹。)

您可以设置您的应用程序以允许最终用户通过桌面文件共享支持通过 iTunes 管理对文件数据的访问。

于 2010-08-09T12:31:14.377 回答
7

这是因为您不应该在运行时修改应用程序的捆绑包。相反,您应该在其他地方有一个文件夹,您可以在其中添加资源。

编辑:
您看到的错误很可能是因为您无法写入包。

于 2010-08-09T11:13:47.107 回答
4

使用日志库时,我遇到了同样的问题。最后是路径格式问题。检查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://,则无效


至于 的实例NSURLpath将返回字符串 like case 1absolutePath并将返回字符串 like case 2

于 2016-05-20T03:47:55.133 回答
0

在我的案例中,我仍然不完全清楚 513 错误的含义,但是当我尝试使用[NSFileHandle fileHandleForReadingFromURL:theUrl error:&err ].

我从这个答案中意识到,在 iOS 13 中,我现在需要使用startAccessingSecurityScopedResource来访问在应用程序中打开的外部文件。当我按如下方式包装文件调用时,错误 513 停止发生:

if( [myURL startAccessingSecurityScopedResource] ) 
{
    NSFileHandle* myFile = [NSFileHandle fileHandleForReadingFromURL:myURL error:&err ];
    // ...Do file reads here...
    [theUrl stopAccessingSecurityScopedResource];
}
于 2020-03-02T13:07:52.230 回答