最近玩手機(jī)發(fā)現(xiàn)了widget這個app外的控件還是蠻有意思的,于是在上網(wǎng)查了一下資料,是iOS 8的系統(tǒng)開始開放的一個快捷顯示操作功能,這個功能彌補(bǔ)了沒有3D touch功能的iPhone。雖然網(wǎng)上百度可以查看到很相關(guān)的開發(fā)資料,但是我發(fā)現(xiàn)基本上都是Objective-C的例子,關(guān)于Swift開發(fā)的我僅僅只是看到了一篇(可能有一些我沒看到),主要是都不夠詳細(xì),作為一個新手的我,也為了讓新手們少爬一些坑,我將詳細(xì)為大家講解如何玩轉(zhuǎn)這個widget功能。附上圖片

開發(fā)環(huán)境:Xcode 8.2.1
開發(fā)語言:Swift 3.0(以上)
1.第一步:如何創(chuàng)建widget
如何創(chuàng)建?在網(wǎng)上有已經(jīng)有很多了,這里我還是給大家截圖一下:


選擇Today Extension ,點擊Next ,項目中就會自動創(chuàng)建一個如下圖所示的文件夾:

(這里的swiftWidget文件夾是我自己命名的)

里面有一個TodayViewController.swift、MainInterface.storyboard和Info.plist文件(里面的image的兩個文件夾是我后來放的圖片)
到這里就創(chuàng)建完成了!可以運(yùn)行下看看效果(建議真機(jī)上運(yùn)行效果更加)
2.第二步:界面UI布局
widget的UI布局,一般來講以iOS 10為分界線,iOS 10和10以上是一種,iOS 8至iOS 10(不包含iOS 10)又是一種,如下圖:


主要是背景的不同,雖然widget也可以自定義背景色,但是最好還是用系統(tǒng)自帶的!這里我給了兩套UI。
編寫UI界面布局有兩種,這里要注意用純代碼編寫需要修改widget文件夾里面的Info.plist文件里面的NSExtension的配置文件:如下
NSExtensionMainStoryboard:MainInterface(你的storyboard)這個是默認(rèn)的

NSExtensionPrincipalClass:TodayViewController(你widget控制器的名稱)

重點注意:(我自爬出來的坑)
用Swift開發(fā)(目前的swift3.0版本)widget的UI布局必須用storyboard拉取控件,也就是上面默認(rèn)的,如果你用純代碼編寫是不會有效果出來的(本人也是個純代碼控,這里Swift這個坑確實難搞,我經(jīng)過數(shù)十次的嘗試才發(fā)現(xiàn)這個bug。網(wǎng)上根本沒有人記載,apple官方文檔我也看不懂,問大神也不知道是怎么回事,爬坑的過程是痛苦的...。如果有大神知道如何用Swift純代碼來布局UI的話,迫切希望您能告訴我,我也收回說這是Swift語言的bug的話)。但是Objective-C兩者都行,這里我只說Swift如何來寫。

具體如何給約束,還是你們自己去搞吧!這個不難!當(dāng)然Swift雖說不能用純代碼來UI,但是用storyboard拉取控件定義的屬性和方法還是必須要用代碼來寫的,要不然就不能開發(fā)widget了!_
對于如何使用兩套UI,這個就要根據(jù)iOS 系統(tǒng)來做判斷,改變image了!
3.證書申請:
如果要上架的,那么必須要申請證書了。我的這個demo一開始就用的證書運(yùn)行的(本人強(qiáng)迫癥,只要真機(jī)運(yùn)行就要用證書)這里我就跟大家講講需要注意哪些事情:
因為widget是一個單獨(dú)的控件,所有它是需要獨(dú)立的bundle ID和證書的

當(dāng)然主app的bundle ID也是一樣的,但是兩者不能相同的名字,這里我用的企業(yè)級證書申請的。
這里要注意的是widget是app的一個組件,要數(shù)據(jù)共享的話,這里涉及到一個叫做App Groups的id設(shè)置和申請:

注意主app的id和widget的id設(shè)置都需要打開App Groups這個功能,這里我只用widget的id的截圖做示范:

還需要與你申請的App Groups的ID和主app的ID相關(guān)聯(lián),如果你之前就已經(jīng)申請了證書但是未關(guān)聯(lián)的話,請編輯bundle ID,重新添加:


然后在Xcode中一定要重新更新證書,打開App Groups:


(一定能要更新證書后才能使用哦!因為蘋果的證書在網(wǎng)站上更新后,在你的xcode中并沒有更新,他會重新生成一個新的,需要你手動刪除再添加)。
至此,證書和App Groups的添加完成。如果有報錯,請仔細(xì)檢查(你要相信,程序是不會故意報錯的;有錯誤,一定是你那里沒有做好,在自己身上找原因)。
4.數(shù)據(jù)共享和傳輸:
有了上面的App Groups的添加,我們就可以用代碼進(jìn)行數(shù)據(jù)傳輸和共享了。一般來講,widget這個功能只是在手機(jī)上快捷顯示的數(shù)據(jù)和操作的功能,你可以用你手機(jī)上的支付寶來進(jìn)行測試操作一下。
這里我把代碼截圖出來,我用的UserDefaults來存儲數(shù)據(jù),在主app里面進(jìn)行判斷,打開相應(yīng)的界面。

注意因為widget是單獨(dú)的控件操作,所以這么的點擊widget上的按鈕,跳轉(zhuǎn)到主app,需要給主app一個URL Schemes:

然后在主app里面進(jìn)行判斷你存儲的數(shù)據(jù)(這里要注意,iPhone的程序有兩種情況,一種是在后臺狀態(tài),一種是程序完全關(guān)閉狀態(tài)),跳轉(zhuǎn)相應(yīng)的界面。說明一下,我上面的充電狀態(tài)是我自己給的死數(shù)據(jù),沒有做相關(guān)的數(shù)據(jù)共享操作,自己思考解決,很簡單的。如果有需要demo的,請在github下載:https://github.com/chenwupeng/CCwidget/tree/7f28c5f458a38cb174b7e038dc21db7a7710dcd6
總結(jié)一下,這次用Swift開發(fā)Widget,確實走了很多彎路,不過還好的是,從坑里爬起來了,也希望蘋果能快點把這個坑填起來!在這里,希望我的這篇文章能對同行的你們有些幫助,如果發(fā)現(xiàn)有關(guān)swift開發(fā)的坑,盡量會幫大家指出來!