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


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

注:此教程來源於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;

 實現源碼:源代碼點擊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM