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];
}
效果图: