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 三者之间的关系:
- App Extension的基本生命周期:
- 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。
- 选择Today Extension。
- 添加Extension后的target。
- 系统提供的默认入口为MainInterface.storyboard文件。
- 如果使用代码的方式自定义controller,需要更改info.plist中NSExtensionMainStoryboard字段为NSExtensionPrincipalClass,并修改入口为自定义类。
到这里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名字即可。
-
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。
-
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
- group的方式会为App Extension 和 Containing App 创建一个二者都可以访问的沙盒路径,所有需要共享的数据都存放在group路径中。这个路径以groupid为标识唯一存在。
-
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
网友评论