最近玩手機發現了widget這個app外的控件仍是蠻有意思的,因而在上網查了一下資料,是iOS 8的系統開始開放的一個快捷顯示操做功能,這個功能彌補了沒有3D touch功能的iPhone。雖然網上百度能夠查看到很相關的開發資料,可是我發現基本上都是Objective-C的例子,關於Swift開發的我僅僅只是看到了一篇(可能有一些我沒看到),主要是都不夠詳細,做爲一個新手的我,也爲了讓新手們少爬一些坑,我將詳細爲你們講解如何玩轉這個widget功能。附上圖片git
開發環境:Xcode 8.2.1 開發語言:Swift 3.0(以上)github
1.第一步:如何建立widget 如何建立?在網上有已經有不少了,這裏我仍是給你們截圖一下:swift
選擇Today Extension ,點擊Next ,項目中就會自動建立一個以下圖所示的文件夾:xcode
(這裏的swiftWidget文件夾是我本身命名的)app
裏面有一個TodayViewController.swift、MainInterface.storyboard和Info.plist文件(裏面的image的兩個文件夾是我後來放的圖片)佈局
到這裏就建立完成了!能夠運行下看看效果(建議真機上運行效果更加)測試
2.第二步:界面UI佈局 widget的UI佈局,通常來說以iOS 10爲分界線,iOS 10和10以上是一種,iOS 8至iOS 10(不包含iOS 10)又是一種,以下圖:網站
主要是背景的不一樣,雖然widget也能夠自定義背景色,可是最好仍是用系統自帶的!這裏我給了兩套UI。3d
編寫UI界面佈局有兩種,這裏要注意用純代碼編寫須要修改widget文件夾裏面的Info.plist文件裏面的NSExtension的配置文件:以下code
NSExtensionMainStoryboard:MainInterface(你的storyboard)這個是默認的
NSExtensionPrincipalClass:TodayViewController(你widget控制器的名稱)
重點注意:(我自爬出來的坑) 用Swift開發(目前的swift3.0版本)widget的UI佈局必須用storyboard拉取控件,也就是上面默認的,若是你用純代碼編寫是不會有效果出來的(本人也是個純代碼控,這裏Swift這個坑確實難搞,我通過數十次的嘗試才發現這個bug。網上根本沒有人記載,apple官方文檔我也看不懂,問大神也不知道是怎麼回事,爬坑的過程是痛苦的...。若是有大神知道如何用Swift純代碼來佈局UI的話,迫切但願您能告訴我,我也收回說這是Swift語言的bug的話)。可是Objective-C二者都行,這裏我只說Swift如何來寫。
具體如何給約束,仍是大家本身去搞吧!這個不難!固然Swift雖然說不能用純代碼來UI,可是用storyboard拉取控件定義的屬性和方法仍是必需要用代碼來寫的,要否則就不能開發widget了!^_^ 對於如何使用兩套UI,這個就要根據iOS 系統來作判斷,改變image了!
3.證書申請: 若是要上架的,那麼必需要申請證書了。個人這個demo一開始就用的證書運行的(本人強迫症,只要真機運行就要用證書)這裏我就跟你們講講須要注意哪些事情: 由於widget是一個單獨的控件,全部它是須要獨立的bundle ID和證書的
固然主app的bundle ID也是同樣的,可是二者不能相同的名字,這裏我用的企業級證書申請的。
這裏要注意的是widget是app的一個組件,要數據共享的話,這裏涉及到一個叫作App Groups的id設置和申請:
注意主app的id和widget的id設置都須要打開App Groups這個功能,這裏我只用widget的id的截圖作示範:
還須要與你申請的App Groups的ID和主app的ID相關聯,若是你以前就已經申請了證書可是未關聯的話,請編輯bundle ID,從新添加:
而後在Xcode中必定要從新更新證書,打開App Groups:
(必定能要更新證書後才能使用哦!由於蘋果的證書在網站上更新後,在你的xcode中並無更新,他會從新生成一個新的,須要你手動刪除再添加)。
至此,證書和App Groups的添加完成。若是有報錯,請仔細檢查(你要相信,程序是不會故意報錯的;有錯誤,必定是你那裏沒有作好,在本身身上找緣由)。
4.數據共享和傳輸: 有了上面的App Groups的添加,咱們就能夠用代碼進行數據傳輸和共享了。通常來說,widget這個功能只是在手機上快捷顯示的數據和操做的功能,你能夠用你手機上的支付寶來進行測試操做一下。
這裏我把代碼截圖出來,我用的UserDefaults來存儲數據,在主app裏面進行判斷,打開相應的界面。
注意由於widget是單獨的控件操做,因此這麼的點擊widget上的按鈕,跳轉到主app,須要給主app一個URL Schemes:
而後在主app裏面進行判斷你存儲的數據(這裏要注意,iPhone的程序有兩種狀況,一種是在後臺狀態,一種是程序徹底關閉狀態),跳轉相應的界面。說明一下,我上面的充電狀態是我本身給的死數據,沒有作相關的數據共享操做,本身思考解決,很簡單的。若是有須要demo的,請在github下載:https://github.com/chenwupeng/CCwidget/tree/7f28c5f458a38cb174b7e038dc21db7a7710dcd6 總結一下,此次用Swift開發Widget,確實走了不少彎路,不過還好的是,從坑裏爬起來了,也但願蘋果能快點把這個坑填起來!在這裏,但願個人這篇文章能對同行的大家有些幫助,若是發現有關swift開發的坑,儘可能會幫你們指出來!