views:

375

answers:

2

Hello everyone,

I'm trying to create a folder inside the /sounds folder of my app.

-(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);
}

But I get this 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"}

What am I doing wrong? Thanks.

+4  A: 

This is because you should never modify the bundle of your application at runtime. Instead, you should have a folder elsewhere where you can add resources.

EDIT:
The error you are seeing is most likely because you cannot write to the bundle.

jrtc27
+1 As part of the iOS security model, you cannot modify the app bundle after the app has been compiled. This prevents the possibility of malware modifying apps after install. Files generated at runtime should be saved to the either the Documents folder of the Library folder in the app's directory. The latter is preferred for files the user will never access by any means other than the app itself.
TechZen
+3  A: 

If you search Google on the error domain NSCocoaErrorDomain you find that the code 513 translates to the error NSFileWriteNoPermissionError.

This provides you with the critical clue for solving this problem:

This is the bundle directory containing the application itself. Because an application must be signed, you must not make changes to the contents of this directory at runtime. Doing so may prevent your application from launching later.

Specifically, you cannot modify the contents of a compiled app's bundle folder. This is because the bundle is the compiled application.

When you eventually distribute the app through the iTunes App Store, the application has a digital signature that validates the contents of the app. This signature is generated at compile time.

If you try to change the bundle after compilation, the app changes and the digital signature is no longer valid. This would break your app for end users, when run on the device. So Apple has set up iOS to throw an error if you try to modify the bundle.

Instead of writing to the bundle, you can write to one of three accepted app-specific folders: Documents, Temp and Cache. Most likely, you will want to write to the Documents folder.

These folders are only accessible to the app. No other app can access the contents of these folders. You can set up your app to allow the end user to access file data through iTunes, via desktop file sharing support.

Alex Reynolds