扩展如何运作、Extension和Containing App、host app之间的关系、Containing App与扩展共享数据、开启App Groups
Containing App 包含widget的app
host app 宿主app,对于today widget来说,host app就是today
1.创建Extension
点击“File”->”New”->”Target”
创建出的TodayViewController同样需要配置一套配置文件,和之前的操作相同
2.widget里唤醒主程序,通过url schemes
NSString *urlStr = @"xjwidgetapp://red"; NSURL *url = [NSURL URLWithString:urlStr]; [self.extensionContext openURL:url completionHandler:^(BOOL success) { }];
3.在host app 宿主和today widget中开启app groups 这样才能进行数据交互。
//存储 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; [shared setObject:@"orange" forKey:@"key"]; [shared synchronize];
//读取 NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.lxjfmdb.app"]; NSString *str = [shared objectForKey:@"key"]; NSLog(@"%@",str);
4.widget生命周期
如果用户是第一次下拉查看Widget其实就是执行整个ViewController生命周期调用过程。
系统为了保证Widget上数据是及时更新的,默认会截取上次显示成功Widget的快照.这个快照会一直保存到新的数据或UI被更新才回被替换,那这就会带来一个问题,当你拖拽通知中心(Notification Center)下拉过于频繁时,Debug跟踪代码执行路径你会发现整个Widget生命周期执行过程和第一次下拉执行的路径发生了变化.
第一次下拉执行路径是viewDidLoad->viewWillAppear,而如果下拉过于频繁你就会发现代码执行路径直接只会执行viewWillAppear方法,这个就是系统默认保存上次快照而导致的执行路径上变化.这对我们选择NSTimer更新时机以及后面会提到的Widget横竖屏处理都会有影响.
在viewwillappear里调用数据请求和设置界面高度
// 设置界面的高度
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
[self getBidInfo];
}
在-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode
方法里设置高度
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
if (activeDisplayMode == 0) {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 );///这里的110是苹果设置死的,应该不能改吧
} else {
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110 * 4);//这里的总高度可以自己设置
}
}
TodayViewController同样支持cocoapod,一样可以进行数据请求
platform :ios, ‘8.0’
target ‘TodayViewController’ do
pod 'AFNetworking'
pod 'MJExtension'
end
基本上widget就能接入成功了