Совместное использование данных между двумя приложениями с группами приложений iOS 8 (с использованием NSUserDefaults)

Интересно, можем ли мы делиться данными между приложениями с новой функцией iOS 8: группы приложений (с использованием NSUserDefaults). Или, если группы приложений разделяют только данные между основным приложением и его расширением?

Я фактически включил функцию групп приложений в обоих приложениях, которые должны делиться данными между ними (они принадлежат одной и той же компании). Они также имеют одну и ту же группу приложений (например, group.com.company.myApp).

Здесь код на первом (в Swift)

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

И вот код на втором (в Objective-C)

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

К сожалению, Bool всегда возвращает ноль.

Если у кого есть решение:)

Спасибо

Ответ 1

Ознакомьтесь с этой веткой на форумах разработчиков Apple: https://devforums.apple.com/message/977151#977151

Я считаю, что оба экземпляра должны использовать идентификатор группы (инициализация с помощью initWithSuiteName:), либо они читают/записывают разные наборы пользовательских настроек по умолчанию.

Таким образом, ваш код Swift изменится на:

var userDefaults = NSUserDefaults(suiteName: "group.com.company.myApp")
userDefaults.setBool(true, forKey: "Bool")
userDefaults.synchronize()

Ответ 2

Группы приложений больше не работают в WatchOS2. Вы должны использовать структуру подключения часов.

в приложении iOS:

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
    }
}

}

В приложении Watch OS2:

import WatchKit
import WatchConnectivity
import Foundation

class InterfaceController: WKInterfaceController, WCSessionDelegate {

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
    print(applicationContext)
}