本章內(nèi)容

1. 創(chuàng)建擴(kuò)展

注意:這里的containing application指的是,當(dāng)前的app。
創(chuàng)建完成后將出現(xiàn)下面這個(gè)文件夾,對(duì)應(yīng)的是擴(kuò)展的SB和swift文件。

運(yùn)行模擬器,就可以看到我們創(chuàng)建的Today了:

2. 擴(kuò)展和應(yīng)用之間通信方式一:App Groups
通信原理:利用App Groups這個(gè)媒介,容器app和擴(kuò)展都能訪問它。那么,容器app將數(shù)據(jù)存到App Groups,然后擴(kuò)展從App Groups里面取出數(shù)據(jù),這樣產(chǎn)生通信。
缺點(diǎn):必須加入蘋果開發(fā)者計(jì)劃才能使用該功能
-
激活容器app的App Groups
在target-->capability中選擇如下圖
Paste_Image.png
Paste_Image.png 激活擴(kuò)展的App Groups
操作步驟跟上面一樣,只不過將target選擇對(duì)應(yīng)的擴(kuò)展。容器app將數(shù)據(jù)存入App Groups
//這種初始化方法專門針對(duì)App Groups
//參數(shù)為對(duì)應(yīng)app Groups的名稱
let userDefault = NSUserDefaults(suiteName: "group.Alet")
userDefault?.setObject("深圳", forKey: "city")
userDefault?.synchronize()
- 擴(kuò)展從App Groups里面取出數(shù)據(jù)
let userDefault = NSUserDefaults(suiteName: "group.Alet")
//從App Groups里面獲取數(shù)據(jù)
let cityName: String = userDefault?.objectForKey("city") as! String
//顯示在Today上
city.text = cityName

3. 通信方式二:擴(kuò)展直接調(diào)用容器app的API
優(yōu)點(diǎn):不用加入蘋果開發(fā)者計(jì)劃
原理:將容器app的API用單獨(dú)的文件封裝,使得擴(kuò)展也能使用這些文件里面的API,通過這些API來(lái)獲取數(shù)據(jù)。最好使用framework。
-
創(chuàng)建framework
Paste_Image.png -
將要封裝的swift文件扔進(jìn)framework的文件夾中
Paste_Image.png
這里要封裝的文件是:weatherDataLoad.swift 這個(gè)文件里面包含loadData這個(gè)類,用來(lái)讀取數(shù)據(jù)。
-
將原來(lái)target中compile的文件刪掉
Paste_Image.png -
給framework添加需要編譯的文件
Paste_Image.png -
修改framework中文件的訪問權(quán)限
因?yàn)橐郧暗奈募脑L問權(quán)限默認(rèn)為internal,而要訪問framework中的文件,就要設(shè)置類的訪問權(quán)限。
可以根據(jù)需求,在文件里面對(duì)應(yīng)的類中設(shè)置,如下圖。
Paste_Image.png
Paste_Image.png -
設(shè)置擴(kuò)展能夠使用這個(gè)framework
Paste_Image.png 最后在擴(kuò)展的文件中引用這個(gè)framework包,就能使用對(duì)應(yīng)的類啦!
其實(shí)這樣做的目的是:使得容器app和擴(kuò)展都使用相同的API獲取數(shù)據(jù),但他們之間互不干擾。








