Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Share datas between two apps with iOS 8 App Groups (using NSUserDefaults)

I wonder if we can share datas between apps with the new iOS 8 feature : App groups (using NSUserDefaults) - Or if App Groups only share datas between the main app and its extension?

I actually enabled the App Groups feature on both of the apps that should share datas between them (they belong the same company). They also have the same App Groups thing (like group.com.company.myApp).

Here's the code on the first one (in Swift)

    NSUserDefaults.standardUserDefaults().setBool(true, forKey:"Bool")
    NSUserDefaults.standardUserDefaults().synchronize()

And here's the code on the second one (in Objective-C)

    NSUserDefaults *datas = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.company.myApp"];
    NSLog(@"%@", [datas boolForKey:@"Bool"]);

Sadly, the Bool always returns nil.

If anyone has a solution :)

Thanks

like image 992
FabienP Avatar asked Jun 24 '14 13:06

FabienP


2 Answers

Check out this thread on the Apple Developer Forums: https://devforums.apple.com/message/977151#977151

I believe that both instances need to use the group ID (initializing with initWithSuiteName:) or else they are reading/writing to different user defaults sets.

So your Swift code would change to:

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults.setBool(true, forKey: "Bool")
userDefaults.synchronize()
like image 189
bjtitus Avatar answered Sep 28 '22 07:09

bjtitus


App Groups no longer work in WatchOS2. You must use the watch connectivity Framework.

in your iOS App:

import UIKit
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    if (WCSession.isSupported()) {
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }

    do {
        let applicationDict = ["key" : "value"]
        try WCSession.defaultSession().updateApplicationContext(applicationDict)
    } catch {
        // Handle errors here
    }
}

}

In your Watch OS2 App:

import WatchKit
import WatchConnectivity
import Foundation

class InterfaceController: WKInterfaceController, WCSessionDelegate {

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
    print(applicationContext)
}
like image 35
DavidNorman Avatar answered Sep 28 '22 07:09

DavidNorman