iOS-Widgets小組件-Today Extension和主App的簡單數據共享 本文主要講一下如何用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都停止掉再運行 以上。 最後打個廣告,小弟的iOS視頻教程,進階版也正在製作中: 復昕學堂?m.study.163.com 推薦閱讀: 相关文章 {{#data}} {{title}} {{/data}}