os8发布已经有一段时间了,伴随着ios8同时也出现了许多新的特性,ios系统将会越来越开放,这是好事。其中一个新特性就是在下拉通知栏里加入了个性的widget,开发者可以自己定义widget的样式内容。当然这个功能在Android上早就实现了,^_^.........,如下图:

首先先说几个概念,

1、app extension:extension是iOS8新开放的一种对几个固定系统区域的扩展机制,extension并不是一个独立的app,它有一个包含在app bundle中的独立bundle,extension的bundle后缀名是.appex。当然它有好多类型,如下图官方文档上介绍的那天,今天我们主要讲解的就是Today中的,又叫做widget。

2、containing app:包含extension的app就是containning app,因为extension不能单独存在,所以必须得依附在一个正常的app里,这样才能提交商店。

3、host app:能够调起extension的app被称为host app,比如widget的host app就是Today。

我们看下它们三者之间是如何工作的,如下图:

接下来我们具体看如何完成一个简单的DEMO,这样你就更加了解了,^_^

首先我们先新建一个工程,这一步就省略了,接下来我们增加一个target,选择Today Extension,如下图:

然后创建完,如下图:

默认创建的storyboard里是hello world,所以我们先run项目,看看效果:

是不是很简单,^_^。。。

那么接下来我们看下containing app跟extension如何共享数据,例如我containing app里的数据,我要在extension显示。在这之前,我们要先讲下app groups,它主要用于同一group下的app共享同一份读写空间,以实现数据共享。我们看下工程中如何开启app groups,首先们选择targets,然后选择containing app,->Capabilities,打开app groups的开关,如下图:

点下面的加号按钮,新建一个group,例如:group.com.company.app,如下图:

创建完后如下图:

同理,选择targets为extension,同样创建一个app groups,选择跟containing app一样的名字,就是containing app里的app groups跟extension里的app groups名字相同,如下图:

OK。。。app groups创建好后,我们就可以实现数据共享了,

第一种方法是通过NSUserDefaults,存数据代码如下:

  1. NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:groupID];
  2. [shared setObject:[NSNumber numberWithInt:10] forKey:@"number"];
  3. [shared synchronize];

取数据如下:

  1. NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:groupID];
  2. NSString *string=[NSString stringWithFormat:@"%@",[shared objectForKey:@"number"]];
  3. _numberLabel.text=string;

我们在containing app中存一个数据,然后在extension里取一个数据,demo中我存了一个数字10,然后我们看下效果:


还有一种方法是通过NSFileManager来实现,存数据代码如下:

  1. NSError *err = nil;
  2. NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
  3. containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];
  4. NSString *value =@"123";
  5. BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&err];

取数据代码如下:

  1. NSError *err = nil;
  2. NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
  3. containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];
  4. NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:NSUTF8StringEncoding error:&err];

对于更复杂工程里加入extension,可能需要共享代码,你可能需要把一些公用的数据写入自己的framework中,然后containing app跟extension中各存一个,以此来达到共用代码,至于具体的实现,各位可以自己去尝试尝试^_^。。。

我们再看下通过点击extension里的内容来回到containing app中,其实就是通过openurl,首先需要在containing app中创建url type,如下图:

在extension中,写如下代码:

  1. [self.extensionContext openURL:[NSURL URLWithString:@"TestWight://"] completionHandler:^(BOOL success) {
  2. NSLog(@"open url result:%d",success);
  3. }];

需要注意的地方是,extension中view的位置不是最左边开始的,而是默认从icon后开始的,所以如需修改,代码入下:

  1. // 一般默认的View是从图标的右边开始的...如果你想变换,就要实现这个方法
  2. - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
  3. //UIEdgeInsets newMarginInsets = UIEdgeInsetsMake(defaultMarginInsets.top, defaultMarginInsets.left - 16, defaultMarginInsets.bottom, defaultMarginInsets.right);
  4. //return newMarginInsets;
  5. //return UIEdgeInsetsZero; // 完全靠到了左边....
  6. return UIEdgeInsetsMake(0.0, 16.0, 0, 0);
  7. }

还有就是有时view里的控件看不见,所以需要添加这句话:

  1. self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 100);

需要手动自己添加,在下拉通知里的edit里,

