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=%@",@""]] completionHandler:nil];
}

  效果图:

  

iOS扩展Extension之Today的更多相关文章

  1. 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan. Swift语法的主要部分几乎相同的. 当然也有通用的.运算符重载.ARC. ...

  2. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  3. iOS - Action Extension

    上一篇<iOS开发 之 Share Extension>介绍了分享扩展的开发与使用,本篇主要还是讲述在系统分享菜单中最底下一栏的功能扩展:Action Extension,该扩展跟Shar ...

  4. iOS - Share Extension

    1. 学 Share Extension 之前 先了解一下iOS的App Extension 2.1 创建Share Extension扩展Target ** 注:扩展不能单独创建,必须依赖于应用工程 ...

  5. iOS - App Extension 整体总结

    一.App Extension的介绍 App Extension可以让你扩展你APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它.app extension即为本文所说的e ...

  6. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

  7. 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based

    最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...

  8. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

  9. iOS Application Extension

    链接: iOS App Extension入门 iOS10通知及通知拓展Extension使用详解(附Demo) iOS10 通知extension之 Content Extension

随机推荐

  1. thrift 的一些相关知识

    thrift是一个很好用的跨语言的rpc框架. 但是其也有一些需要注意的问题: 第一: 发现其对于类型检查没有那么严格:    最近工作中发现是可以把一个int类型直接付给string,而没有任何wa ...

  2. Mybatis3中@SelectProvider传递参数

    一.通常情况下我们使用实体类或者vo类来传递参数,这样可以在provider中直接使用#{param}来获取参数 二.在mybatis3.3以下版本只能传递一个参数,所以如果要传递多个参数必须封装成M ...

  3. IDEA使用maven插件打jar包流程

    idea使用maven插件打jar包步骤以及遇到的问题 idea自带了maven工具,idea右边点击maven选项: 一.在pom中添加插件,直接复制就好,如下选项 <plugin> & ...

  4. Superset安装出错 sqlalchemy.exc.InvalidRequestError: Can't determine which FROM clause to join from, ...

    $ superset db upgrade ... Traceback (most recent call last): File "/home/jhadmin/.pyenv/version ...

  5. delphi xe10 手机程序事件服务操作、退出键操作

    //程序事件服务操作 var FMXApplicationEventService: IFMXApplicationEventService; begin if TPlatformServices.C ...

  6. delphi透明panel组件或者制作方法

    //透明Panel控件 unit TranPanel; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...

  7. 其它课程中的python---3、numpy总结(非常全)

    其它课程中的python---3.numpy总结(非常全) 一.总结 一句话总结: 学习方式应该是:听课+总结:-->找总结博客+再总结 需要始终记住:凭借,继承,复用 1.numpy的主要功能 ...

  8. python入门 类的继承和聚合(五)

    继承 class Rocket: def __init__(self, name, distance): self.name = name self.distance = distance def l ...

  9. getmapping等无法解析

    版本要改一下,4.1.6没有<dependency> <groupId>org.springframework</groupId> <artifactId&g ...

  10. Centos6.5安装rar5.3

    linux下使用最多的压缩工具是gzip,zip等,如果需要使用rar,就必须编译安装了,以下是编译安装rar教程: 一.安装支持库yum install -y gcc gcc-c++ autocon ...