最近玩手機(jī)發(fā)現(xiàn)了widget這個(gè)app外的控件還是蠻有意思的胖秒,于是在上網(wǎng)查了一下資料钾怔,是iOS 8的系統(tǒng)開始開放的一個(gè)快捷顯示操作功能,這個(gè)功能彌補(bǔ)了沒有3D touch功能的iPhone。雖然網(wǎng)上百度可以查看到很相關(guān)的開發(fā)資料喇伯,但是我發(fā)現(xiàn)基本上都是Objective-C的例子,關(guān)于Swift開發(fā)的我僅僅只是看到了一篇(可能有一些我沒看到)拨与,主要是都不夠詳細(xì)稻据,作為一個(gè)新手的我,也為了讓新手們少爬一些坑买喧,我將詳細(xì)為大家講解如何玩轉(zhuǎn)這個(gè)widget功能捻悯。附上圖片
屏幕快照 2017-02-17 11.24.25.png
開發(fā)環(huán)境:Xcode 8.2.1
開發(fā)語言:Swift 3.0(以上)
1.第一步:如何創(chuàng)建widget
如何創(chuàng)建?在網(wǎng)上有已經(jīng)有很多了淤毛,這里我還是給大家截圖一下:
屏幕快照 2017-02-17 11.30.49.png
屏幕快照 2017-02-17 11.31.42.png
選擇Today Extension 今缚,點(diǎn)擊Next ,項(xiàng)目中就會(huì)自動(dòng)創(chuàng)建一個(gè)如下圖所示的文件夾:
屏幕快照 2017-02-17 11.35.22.png
(這里的swiftWidget文件夾是我自己命名的)
屏幕快照 2017-02-17 11.37.32.png
里面有一個(gè)TodayViewController.swift钱床、MainInterface.storyboard和Info.plist文件(里面的image的兩個(gè)文件夾是我后來放的圖片)
到這里就創(chuàng)建完成了荚斯!可以運(yùn)行下看看效果(建議真機(jī)上運(yùn)行效果更加)
2.第二步:界面UI布局
widget的UI布局,一般來講以iOS 10為分界線查牌,iOS 10和10以上是一種事期,iOS 8至iOS 10(不包含iOS 10)又是一種,如下圖:
iOS 10及以上.png
iOS 10以下.png
主要是背景的不同纸颜,雖然widget也可以自定義背景色兽泣,但是最好還是用系統(tǒng)自帶的!這里我給了兩套UI胁孙。
編寫UI界面布局有兩種唠倦,這里要注意用純代碼編寫需要修改widget文件夾里面的Info.plist文件里面的NSExtension的配置文件:如下
NSExtensionMainStoryboard:MainInterface(你的storyboard)這個(gè)是默認(rèn)的
屏幕快照 2017-02-17 13.45.54.png
NSExtensionPrincipalClass:TodayViewController(你widget控制器的名稱)
屏幕快照 2017-02-17 13.48.24.png
重點(diǎn)注意:(我自爬出來的坑)
用Swift開發(fā)(目前的swift3.0版本)widget的UI布局必須用storyboard拉取控件称鳞,也就是上面默認(rèn)的,如果你用純代碼編寫是不會(huì)有效果出來的(本人也是個(gè)純代碼控稠鼻,這里Swift這個(gè)坑確實(shí)難搞冈止,我經(jīng)過數(shù)十次的嘗試才發(fā)現(xiàn)這個(gè)bug。網(wǎng)上根本沒有人記載候齿,apple官方文檔我也看不懂熙暴,問大神也不知道是怎么回事,爬坑的過程是痛苦的...慌盯。如果有大神知道如何用Swift純代碼來布局UI的話周霉,迫切希望您能告訴我,我也收回說這是Swift語言的bug的話)亚皂。但是Objective-C兩者都行俱箱,這里我只說Swift如何來寫。
用storyboard來編寫UI布局.png
具體如何給約束灭必,還是你們自己去搞吧狞谱!這個(gè)不難!當(dāng)然Swift雖說不能用純代碼來UI,但是用storyboard拉取控件定義的屬性和方法還是必須要用代碼來寫的厂财,要不然就不能開發(fā)widget了!^_^
對(duì)于如何使用兩套UI芋簿,這個(gè)就要根據(jù)iOS 系統(tǒng)來做判斷峡懈,改變image了璃饱!
3.證書申請:
如果要上架的,那么必須要申請證書了肪康。我的這個(gè)demo一開始就用的證書運(yùn)行的(本人強(qiáng)迫癥荚恶,只要真機(jī)運(yùn)行就要用證書)這里我就跟大家講講需要注意哪些事情:
因?yàn)閣idget是一個(gè)單獨(dú)的控件,所有它是需要獨(dú)立的bundle ID和證書的
widget的證書.png
當(dāng)然主app的bundle ID也是一樣的磷支,但是兩者不能相同的名字谒撼,這里我用的企業(yè)級(jí)證書申請的。
這里要注意的是widget是app的一個(gè)組件雾狈,要數(shù)據(jù)共享的話廓潜,這里涉及到一個(gè)叫做App Groups的id設(shè)置和申請:
BFF39167-B2C0-4E39-91A8-3489F6E2953D.png
注意主app的id和widget的id設(shè)置都需要打開App Groups這個(gè)功能,這里我只用widget的id的截圖做示范:
widget ID的App Groups和主app ID的App Groups都需要開啟.png
還需要與你申請的App Groups的ID和主app的ID相關(guān)聯(lián),如果你之前就已經(jīng)申請了證書但是未關(guān)聯(lián)的話善榛,請編輯bundle ID辩蛋,重新添加:
CB86CBB5-697E-4EE4-A491-C1C9DE02905A.png
選中申請的App Groups的ID.png
然后在Xcode中一定要重新更新證書,打開App Groups:
主app和widget都需要打開這里選中組件id.png
主app的App Groups.png
(一定能要更新證書后才能使用哦移盆!因?yàn)樘O果的證書在網(wǎng)站上更新后悼院,在你的xcode中并沒有更新,他會(huì)重新生成一個(gè)新的咒循,需要你手動(dòng)刪除再添加)据途。
至此绞愚,證書和App Groups的添加完成。如果有報(bào)錯(cuò)颖医,請仔細(xì)檢查(你要相信位衩,程序是不會(huì)故意報(bào)錯(cuò)的;有錯(cuò)誤熔萧,一定是你那里沒有做好蚂四,在自己身上找原因)。
4.數(shù)據(jù)共享和傳輸:
有了上面的App Groups的添加哪痰,我們就可以用代碼進(jìn)行數(shù)據(jù)傳輸和共享了遂赠。一般來講,widget這個(gè)功能只是在手機(jī)上快捷顯示的數(shù)據(jù)和操作的功能晌杰,你可以用你手機(jī)上的支付寶來進(jìn)行測試操作一下跷睦。
這里我把代碼截圖出來,我用的UserDefaults來存儲(chǔ)數(shù)據(jù)肋演,在主app里面進(jìn)行判斷抑诸,打開相應(yīng)的界面。
在TodayViewController里面進(jìn)行相應(yīng)的操作.png
注意因?yàn)閣idget是單獨(dú)的控件操作爹殊,所以這么的點(diǎn)擊widget上的按鈕蜕乡,跳轉(zhuǎn)到主app,需要給主app一個(gè)URL Schemes:
主app的URL Schemes.png
然后在主app里面進(jìn)行判斷你存儲(chǔ)的數(shù)據(jù)(這里要注意梗夸,iPhone的程序有兩種情況层玲,一種是在后臺(tái)狀態(tài),一種是程序完全關(guān)閉狀態(tài))反症,跳轉(zhuǎn)相應(yīng)的界面辛块。說明一下,我上面的充電狀態(tài)是我自己給的死數(shù)據(jù)铅碍,沒有做相關(guān)的數(shù)據(jù)共享操作润绵,自己思考解決,很簡單的胞谈。如果有需要demo的尘盼,請?jiān)趃ithub下載:https://github.com/chenwupeng/CCwidget/tree/7f28c5f458a38cb174b7e038dc21db7a7710dcd6
總結(jié)一下,這次用Swift開發(fā)Widget烦绳,確實(shí)走了很多彎路卿捎,不過還好的是,從坑里爬起來了爵嗅,也希望蘋果能快點(diǎn)把這個(gè)坑填起來娇澎!在這里,希望我的這篇文章能對(duì)同行的你們有些幫助睹晒,如果發(fā)現(xiàn)有關(guān)swift開發(fā)的坑趟庄,盡量會(huì)幫大家指出來!
作者:氫色的氣球
鏈接:http://www.reibang.com/p/44112b7bddef
來源:簡書
著作權(quán)歸作者所有括细。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處戚啥。