Widget就是iPhone左滑展示出來的小窗口,我理解為——自家app的又一個入口,哈哈。比如下圖中的天氣。
其實就覺得這個東西比較神奇好玩兒才打算試試的,但是其中,卻遇到了很多的問題。接下里就系統的記錄一下,如何簡單的實現這個小的東西,和其中自己遇到的一些問題吧。源代碼點這里。
首先我是創建了一個新的工程,其次因為Widget是一個獨立的進程,所以我們要再創建一個target,File —— New —— Target 然后選擇Today Extension.
創建好工程之后,就可以先進行代碼的編寫了。但是這里有幾個問題問題需要注意。
1、如果在Extension中用到了需要配置路徑的第三方庫,需要切換到Extension中的Target中進行配置。
2、我是用cocoapod管理第三方工具的,所以這個時候,進行第三方管理的時候,需要區分是給那個target添加第三方庫。
3、當代碼及庫都配置好之后,就需要進行代碼的運行了,這個時候為了將兩個進程聯系起來,就需要添加組了。兩個進程一定要加到同一個組里面,并且,組要和BundleID一致。同時配置BundleID的時候,主進程是正常配置,但是Widget進程的BundleID的格式是BundleID.工程名稱。這點需要注意。其實默認的格式是正確的,只要按著格式改成自己的BundleID就好,但是就怕遇到像我這種,看都不看直接改的。所以這里需要注意啊~~~
4、運行代碼之前還有一個配置需要修改。直接上圖,按照圖修改就好。一定要改這里,否則的話是加載不出來的。
需要配置的差不多就這些了,但是這些都是很重要的,很容易造成最后顯示的效果就是無法載入,這是最悲傷的了。接下來是關于Widget的一些基本信息的內容吧。
1、Widget有兩種模式,一種是展開狀態,一種是隱藏狀態。通過代碼可控制。
/*設置widget的展示模式:
NCWidgetDisplayModeExpanded 展開
NCWidgetDisplayModeCompact 隱藏
*/
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
2、Widget的樣式是可以通過更改展開模式的協議方法來進行更改的。比如高度的修改。
//隱藏展開模式改變是調用此方法
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize
{
if(activeDisplayMode == NCWidgetDisplayModeCompact)
{
self.preferredContentSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, 110);
}
else
{
self.preferredContentSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, 210);
}
}
3、Widget的高度,一般來說最低是110,也就是說,當設置widget的高度時,低于110的均是110。
4、設置好模式和高度之后,就可以正常的創建Widget的頁面了,但是頁面不要太過復雜,通過查看資料,Widget頁面能承載的最大內存是11M。
5、設置頁面之后,如果與app主體有交互,首先需要頁面點擊事件通過以下調起URL的方式來進行反饋。這個方法其實是跟app外部通過URL來調起app是一樣的道理,所以同樣的也需要設置一個scheme URL,這個過后還會有說明。
6、頁面代碼完成之后,相應了,為了能調起app需要在AppDelegate中配置相應的代碼。
7、剛說過,如果要調起app需要配置一下scheme URL,這里是要配置app主體的scheme URL。配置規則則是與之前代碼中設置的URL的規則保持一致。
都配置完成之后,運行代碼之后,應該就可以了。但是這個時候左滑會看不到自己的小窗口。其實是因為自己沒有加入而已。只需要點擊那個編輯,然后加入自己的widget就可以啦!
最近做Widget差不多遇到的就這些問題了,目前做的很簡單,只是頁面的展示,并沒有數據的交互和刷新之類的。就以后繼續補充吧。