本文主要讲一下如何用userdefaults在Today Extension和主App间传一些简单数据,传复杂数据的话须要用到数据库,其实大同小异。数据库
众所周知,iOS有沙盒机制,不一样App之间没法直接共享数据,Today Extension和主App之间其实就是不一样App的关系,因此也没法经过userdefaults.standard来传数据,苹果为了在不打破沙盒的前提下可以传数据,就想出了App Group的方法。api
也就是说只要是属于一个组的App,就能互相传数据。bash
class ViewController: UIViewController {
//主App上的label
@IBOutlet weak var hostData: UILabel!
//建立一个userdefaults用来共享简单数据(以后的用法和UserDefaults.standard同样)
//这里的name就是刚刚咱们建立的App Group的名字
let sharedDefaults = UserDefaults(suiteName: "group.com.rongcosme.TodayTest")
//根据业务逻辑在合适的地方把主App的数据存进sharedDefaults,这里为了演示方便就放在viewDidAppear里
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
sharedDefaults?.set(hostData.text!, forKey: "sharedData")
}
}
复制代码
class TodayViewController: UIViewController, NCWidgetProviding {
//today小组件上的label,用于显示主App传过来的数据
@IBOutlet weak var todayData: UILabel!
//一样是建立一个userdefaults
let sharedDefaults = UserDefaults(suiteName: "group.com.rongcosme.TodayTest")
//通常是在willappear里面,把主App放在UserDefaults里的数据取出来
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//这里共享的是string类型的数据,就用string方法
todayData.text = sharedDefaults?.string(forKey: "sharedData")
}
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
completionHandler(NCUpdateResult.newData)
}
}
复制代码
1.App Group名字要惟一app
2.主App和Toady的App Group都要ON,而且选中同一个组ide
3.注意产生数据的前后顺序,别先取再存,等ui
4.数据的存和取都要在可以执行的代码块里面,不要像IBOutlet那样野在外面spa
5.运行后出现紫色carsh的话,先把主App和Toady都中止掉再运行3d
以上。code