Совместное использование данных между двумя приложениями с группами приложений 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)
}