ios8新特性widget开发-b的更多相关文章

  1. 腾讯云安全:开发者必看|Android 8.0 新特性及开发指南

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 A ...

  2. iOS8新特性(1)——UIAlertController

    一.iOS8介绍 iOS8 新特性,主要是UI上进行了统一 1.UIAlertController 2.UIPresentaionController:管理所有通过modal出来的控制器(看笔记) 3 ...

  3. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017 I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Andro ...

  4. iOS8 新特性

    iOS8新特性主要体现在4方面 1.UIAlertController 对alert&actionSheet的封装 UIAlertController.h 提示框按钮的选择 typedef N ...

  5. iOS8新特性

    1. App Extension Programming Guide 2.LocalAuthentication.framework - Touch ID Authentication 3.Local ...

  6. Android N 新特性 + APP开发注意事项

    1. 多窗口MultiWindow 多窗口MultiWindow,这是Android N里对开发者影响比较大的特性,也是大家疑问比较多的地方.站在开发者的角度其实不必太担心这个特性会导致我们需要修改很 ...

  7. iOS8新特性(1)-UIPopoverPresentationController使用

    从iOS 8开始,苹果提出新的 UIPopoverPresentationController代替UIPopoverController: 新的UIPopoverPresentationControl ...

  8. Ios8新特性-应用程序扩展

    一.什么是应用程序扩展? 应用程序扩展不是一个应用,它是主体应用程序(containing app)中一个单独的包,并能生成单独的二进制文件供其他应用调用. 个人感觉,类似于WP中的启动器,把系统当个 ...

  9. 利用iOS8新特性计算cell的实际高度

    在计算cell的实际高度是 我们一般是通过计算frame  拿到最底部一个控件的最大Y值从而的到cell 的高度  算来算去  比较麻烦 其实,iOS8已经提供了直接通过Cell高度自适应的方法了,根 ...

随机推荐

  1. MVC 音乐商店 第 9 部分: 注册和结帐

    MVC 音乐商店是介绍,并分步说明了如何使用 ASP.NET MVC 和 Visual Studio 为 web 开发教程应用程序. MVC 音乐商店是一个轻量级的示例存储实现它卖音乐专辑在线,并实现 ...

  2. Tomcat优化参数

    JAVA_OPTS="-Xmx400m -Xms400m -XX:PermSize=128m -XX:MaxPermSize=400m -XX:+UseG1GC -XX:MaxGCPause ...

  3. Java 线程池的原理与实现(转)

    这几天主要是狂看源程序,在弥补了一些以前知识空白的同时,也学会了不少新的知识(比如 NIO),或者称为新技术吧.线程池就是其中之一,一提到线程,我们会想到以前<操作系统>的生产者与消费者, ...

  4. oracle1

    引言: 数据保存问题? 可使用文件保存和数据库保存. 使用文件保存数据存在几个缺点: 1.文本的安全性问题: 2.文件不利于查询和对数据的管理: 3.文件不利于存放海量数据: 4.文件在程序中控制不方 ...

  5. 【NodeJs】用arrayObject.join('')处理粘包的错误原因

    服务器测试代码如下: var net = require('net'); var server = net.createServer(function(c){ console.log('client ...

  6. 如何正确合理的建立MYSQL数据库索引

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型. 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytabl ...

  7. Linux下搭建Oracle11g RAC(6)----安装Grid Infrastructure

    从此步骤开始,我们正式安装Grid软件: ① 以grid用户登录图形界面,执行/home/grid/grid/runInstaller,进入OUI的图形安装界面: ② 进入OUI安装界面后,选择第3项 ...

  8. apache源码编译安装详解

    查看是否安装 rpm -qa httpd        如果已安装,则卸载:rpm -e 卸载  --nodeps 不考虑意外        下载 wget http://mirrors.sohu.c ...

  9. jquery.validate.js校验select2解决方案,Jquery插件select2校验解决方案

    jquery.validate.js校验select2解决方案 Jquery插件select2校验解决方案 >>>>>>>>>>>&g ...

  10. python matplotlib.plot画图显示中文乱码的问题

    在matplotlib.plot生成的统计图表中,中文总是无法正常显示.在网上也找了些资料,说是在程序中指定字体文件,不过那样的话需要对plot进行很多设置,而且都是说的设置坐标轴标题为中文,有时候图 ...