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. Excel文件上传

    *&---------------------------------------------------------------------* *& FORM FRM_UPDATA_ ...

  2. 【转】Android应用开发allowBackup敏感信息泄露的一点反思

    转载:http://blog.csdn.net/yanbober/article/details/46417531 1 背景 其实这篇文章可能有些小题大作,但回过头想想还是很有必要的,有点阴沟里翻船的 ...

  3. 12V继电器开关控制

    案例描述:“灯控项目”中让单片机通过IO口控制继电器,继电器接入GPRS电路板供电电源,从而实现单片机对GPRS电路板的开关控制 电路图 所需元器件:1个五脚继电器,1个NPN三极管,2个电阻,1个二 ...

  4. [TypeScript] Loading Compiled TypeScript Files in Browser with SystemJS

    TypeScript outputs JavaScript, but what are you supposed to do with it? This lesson shows how to tak ...

  5. android 76 使用get post方式提交数据

    get方式: package com.itheima.getmethod; import java.io.InputStream; import java.net.HttpURLConnection; ...

  6. iOS网络层架构设计分享

    前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...

  7. 使用SBT构建Scala项目

    既然决定要在Scala上下功夫,那就要下的彻底.我们入乡随俗,学一下SBT.sbt使用ivy作为库管理工具.ivy默认把library repository建在user home下面. 安装SBT 在 ...

  8. php之常量小见

    php设置常量有二种方法,一为define(),二为使用关键字const. define()函数带有三个形参,一为常量名,通常以大写字母命名,二为值,三为是否对大小写敏感,其值为可选,默认为false ...

  9. 经典关于多态的demo

    class Foo { public int a; public Foo() { a = 3; } public int addFive() { a += 5; return a; } public ...

  10. 关于try和finaly 里面return的问题

    首先,下面这个方法调用: public int bbb(){ if(true){ return 3; } if(true){ return 4; } return 0; } 返回的结果是 :3 可见r ...