iOS-Widgets小組件-Today Extension和主App之間的簡單數據共享

本文主要講一下如何用userdefaults在Today Extension和主App間傳一些簡單數據,傳複雜數據的話須要用到數據庫,其實大同小異。數據庫

衆所周知,iOS有沙盒機制,不一樣App之間沒法直接共享數據,Today Extension和主App之間其實就是不一樣App的關係,因此也沒法經過userdefaults.standard來傳數據,蘋果爲了在不打破沙盒的前提下可以傳數據,就想出了App Group的方法。api

也就是說只要是屬於一個組的App,就能互相傳數據。bash

先跟着下圖走,添加一下today的小組件:

屏幕快照 2019-04-24 下午2.48.36.png

選Toady Extension,取個名字,咱們這裏是MyToady

屏幕快照 2019-04-24 下午2.48.54.png

找到主App的Target的Capabilities,把App Groups設爲ON

屏幕快照 2019-04-24 下午2.55.09.png

點加號建立一個組,彈出框讓咱們給這個組取個名字,名字要求是惟一的,因此通常用group+bundle ID就行了

屏幕快照 2019-04-24 下午2.55.22.png

一樣找到Toady的Target的App Group這裏,選ON,等待幾秒鐘,就會出現剛剛咱們在主App那裏建立的App Group,選中這個組。

屏幕快照 2019-04-24 下午2.55.58.png

最後在主App的storyboard上弄一個label,用來待會把裏面的文本傳給Toady

屏幕快照 2019-04-24 下午3.40.05.png

準備工做完畢,上代碼

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

屏幕快照 2019-04-24 下午3.46.10.png

效果:

屏幕快照 2019-04-24 下午3.47.31.png

總結注意點:

1.App Group名字要惟一app

2.主App和Toady的App Group都要ON,而且選中同一個組ide

3.注意產生數據的前後順序,別先取再存,等ui

4.數據的存和取都要在可以執行的代碼塊裏面,不要像IBOutlet那樣野在外面spa

5.運行後出現紫色carsh的話,先把主App和Toady都中止掉再運行3d

以上。code

最後打個廣告,小弟的iOS視頻教程,進階版也正在製做中:

m.study.163.com/provider/48…orm

相關文章
相關標籤/搜索