iOS8中添加的extensions總結(一)——今日擴展

  1. 通知欄中的今日擴展
  2. 分享擴展
  3. Action擴展
  4. 圖片編輯擴展
  5. 文件管理擴展
  6. 第三方鍵盤擴展

注:此教程來源於http://www.raywenderlich.com的《iOS8 by Tutorials》
git

關於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的今日界面顯示,以下圖:github


開發者在本身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;

 實現源碼:源代碼點擊網絡

相關文章
相關標籤/搜索