iOS Extension:TodayExtension(Widgets)

App Extension

  • App Extension是從iOS8開始引入的一種應用服務和交互方式。App Extension需要依賴于容器應用(Containing App)發布和部署。常見的App Extension例如:Today Extension 和 Share Extension等。

  • 容器應用(Containing App) 和 宿主應用(Host App):

    • 容器應用(Containing App):即由開發者開發的主應用。
    • 宿主應用(Host App):能夠運行Extension的應用即為宿主應用,Today Extension對應的宿主應用即為Today View。Share Extension對應的宿主應用即為能夠調起Share Extension的第三方應用。
  • App Extension、Host App、Containing App 三者之間的關系:

img_1.png
img_2.png
  • App Extension的基本生命周期:
img_3.png
  • App Extension基本認知:
    • Extension不能單獨發布和部署,需要依賴于容器應用(Containing App)。
    • Extension和容器應用(Containing App)的生命周期是獨立的,分別為兩個不同的進程.
    • Extemsion的運行依賴于宿主應用(Host App),生命周期由宿主應用決定。
    • Extension作為一個單獨的target存在,但會隨著容器應用(Containing App)的安裝和卸載而安裝和卸載。
    • Extension需要獨立的證書用來打包和測試。

widgets簡介

  • widgets介紹:

    • 在iOS系統中有多種Extension,Today Extension作為其中之一,通常被稱為widgets。widgets讓用戶在鎖屏狀態下(鎖屏狀態下直接調起Containing App 需要解鎖后才能調起)和解鎖狀態下,都可以通過widgets來瀏覽應用當前的重要信息。
    • 注:iOS和OS X系統都支持widgets,下文僅以iOS系統中的widgets展開說明。
  • widgets的正確使用姿勢:

    • 適當響應用戶交互。

    • 展示最新的Containing App內容。

    • 正確的使用widgets并盡可能減少其內存占用,否則系統會終止widgets。

    • 注:根據官方推薦的widgets使用方式,widgets中不應該出現復雜的交互或者做耗時的操作。

  • widgets中對UI的約束:

    • widgets中不支持滑動類型的交互設計。

    • widgets中不支持鍵盤,所以不應出現輸入框類設計。

    • 注:widgets視圖寬度是由today view來決定的,高度局部可調。以4.7屏幕為例,高度最大不要超過528,最小為110,寬度為359。

  • widgets生命周期:

    • 第一次下拉Today View的時候widgets的生命周期即為viewController的生命周期,但是再次下拉Today View的時候由于系統采用快照的方式填充widgets,直到其內容更新或者UI被更新才被替換,所以再次下拉的時候起生命周期只會執行viewWillAppear方法。

創建widgets

  • 打開Containing App的項目(即需要添加Today Extension的App),添加Extension的target。
step_1.png
  • 選擇Today Extension。
step_2.png
  • 添加Extension后的target。
step_3.png
  • 系統提供的默認入口為MainInterface.storyboard文件。
step_4.png
  • 如果使用代碼的方式自定義controller,需要更改info.plist中NSExtensionMainStoryboard字段為NSExtensionPrincipalClass,并修改入口為自定義類。
step_5.png

到這里Today Extension即widget已經可以運行并顯示了。

  • 設置 App Extentsion 顯示名:
    • 設置extension target的info.plist.
  • iOS8-iOS9中Widget的AppIcon需要設置才能正確顯
    • 可以在Extension Target中單獨創建Assets,然后添加AppIcon,也可以直接設置Containing App 中的Assets為 兩個Target共用。
    • Extension Target -> Build Settings -> Assset Catalog Compiler - Options -> Asset Catalog App Icon Set Name 添加AppIcon名字即可。
