Andrew
Andrew

Reputation: 16051

Path to mobile documents folder?

To get to my application documents folder, I use this code:

[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

I want to access this folder, however:

~/Library/Mobile Documents

How can i easily access this as a path value? Can I do this in a similar way?

Upvotes: 0

Views: 1102

Answers (3)

user1531352
user1531352

Reputation:

In my recent macOS app I had the same need: how to gain access to the root folder of your iCloud directory.

IMPORTANT! This is written for an unsandboxed version, since the app is only intended for myself. If you plan to release an app on the Mac App Store, do not turn off sandboxed version.

  1. I turn off sandbox in the app's entitlements file.
  2. This code will access your iCloud root folder:

    let pathToiCloudFolder = NSString(string: "com~apple~CloudDocs").expandingTildeInPath
    
    let backUpFolderUrl = FileManager.default.urls(for: .libraryDirectory, in:.userDomainMask).first!
    let backupUrl = backUpFolderUrl.appendingPathComponent("Mobile Documents/" + pathToiCloudFolder)
    
    print("Backup Folder:", backupUrl)
    

Upvotes: 0

Tom Andersen
Tom Andersen

Reputation: 7200

Mobile Documents are iCloud documents. So you want to store documents in iCloud.

On OS X they are definitely in ~/Library/Mobile Documents (10.7 and 10.8), but on iOS you should not look.

 "All documents of an application are stored either in the local sandbox or in an iCloud container directory."...

  "A user should not be able to select individual documents for storage in iCloud. "

http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/DocumentBasedAppPGiOS/ManageDocumentLifeCycle/ManageDocumentLifeCycle.html

So if your user picks iCloud then you should use iCloud.

How long the iCloud document model will last is anyones guess, but that's the way it works today. The whole thing seems a masterpiece of poor UI design, as this direct answer to your question shows:

 -(NSURL*)ubiquitousContainerURL {

     return [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];

 } 

Upvotes: 1

rickerbh
rickerbh

Reputation: 9911

The benefit of using the constants to access system provided directories is that if Apple decide to change the structure, your application will still work. Hardcoding in something like ~/Library/Mobile Documents is brittle.

However, you can access the Library directory with the same NSSearchPathForDirectoriesInDomain with the NSLibraryDirectory constant. Then, you should just append the Mobile Documents directory path.

// Set the NO to YES to get the full path, not the ~ version.
NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) lastObject]; 
path = [path stringByAppendingPathComponent:@"Mobile Documents"];

Looking at the constant values in http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html#//apple_ref/doc/c_ref/NSSearchPathDirectory, it appears there is no specific constant for the Mobile Documents directory, so the hardcoding approach might be your only option.

Upvotes: 1

Related Questions