如何使用NSUserDefaults与包含应用程序共享数据? - 今日Extension Widget

时间:2016-03-11 22:40:00

标签: ios arrays swift nsuserdefaults today-extension

我正在尝试创建一个 Today Extension Widget ,它在窗口小部件中显示存储的数据。

这是我所做的;

  • 添加了新的今日小工具目标
  • 为小部件设置UIViewController
  • 为应用和扩展程序启用应用组

现在我遇到了障碍,我不确定检索和显示简单的获取数据数组的最佳方法。

Swift教程非常少,他们通常不使用核心数据。

在主应用程序项目中,我获取数组。

 let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
 let request = NSFetchRequest(entityName: "Objects")
    do {
      try
      self.objectsArray = moc.executeFetchRequest(request) as! [Objects]
    } catch {

    }

如何使用NSUserDefaults存储对象数组,然后在今日的小部件扩展中使用?或者甚至是一串字符串值。

2 个答案:

答案 0 :(得分:2)

1)获取数据库的URL

var containerPath: String = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier‌​(YOUR_SECURITY_APP_GROUP).path 

var sqlitePath: String = "(containerPath)/("database.sqlite")"

2)像在父应用程序中一样创建持久性商店协调员。

3)为您的托管对象上下文设置它

context = NSManagedObjectContext()
context.persistentStoreCoordinator = coordinator

4)像在父应用中一样检索对象

let moc = context
let request = NSFetchRequest(entityName: "Objects")
do {
  try self.objectsArray = moc.executeFetchRequest(request) as! [Objects]
} catch {}

答案 1 :(得分:0)

如果您设置应用程序组正确并为应用程序和扩展程序添加了相同的组,则可以使用NSUserDefaults。例如,要从应用程序中编写内容,您需要:

static func setSharedScoreNumber(score: Int) {
    let defaults = UserDefaults(suiteName: "group.bubblewrapSharedDefaults") // this is the name of the group we added in "App Groups"
    defaults?.set(String(score), forKey: "score")
    defaults?.synchronize()
}

并阅读今日推广:

private func getScore() -> String {
    let defaults = UserDefaults(suiteName: "group.bubblewrapSharedDefaults")
    defaults?.synchronize()
    return String(describing: defaults!.object(forKey: "score") ?? "0")
}

以下是complete guide如何操作。