Папка создания NSFileManager (ошибка Какао 513.) - PullRequest
20 голосов
/ 09 августа 2010

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

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

Ответы [ 3 ]

47 голосов
/ 09 августа 2010

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

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

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

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

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

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

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

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

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

6 голосов
/ 09 августа 2010

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

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

4 голосов
/ 20 мая 2016

Я сталкиваюсь с той же проблемой, когда использую библиотеку 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.

...