- 通知欄中的今日擴展
- 分享擴展
- Action擴展
- 圖片編輯擴展
- 文件管理擴展
- 第三方鍵盤擴展
注:此教程來源於http://www.raywenderlich.com的《iOS8 by Tutorials》
關於App extensions 的原理,即How extensions work
首先App擴展是一個App功能性上的擴展,它並不獨立與你原來的App,也就是說在給App Store提交的時候是打包到原有App中一起提交,它們並不是獨立的App。其次,App的每一種擴展都有自己單獨的API接口,如在今日擴展中,系統提供調用的是NCWidgetController.h與NCWidgetProviding.h。然后,App擴展部分並不在你App主進程,而是單獨的進程,而且每一個擴展都有自己單獨的進程,與在iOS上運行的App工作方式不同,一種相同的擴展可以在多進程下運行。
為了說明擴展的運行原理,先上一張圖:


App Extension:被喚醒的擴展部分
Container App:被喚醒的擴展App
Host App:喚起擴展的App
Shared Container:共享的數據容器
舉個例子:當你在某個App中調用了分享功能,此App支持分享到Sina微博,這時Sina的擴展部分App Extension被喚醒,你喚醒分享功能的App叫做Host App,直到你完成分享,最后上傳網絡數據完成后,擴展進程被關閉。
在擴展運行中,它都在進行一個交換數據的橋接作用,但是它並不能提供兩個App進程間的通信功能,就如上圖,擴展並不直接和Container App進行通信。很多時候,Container App甚至並不運行,這也保證了擴展的輕量化。
如果擴展一定要和Container App進行通信,可以有以下幾種方法:
1 //1.調用openURL(),它是UIApplication的一個方法,然而,在擴展中並沒有UIApplication對象,Apple提供了新的接口:在NSExtensionContext中有下面的方法: 2 - (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler 3 //2.建立一個shared data container:使用NSUserDefaults存取數據、直接建立一個文件負責數據存取
通知欄中的今日擴展(Today extensions)
在iOS8中開發者可以在通知欄中定制自己App的今日界面顯示,如下圖:

開發者在自己App中名為TodayViewController中可以自定義任意的界面顯示,包括UILable、UIButton、UIImageView等等基本視圖,也可以自定義TableView等復雜的視圖,這里就以一個貨幣App做演示。
這是一個關於Bit Coin的App,首先原有App界面如下:


在App中顯示今日的比特幣的報價和漲跌幅度,下方顯示的是過去一個月的漲跌圖
我們要做的是將這個視圖在通知欄中的今日擴展中展示,首先在Xcode中File—>New—>Target


之后建立你App擴展的名字,最后會出現對話框問你“if you want to “Activate BTC Widget scheme?”.
點擊Activate之后會多出一個文件夾:


在這里面就是你設置今日擴展界面的vc部分,需要注意的是,新建項目中的文件可以包含原有的頭文件,但你使用后Xcode就會報編譯錯誤




此時,原來在Build Phases中只包含了TodayViewController.m,在這里需要手動添加需要的其他.m文件才可以


之后對MainInterface.storyboard進行你的界面設計,這里設置了UILabel、UIButton、UIView,和一般界面設置完全一致


然后在TodayViewController操作界面即可,直接運行即可在通知欄的今日中添加對應的擴展項目
1 //在最后說明下NCWidgetProviding中的幾個方法 2 //下面的方法是今日擴展的刷新設置 3 - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler { 4 // If an error is encountered, use NCUpdateResultFailed 5 // If there's no update required, use NCUpdateResultNoData 6 // If there's an update, use NCUpdateResultNewData 7 [self updateWithCurrencyData]; 8 completionHandler(NCUpdateResultNewData); 9 } 10 //下面的方法設置界面左側的偏移量 11 - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { 12 return UIEdgeInsetsZero;//使左側默認留白區域被填充 13 } 14 //下面的方法用於實現vibrancy特效 15 + (UIVibrancyEffect *)notificationCenterVibrancyEffect;
實現源碼:源代碼點擊