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];
}

  效果图:

 

 

 

  

posted @ 2018-01-11 16:45  ForeverGuard  阅读(464)  评论(0编辑  收藏  举报