iosobjective-cios-app-group

App Groups Data Sharing Between Applications iOS


Assuming I have the following app identifier com.test.product1, which is of product1 offering a group id group.com.test.product1.

I am supposed to share a document to another product having com.test.product2 which is of product2 offering groupid group.com.test.product2.

How can I share a common group say like group.com.test.product between all of these applications?


Solution

  • You can store shared data using App Groups, but I've only tried to do this with built in types.

    If you're trying to store your own classes you may need to look at something like NSKeyedArchiver and NSCoding (maybe look here).

    If you can find a way to use the built in types you can use App Groups as follows:

    Sharing NSUserDefaults data between multiple apps

    In order to have shared defaults between an app and an extension or between 2 apps you have to add an App Group in your settings using the following steps:

    1. In the Project Navigator click on the *.xcodeproj file (should be at the top).
    2. To the right of the Project Navigator look for Project and Targets. Under targets click on your primary target (should be the first thing under Targets).
    3. Towards the top, click on the Capabilities tab.
    4. In the App Groups section click the switch to the right to turn App Groups ON.
    5. Click on the + button and add an App Group named group.com.company.myApp.
    6. Go to the same place in your other apps and this group should now be available to select. Turn this group on for each app that will be using this shared data.

    Note: If you go to the Apple Developer Portal (the Apple website that shows all of your Certificates, Identifiers, Devices and Provisioning Profiles) and go to Identifiers > App Groups you should see this new App Group.

    To store data:

    var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
    userDefaults!.setObject("user12345", forKey: "userId")
    userDefaults!.synchronize()
    

    To retrieve data:

    var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
    if let testUserId = userDefaults?.objectForKey("userId") as? String {
      print("User Id: \(testUserId)")
    }