Подтвердить что ты не робот

NSFileManager создает папку (Cocoa ошибка 513.)

Я пытаюсь создать папку внутри папки /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"}

Что я делаю неправильно? Спасибо.

4b9b3361

Ответ 1

Если вы ищете Google в домене ошибок NSCocoaErrorDomain, вы обнаружите, что код 513 преобразуется в ошибку NSFileWriteNoPermissionError.

Это дает вам критический ключ для решения этой проблемы:

Это каталог пакетов, содержащий само приложение. Поскольку приложение должно быть подписано, вы не должны вносить изменения в содержимое этого каталога во время выполнения. Это может помешать запуску вашего приложения позже.

В частности, вы не можете изменять содержимое скомпилированной папки пакета приложений. Это связано с тем, что пакет является скомпилированным приложением.

Когда вы в конечном итоге распространяете приложение через iTunes App Store, приложение имеет цифровую подпись, которая проверяет содержимое приложения. Эта подпись генерируется во время компиляции.

Если вы попытаетесь изменить пакет после компиляции, приложение изменится, и цифровая подпись перестает быть действительной. Это делает недействительным приложение - кто знает, какой код там, не так ли? - и конечные пользователи не смогут его запустить. Итак, Apple настроила iOS, чтобы выбросить ошибку, если вы попытаетесь изменить пакет.

Вместо того, чтобы писать в пакет, ваше приложение может записать в одну из трех принятых папок для приложения: Documents, Temp и Cache. Скорее всего, вы захотите записать в папку Documents.

Эти папки доступны только для вашего приложения. Ни одно другое приложение не может получить доступ к содержимому этих папок. (Аналогично, ваше приложение не может получить доступ к другим папкам приложения.)

Вы можете настроить свое приложение, чтобы конечный пользователь мог управлять доступом к файлам через iTunes через поддержка совместного использования файлов.

Ответ 2

Это связано с тем, что вы никогда не должны изменять пакет своего приложения во время выполнения. Вместо этого у вас должна быть папка в другом месте, где вы можете добавлять ресурсы.

EDIT:
Ошибка, которую вы видите, скорее всего, потому что вы не можете писать в пакет.

Ответ 3

Я сталкиваюсь с той же проблемой при использовании библиотеки журналов. Наконец, это проблема формата пути. Проверьте формат 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 имеет префикс, ex: file://, он недействителен.


Что касается экземпляра NSURL, path вернет строку как Case 1, а absolutePath вернет строку, как Case 2.