由于项目中要用到,最近研究了下Today Widget 开发
1.什么是Extension?
扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。
- extension并不是一个独立的app,它有一个包含在app bundle中的独立bundle,extension的bundle后缀名是.appex;需要依赖于containning app。
- 调试主App则运行主App;调试扩展则运行扩展
- 扩展App想要使用的图片资源等,需要引入到扩展文件夹下
- 创建一个Extension之前,需要有一个承载扩展的应用,称为containing app,然后在Containing app中通过Xcode->File->new->target->选择所需的Extension创建。
- Extension 不能单独存在和发布,随containing app 的安装而安装,随containing app的发布而发布,一个containing app 可以添加多个Extension。
- Extension 的运行是独立的,containing app 在没有启动的状态下,Extension仍然可以被启动和运行。
2、Extension 生命周期详解
Extension 不是一个app,所以生命周期和运行环境和app不同。在多数情况下,extension是由用户在某一个app的界面或者某一个活动的控制器中启动,这个启动extension的app被称为host app。Host app 提供extension运行所需的上下文并通过发送一个request的方式开启extension的生命周期,extension在完成host app请求的任务后结束运行
Paste_Image.png3、UI样式
- 背景:尽量不要使用背景,默认的毛玻璃效果很好,主要文字颜色最好是白色,次要文字的颜色最好是 lightTextColor
- 不要在今日面板里使用可以滚动的 Scroll View,而是要完全展开
- 缩进:尽量保持默认的缩进,即左边会空几个像素。如果想改变默认缩进,在TodayViewController里面实现以下方法
4、与主App进行交互
- Today跳转App(唤起App,调用App某项功能)
[UIApplication sharedApplication]在扩展App中是无法访问的,需要通过NSExtensionContext来调用主App的openURL方法
5、与主App共享数据
- 利用group,将主App和扩展App做一个数据共享空间(NSUserDefault),先在主App的Targets中创建并设置,再在扩展App的Targets设置(如图)。
- 可以和containing app 公用保持在本地登录的session和登录状态,然后去拉取最新的today需要展示的数据
主App存扩展App所需要数据
NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myApp"];
[userDefault setBool:YES forKey:@"isLogin"];
扩展App取所需要数据
NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.myApp"];
BOOL isLogin = [myDefaults objectForKey:@"isLogin"];
6、iOS10 的适配- 展开、折叠按钮
在NSExtensionContext中,新添了widgetLargestAvailableDisplayMode属性,来确认当前widget是展开还是折叠状态。所以,先在viewWillAppear中设置widget的mode为展开。
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
if (activeDisplayMode == NCWidgetDisplayModeCompact) {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
// 处理~~
} else {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
// 处理~~
}
}
7、数据获取问题
如果不是静态页面,就需要去服务端拉取最新的数据然后展示出来,如果像头条的today就需要每次展示的时候去服务端拉取最新的新闻信息展示出来,包括和containing app数据保持同步。感觉挺鸡肋的。
网友评论