iOS扩展Extension之Today
1、简介
扩展(Extension)是iOS 8中引入的一个新特性。扩展让app之间的数据交互成为可能。在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据。而在引入扩展之后,其他app可以与扩展进行数据交换。iOS 8系统有6个支持扩展的系统区域,分别是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支持扩展的系统区域也被称为扩展点。本文只简单记录Today的使用!
2、Today扩展的创建
方法一:通过路径File -->New -->Target创建!
方法二:直接点击项目-->点击 + 即可!
2、Today简介和方法说明
Today扩展的一种,虽然依附在App中,但是它是单独的个体,所使用的文件、资源、第三方等,都需要单独设置!
Today创建之后,其实就是一个ViewController!最小高度为110pt。有三方协议方法:
// iOS10 新增的方法 // 用来设置Widget是展开还是折叠状态的方法,可以设置相关的preferredContentSizes属性修改大小 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{ if (activeDisplayMode == NCWidgetDisplayModeCompact) { NSLog(@"叠起状态下的默认size:%@", NSStringFromCGSize(maxSize)); } else { NSLog(@"展开状态下的默认size:%@", NSStringFromCGSize(maxSize)); } } // 该方法是用来告知Widget控制器是否需要更新的一个协议方法 - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered, use NCUpdateResultFailed // If there's no update required, use NCUpdateResultNoData // If there's an update, use NCUpdateResultNewData completionHandler(NCUpdateResultNewData); // typedef NS_ENUM(NSUInteger, NCUpdateResult) { // NCUpdateResultNewData, // NCUpdateResultNoData, // NCUpdateResultFailed // } NS_ENUM_AVAILABLE_IOS(8_0); } // iOS10 版本之后将不会再被唤起 // 用来设置Widget控制器边框间距的方法,如果出现偏差,可以调整此方法的返回值进行操作 - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets NS_DEPRECATED_IOS(8_0, 10_0, "This method will not be called on widgets linked against iOS versions 10.0 and later.");
2.1 通过Storyboard加载和编码加载两种选择:
通过修改plist文件storyboard
编码加载设置:
2.2 Today的展开和折叠:
第一步:设置 widgetLargestAvailableDisplayMode属性;
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
第二步:实现协议方法;
// iOS10 新增的方法 // 用来设置Widget是展开还是折叠状态的方法,可以设置相关的preferredContentSizes属性修改大小 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{ if (activeDisplayMode == NCWidgetDisplayModeCompact) { NSLog(@"叠起状态下的默认size:%@", NSStringFromCGSize(maxSize)); } else { NSLog(@"展开状态下的默认size:%@", NSStringFromCGSize(maxSize)); } }
3、共享数据
通过扩展点进行数据的共享,真机测试需要在开发者网站注册一个App Groups。模拟器亲测可以免费使用(App Groups的测试group.com.xxx.TextToday),后面是Bundle Identifier。
3.1 开发者网站注册一个App Groups
3.2 证书使用自动签名部署,设置项目和Today的target中添加APPGroups选项
3.3 项目中储存数据,在Today中获取数据
通过[[NSUserDefaults alloc] initWithSuiteName:@"groupName"]
这个格式去创建NSUserDefaults
对象,groupName
填写当前设置AppGroups
勾选的名字。
- (void)savaDataWithArray:(NSArray *)dataArray { NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray]; NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"]; [defaults setObject:data forKey:@"todayModel"]; [defaults synchronize]; }
获取数据:注意数据存储需要符合格则NSCoding协议、可储存的类型、自定义转Data存储等。
- (void)readData { NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"]; NSData *dataArray = [defaults objectForKey:@"todayModel"]; self.dataArr = [NSKeyedUnarchiver unarchiveObjectWithData:dataArray]; }
通过在Today界面加载一个TableView,效果如图:
注意Today和项目共同使用的Model和资源需要设置Target选项:
4、点击Today跳转到APP
4.1 设置APP的URL Schemes
4.2 在Today中的跳转代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:YES]; [self.extensionContext openURL:[NSURL URLWithString:[NSString stringWithFormat:@"TextToday://todayModel=%@",@"123"]] completionHandler:nil]; }
效果图: