一、背景
最近工作不是特別繁瑣,所以空閑時(shí)間給自己充充電,提升技術(shù)的同時(shí)對(duì)自己的寫(xiě)東西和表達(dá)能力也會(huì)有所加強(qiáng)。WWDC2016 對(duì)于我等屌絲來(lái)說(shuō)也只能遠(yuǎn)觀之,所以在介紹 Today Widget 之前先來(lái)簡(jiǎn)單聊聊WWDC的 xcode8 ios10。
二、xcode8 ios10
xcode
1.View Debugging 可以幫助我們查找內(nèi)存問(wèn)題
2.自動(dòng)匹配證書(shū)描述文件這塊做了很大的改進(jìn)
3.兼容了swift3的改進(jìn),swift3改變很大(學(xué)習(xí)中)
...
ios10
1.SiriKit
2.User Notifications
3.iMessage Apps
...
三、Extension
2014年ios8發(fā)布以來(lái)對(duì)于擴(kuò)展(Extension)一直在更新,現(xiàn)在到ios10也增加了很多不同擴(kuò)展。蘋(píng)果也是在慢慢對(duì)開(kāi)發(fā)者放開(kāi)權(quán)限,下面就來(lái)介紹一個(gè)Today Widget
四、Today Widget
ios10 對(duì)Today Widget做了一些功能更新,更新如下
- 鎖屏下拉通知欄左滑可以看到我們的Widget,在Widget的右上角有一個(gè)“展開(kāi)”、“折疊”的功能
- 在支持3D Touch的蘋(píng)果手機(jī)上,長(zhǎng)按可以彈出折疊后的Widget
廢話少說(shuō)下面開(kāi)始我們的工作
環(huán)境: xcode8 iOS10 swift
步驟一:創(chuàng)建Today Widget
-
在我們已有的工程里面創(chuàng)建(demo:在文章的最下面有g(shù)ithub連接 SwiftTodayWidget) File->New->Target->Today Widget
Today Widget.png
步驟二:創(chuàng)建支持?jǐn)?shù)據(jù)共享的App Groups
- 在我們的開(kāi)發(fā)者賬號(hào)中找到App Groups創(chuàng)建id:group.com.tyjy.SwiftTodayWidget
groups.png
步驟三:創(chuàng)建應(yīng)用
- 主應(yīng)用:com.tyjy.SwiftTodayWidget
- 擴(kuò)展:com.tyjy.SwiftTodayWidget.SwiftTodayWidgetExt
重要:主應(yīng)用和擴(kuò)展相當(dāng)于兩個(gè)獨(dú)立的應(yīng)用,發(fā)布到AppStore要用兩個(gè)不同的Bundle Identifier、兩個(gè)不同的描述文件

步驟四:打開(kāi)App Groups
- 在主程序和擴(kuò)展中都得打開(kāi)App Groups,同事勾選步驟二創(chuàng)建的group.com.tyjy.SwiftTodayWidget

步驟五:共享數(shù)據(jù)
- 主程序?qū)懭霐?shù)據(jù)
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
userDef!.set(self.txtNumber.text, forKey: "numberValue");
userDef?.synchronize();
self.lbNumber.text = self.txtNumber.text!;
- 擴(kuò)展顯示
//獲取共享值
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
self.lbNumber.text = String(userDef!.value(forKey: "numberValue")!);
userDef?.synchronize();
步驟六:展開(kāi)、折疊功能
@IBOutlet weak var lbNumber: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//設(shè)置展開(kāi)與收縮
self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded;
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100);
//獲取共享值
let userDef = UserDefaults.init(suiteName: "group.com.tyjy.SwiftTodayWidget");
self.lbNumber.text = String(userDef!.value(forKey: "numberValue")!);
userDef?.synchronize();
}
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == NCWidgetDisplayMode.compact {
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100);
}else{
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 200);
}
}
步驟七:擴(kuò)展喚醒主程序
擴(kuò)展可以喚醒到主程序的不同頁(yè)面,在喚醒過(guò)程中擴(kuò)展可以傳值到主程序,這里就不介紹了,主要是在主程序plist里面添加如下:

總結(jié):
1.如果在共享數(shù)據(jù)擴(kuò)展沒(méi)有及時(shí)更新的時(shí)候,我們手動(dòng)關(guān)掉擴(kuò)展再打開(kāi)就解決了
2.證書(shū)這塊xcode8可以自動(dòng)為我們創(chuàng)建很多東西,不用我們手動(dòng)創(chuàng)建了,重復(fù):發(fā)布到AppStore必須是不同的bundle id 和描述文件
3.demo源碼:https://github.com/wudanfeng/SwiftTodayWidget.git
4.為了方便demo的圖片、名字和證書(shū)都用的公司的一個(gè)項(xiàng)目

