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. 会话数据的保存——cookie

    会话的理解 可以简单的理解为:用户打开浏览器,访问多个web资源,然后关闭浏览器,这个过程可以称为一次会话 有状态会话:可以简单理解为一个同学来了这个教室,下一次再来我们知道他来过这个教室,我们可以称 ...

  2. Nginx的事件处理机制

    Nginx的事件处理机制:对于一个主要的webserver来说,事件通常有三种类型,网络事件.信号.定时器. 首先看一个请求的基本过程:建立连接---接收数据---发送数据 .再次看系统底层的操作 : ...

  3. 2440test 裸机測试 调试不进main 设置改动方法

           2440test没进main函数并非跑飞.bin文件已经烧写到开发板里了的 而是没选择载入文件,导致不能调试程序文件 主要设置例如以下:

  4. careercup-栈与队列 3.5

    3.5 实现一个MyQueue类,该类用两个栈来实现一个队列. 解答 队列是先进先出的数据结构(FIFO),栈是先进后出的数据结构(FILO), 用两个栈来实现队列的最简单方式是:进入队列则往第一个栈 ...

  5. hadoop错误Cannot load libsnappy.so.1 (libsnappy.so.1 cannot open shared object file No such file or directory)!

    报如下错误 解决方法: 1.下载libsnappy.so.1(https://yunpan.cn/cSHRHTBJGVVX6  访问密码 c992) 2.上传到linux系统 3.安装 4.安装完成后 ...

  6. Chapter 6 - How to Play Music and Sound Effect

    In this chapter, we would add background music to the game and play sound effect when the hero fires ...

  7. Eclipse Key Shortcuts for Greater Developers Productivity--reference

    Posted by Ajitesh Kumar / In Java / June 6, 2014 http://vitalflux.com/eclipse-key-shortcuts-greater- ...

  8. iOS 网络编程:socket

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  9. iOS开发中常用的手势---边缘手势

    说明:以下方法是开发中使用的方法,有什么不对的或者好的方法,请多多指教! 此处的边缘手势是用来控制左侧抽屉视图的弹出以及收回. 添加手势 : 页面上有多个手势时需要遵循 UIGestureRecogn ...

  10. win8 需要管理员权限才能删除此应用程序

    在win8系统里面 安装了 dotfuscator,安装在c盘,结果发现运行是提示需要有管理员权限,想重新删除后安装也不行,删除的时候提示也需要管理员权限,网上查了一下资料,windows自xp开始, ...