Sagi
Sagi

Reputation: 1159

How to export shared container of an iOS App with Xcode6.2?

In our iOS app we utilize a shared container to share files between our main iOS app and its extension (specifically WatchKit Extension), using [NSFileManager containerURLForSecurityApplicationGroupIdentifier:] method. For debugging purposes we need to access the content of this shared container, so we've tried to export the whole App container using the Devices window in Xcode:

Screenshot from Xcode

But, the Shared storage is not included in the container, probably because it sits in a different path on the Device itself.

The question is how can we get the shared container, if this is even possible?

Upvotes: 20

Views: 4989

Answers (7)

TiredMagicalCoder
TiredMagicalCoder

Reputation: 67

Updated Sandy's response to swift in lldb and usage of appGroup

(lldb) po FileManager.default.copyItem(at: FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.name")!.appendingPathComponent("filename"), 
to: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!.appendingPathComponent("filename"))

Another thing is that you may need to remove file from the app folder if it's been copied before otherwise the command above will fail

Upvotes: 0

Dmih
Dmih

Reputation: 636

For Swift 4 - 5 add this to applicationDidEnterBackground(_ application: UIApplication)

var appGroupIdentifier = "XXXXXXX"
let fromURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier)
let docURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let toURL = docURL.appendingPathComponent(appGroupIdentifier)
try? FileManager.default.removeItem(at: toURL)
try? FileManager.default.copyItem(at: fromURL, to: toURL)

Then download the app container using xcode.

Upvotes: 7

Sandy
Sandy

Reputation: 3131

Workaround for actual device -

I generally pause the execution of my app and then run following command in lldb debugger to copy the desired file from shared container to my sandbox container and then I download the container from Xcode.

po [[NSFileManager defaultManager] copyItemAtPath:[[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:GROUP_NAME] URLByAppendingPathComponent:FILE_NAME].path toPath:[[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:FILE_NAME] path] error:nil]

Above might look complex but if you break the above, we are doing 3 things -

  1. Get shared container file

    [[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:GROUP_NAME] URLByAppendingPathComponent:FILE_NAME].path

  2. Get sandbox document directory path:

    [[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:FILE_NAME] path]

  3. Copy file from Shared container to sandbox

    [[NSFileManager defaultManager] copyItemAtPath:SHARED_PATH toPath:SANDBOX_PATH error:nil]

Upvotes: 6

Vishun
Vishun

Reputation: 132

Copy your data from the group container to document directory. Then download the app container using xcode.

NSFileManager.defaultManager().copyItemAtURL(url, toURL: NSURL.fileURLWithPath(AppDelegate.applicationUserDirectory()))

url here can be obtained using below function of NSFileManager

func containerURL(forSecurityApplicationGroupIdentifier groupIdentifier: String) -> URL?

Upvotes: 1

Brian Gerstle
Brian Gerstle

Reputation: 3653

I've been told by Xcode team members at WWDC that this is not possible (at time of writing, Xcode 7.3 & 8 beta 1). I've filed a radar, which I recommend everyone dupe or comment on so we can get this functionality.

Upvotes: 9

Nekto
Nekto

Reputation: 17877

The best solution I've found is creating a backup of your device and then using iExplorer to explore the backup. There are bunch of AppDomainGroup-* folders. Though for some reason not all of the files there are backed up (probably because of applied settings to files to be ignored during backup).

Upvotes: 0

BalestraPatrick
BalestraPatrick

Reputation: 10144

I'm using this code to print out in the console the path to my local SQLite database:

NSString *groupContainer = [[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.myapp.mycontainer"] path];
NSString *sqlitePath = [NSString stringWithFormat:@"%@/Database.sqlite", groupContainer];
NSURL *url = [NSURL fileURLWithPath:sqlitePath];

I then copy and paste the string in the Finder -> Go to so I go directly to the folder. This works fine in the Simulator but I don't think you're able to access the your iPhone's shared container group from your Mac.

Upvotes: 1

Related Questions