本文主要講一下如何用userdefaults在Today Extension和主App間傳一些簡單資料,傳複雜資料的話需要用到資料庫,其實大同小異。
眾所周知,iOS有沙盒機制,不同App之間無法直接共享資料,Today Extension和主App之間其實就是不同App的關係,所以也無法通過userdefaults.standard來傳資料,蘋果為了在不打破沙盒的前提下能夠傳資料,就想出了App Group的方法。
也就是說只要是屬於一個組的App,就能互相傳資料。
先跟著下圖走,新增一下today的小元件:
選Toady Extension,取個名字,我們這裡是MyToady
找到主App的Target的Capabilities,把App Groups設為ON
點加號建立一個組,彈出框讓我們給這個組取個名字,名字要求是唯一的,所以一般用group+bundle ID就好了
同樣找到Toady的Target的App Group這裡,選ON,等待幾秒鐘,就會出現剛剛我們在主App那裡建立的App Group,選中這個組。
最後在主App的storyboard上弄一個label,用來待會把裡面的文字傳給Toady
準備工作完畢,上程式碼
ViewController:
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")
}
}
複製程式碼
TodayViewController:
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)
}
}
複製程式碼
執行的時候記得選中的是主App
效果:
總結注意點:
1.App Group名字要唯一
2.主App和Toady的App Group都要ON,並且選中同一個組
3.注意產生資料的先後順序,別先取再存,等
4.資料的存和取都要在能夠執行的程式碼塊裡面,不要像IBOutlet那樣野在外面
5.執行後出現紫色carsh的話,先把主App和Toady都停止掉再執行
以上。