step_6.png
  • widgets的更新機制說明:

    • 為了保證當前內容為最新的內容,系統偶爾會捕獲widgets的視圖快照,當widgets再次可見時,將顯示最新的快照,直到更新的實時版本替換為止。
  • widgets更新內容

    • 如果想要在系統捕獲快照前更新widgets的內容,就要遵守NCWidgetProviding協議。并在方法
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult result))completionHandler;

中做內容更新操作。

  • widgets 的隱藏和顯示
    • 在沒有內容或者沒有最新內容的情況下可以選擇隱藏widgets,系統指定了一種用來隱藏和顯示widgets的方式:
    /**
    *  flag: BOOL 隱藏或者顯示
    *  bundleID: 要隱藏或者顯示的Extension的bundleId
    */
- (void)setHasContent:(BOOL)flag forWidgetWithBundleIdentifier:(NSString *)bundleID;

該方法在App Extension和Containing App中都可以調用,需要導入#import <NotificationCenter/NotificationCenter.h>

  • App Extension 和 Containing App 的通信:

    • App Extension 和 Containing App 的通信需要分別對App Extension 和 Containing App 都開啟App Groups,二者使用相同的group。
step_7.png
step_8.png
step_9.png
  • App Extension 調起 Containing App:

    • 通過自定義URL scheme的方式調起Containing App,系統提供了NSExtensionContext來實現這種方式。
    [self.extensionContext openURL:[NSURL URLWithString:@"yourContainingAppCustomURLScheme://?parma=value"] completionHandler:^(BOOL success) {
        NSLog(@"%u", success);
    }];
    
    • 自定義URL Scheme的方式在調起Containing App的同時也可以進行數據傳遞。
  • 通過group的方式實現App Extension 和 Containing App的數據共享

    • group的方式會為App Extension 和 Containing App 創建一個二者都可以訪問的沙盒路徑,所有需要共享的數據都存放在group路徑中。這個路徑以groupid為標識唯一存在。
      • 獲取group路徑:
    NSString *suiteName = @"group.com.iticle.TodayExtensionDemo";
    NSString *groupPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:suiteName]
    
      * NSUserDefault
          * 創建一個group路徑下的userDefault:
              
      ```-objc
      NSString *suiteName = @"group.com.iticle.TodayExtensionDemo";
      _userDefalut = [[NSUserDefaults alloc] initWithSuiteName:suiteName];
      ```
    
      * NSFileManager(推薦NSFileCoordination避免讀寫同步的問題)
      * Sqlite/CoreData
    
  • App Extension 和 Containing App 代碼共享:

    • 共享自定義代碼
      • framework
      • 給需要共享的代碼添加一個target
    • 共享Cocoapods引入的第三方庫
      • 修改podfile文件,添加App Extension的target依賴的第三方庫


        img_4.png

文章鏈接

https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Today.html
https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionCreation.html#//apple_ref/doc/uid/TP40014214-CH5-SW8
https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple_ref/doc/uid/TP40014214-CH2-SW2
https://developer.apple.com/documentation/notificationcenter

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • 在說widget開發前,先來了解下APP Extensions和App Groups: 一、關于App Exten...
    P大迷妹閱讀 4,393評論 1 10
  • Dmo鏈接 一、什么是today widget 蘋果官方關于 today widget 的介紹(點擊鏈接查看詳情)...
    StarHuiDream閱讀 5,141評論 3 5
  • iOS8.0加入了擴展,iOS10蘋果又增加了很多擴展。在今后,程序中會集成越來越多的擴展功能。 今天主要來模仿1...
    fou7閱讀 12,871評論 7 47
  • 連誓言都美到憂傷的年紀,你在誰的夢里笑靨如花,說著愛你永不變? "我給你買手機了,玫瑰金,你喜歡的那款 ! " 看...
    V小姐閱讀 480評論 3 2
  • 01 我想,每個人心中都有一首陳奕迅,周杰倫,五月天吧,永遠不要把情緒代進一首歌里,他會讓你愛上這首歌,然后,你的...
    _鹿玖_閱讀 955評論 0 2