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阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容