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

これにより、この問題を解決するための重要な手がかりが得られます。

これは、アプリケーション自体を含むバンドルディレクトリです。アプリケーションは署名されている必要があるため、実行時にこのディレクトリの内容を変更しないでください。これを行うと、アプリケーションが後で起動できなくなる可能性があります。

具体的には、コンパイルされたアプリのバンドルフォルダーの内容を変更することはできません。これは、バンドルがコンパイル済みアプリケーションであるためです。

最終的にiTunesAppStoreを通じてアプリを配布すると、アプリケーションにはアプリのコンテンツを検証するデジタル署名が付けられます。この署名はコンパイル時に生成されます。

コンパイル後にバンドルを変更しようとすると、アプリが変更され、デジタル署名が無効になります。これはアプリケーションを無効にします—そこにどんなコードがあるか誰が知っていますか?—そのため、Appleは、アプリケーションを変更しようとするとエラーをスローするようにiOSを設定しました。

バンドルに書き込む代わりに、アプリは3つの受け入れられたアプリ固有のフォルダーの1つに書き込むことができます:<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のような文字列を返しcase 1absolutePathのような文字列を返しますcase 2

于 2016-05-20T03:47:55.133 に答える
0

私の場合、513エラーの意味はまだ完全にはわかりませんが、を使用して開いたファイルのURLを読み取ろうとしたときにエラーが発生していました[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 に答える