从主机应用程序Swift数据到今天的小部件

时间:2016-06-30 01:19:48

标签: ios xcode swift today-extension

请帮忙。 如何将数据从主机应用程序传输到窗口小部件?我在应用程序和小部件中使用框架中的相同功能。应用程序接收数据,窗口小部件返回一个空数组。

public func readLED() -> [LEDController] {
let defaults = UserDefaults.standard()

if let saved = defaults.object(forKey: "ledControllers") as? NSData {
    return (NSKeyedUnarchiver.unarchiveObject(with: saved as Data) as! [LEDController])
}
return []

}

2 个答案:

答案 0 :(得分:1)

我为自己的英语水平道歉。

要在apphost和小部件之间共享数据,您应该保存这样的userDefault数据,例如在静态类中:

class UserDefaultDataHelper: NSObject {
    static func saveKeyToGroupApp(_ value: AnyObject?, withKey key:String) -> Void {
        UserDefaults(suiteName: "group.com.test")!.set(value, forKey: key)
        UserDefaults(suiteName: "group.com.test")!.synchronize()
    }

    //and to read values 

    static func loadKeyToGroupApp(_ key:String)  -> AnyObject? {
        if let loadedValue = UserDefaults(suiteName: "group.com.test")?.object(forKey: key){
            return loadedValue as AnyObject?
        }
        return nil
    }
}

并使用:

let ledcontrollerdata = UserDefaultDataHelper.loadKeyToGroupApp("ledControllers")

UserDefaultDataHelper.saveKey(yourData as AnyObject?, withKey: "ledControllers")

只保存这样的数据,您应该从多个应用程序,小部件等共享相同的数据,但前提是这些数据位于" App Groups"使用Bundle ID组。您应该在group.com.test中使用此Bundle ID组,并且两个项目都应具有各自的权利,并且都在功能中配置目标 - > AppGroups,选择您的AppGroupDomain。

答案 1 :(得分:0)

您无法使用UserDefaults.standard()在包含的应用和扩展程序之间共享数据。

来自Apple

  

即使应用扩展程序包嵌套在其包含内   应用程序包,正在运行的应用程序扩展和包含应用程序没有   直接访问彼此的容器。

...所以

  

要启用数据共享,请使用Xcode或Developer门户启用   包含应用及其包含的应用扩展程序的应用组。