前言

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。

extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today Extension中查看应用展示的简略信息,而不用再进到我们的应用中,同样可以快捷操作app的功能,这将是一种全新的用户体验。

今天我们介绍一下给工程添加Today Extension的步骤。

添加Today Extension工程

在原有的工程基础上,想要使用Today Extension,我们需要创建一个新的target,点击File-->New-->Target-->Today Extention,如下图所示:

添加Target
选择Today Extension

添加成功后项目的目录会如下图所示:

工程目录

运行项目会看到如下图所示的效果:

运行效果

定制UI

由于我习惯使用纯代码写UI,所以我会选择删除默认创建的MainInterface.storyboard,并在info.plist中删除NSExtensionMainStoryboard,添加NSExtensionPrincipalClass为TodayViewController,如下图所示:

配置controller

我们可以使用以下方法配置视图的大小

//配置Today Extension展示视图的大小
self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 100);复制代码

实现下面的协议,配置边距,否则会发现一个问题:绘制的内容与左侧边界有一定距离。

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {//配置边距为0return UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);}复制代码

我们创建一个lable来充满视图,并且点击可打开我们的app

//Today Extension的页面加一个可点击打开containingAPP的label
UILabel *openAppLabel = [[UILabel alloc] init];
openAppLabel.textColor = [UIColor colorWithRed:(97.0/255.0) green:(97.0/255.0) blue:(97.0/255.0) alpha:1];
openAppLabel.backgroundColor = [UIColor clearColor];
openAppLabel.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 100);
openAppLabel.textAlignment = NSTextAlignmentCenter;
openAppLabel.text = @"点击打开app";
openAppLabel.font = [UIFont systemFontOfSize:15];
[self.view addSubview:openAppLabel];openAppLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *openURLContainingAPP = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(openURLContainingAPP)];
[openAppLabel addGestureRecognizer:openURLContainingAPP];复制代码

打开app

Today Extension只能通过openURL的方式来调起app,并且需要在info.plist文件中配置参数URL types,
app工程中配置如下

app schemes

Today Extension如下图

跳转URL types设置

URL identifier为app的bundle ID,URL Schemes配置为app的scheme
并且调用以下代码来打开app

//通过openURL的方式启动Containing APP
- (void)openURLContainingAPP
{//scheme为app的scheme[self.extensionContext openURL:[NSURL URLWithString:@"scheme://xxxx"]completionHandler:^(BOOL success) {NSLog(@"open url result:%d",success);}];
}复制代码

demo代码,由于后面的步骤是需要苹果开发者账号才能操作,所以demo的代码到这里为止。

数据共享

首先需要去苹果开发者中心的APP Groups中创建一个APP Group,命名方式"group.com.companyName.xxx",如下图

创建App Group

完成之后你还要做以下修改

  1. 编辑你的contain app的APP ID,Service中选中App Groups,并且点击右边的Edit按钮选中刚刚创建的group,返回后,点击Done完成APP ID的编辑
  2. 此时contain app的Provisioning Profiles文件会显示为无法使用,需要更新下文件,并且下载下来覆盖安装

Today Extension工程与app工程的配置都如下图所示

App Groups设置

通过App Groups提供的同一group内app共同读写区域,可以用NSUserDefaults和NSFileManager两种方式实现Today Extension和containing app之间的数据共享。

通过NSUserDefaults共享数据

- (void)saveDataByNSUserDefaults
{NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];[shared setObject:@"test" forKey:@"widget"];[shared synchronize];
}- (NSString *)readDataFromNSUserDefaults
{NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];NSString *value = [shared valueForKey:@"widget"];return value;
}复制代码

通过NSFileManager共享数据

- (BOOL)saveDataByNSFileManager
{NSError *error = nil;NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx.xxx"];containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];NSString *value = @"test";BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&error];if (!result) {NSLog(@"%@",error);} else {NSLog(@"save value:%@ success.",value);}return result;
}- (NSString *)readDataByNSFileManager
{NSError *error = nil;NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx.xxx"];containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:NSUTF8StringEncoding error:&error];return value;
}复制代码

这样就实现了Today Extension与app的数据共享

真机调试与打包

我们把Today Extension当作一个单独的app,各自有自己的App ID和Provisioning profile. 在Xcode里是两个Target给不同的target设置自己的bundleID和Provisioning profile。所以你需要按以下步骤操作,才能真机调试以及打包

去苹果开发者中心操作以下步骤

  1. 需要为Today Extension创建一个APP ID,一般命名方式为你的contain app的bundle id加上你创建的Today Extension工程名"com.companyName.xxx.xxx",App Services中勾选上App Groups,完成创建。如下图

    Today Extension APP ID设置
  2. 去Provisioning Profiles中创建Today Extension对应的profile文件,下载下来,安装,真机调试和打包需要用到,如下图
    Today Extension profile文件
  3. 将Today Extension的bundleID修改为刚刚为Today Extension创建的APP ID
  4. Today Extension版本号与contain app配置一致,否则审核上传的时候会有警告
  5. 打包或者真机调试的时候contain app与Today Extension选择各自的profile文件。

完成以上的准备工作之后,我们就可以开始真机调试以及打包了。

总结

本篇暂时只是Today Extension简单的功能实现,我会在后面更新iOS10的适配,以及其他功能使用。如果有错误的地方欢迎指出~谢谢~

扩展阅读

  1. WWDC2014之App Extensions学习笔记

希望对您有帮助,如果文章中有问题,欢迎评论留言~,谢谢支持~欢迎关注,我会在空余时间更新技术文章~

iOS之widget开发(Today Extension)相关推荐

  1. 如何进行 iOS Widget 开发?

    简介:iOS 14 重磅推出了新功能 Widget,可以在主屏上展示一些关键信息,如日程.待办事项.设备电量等.Widget 的设计定位是什么?有哪些限制?如何进行 Widget 开发?本文基于一个小 ...

  2. iOS Widget开发

    前言: 想了解什么是Widget的童鞋请绕道,想在项目中添加Widget的同学,请耐心往下看 首先看一下我们需要实现的效果:仿网易云音乐和仿支付宝两个效果    总效果图(左)  仿网易云音乐展开后的 ...

  3. iOS14 Widget开发踩坑(五)定位与地图的使用

    iOS14 Widget开发踩坑(五)定位与地图的使用 前言 分析 实现案例 地图 定位 问题 适配黑暗模式 2022年12月15日已解决 中心点偏移问题 2022年12月19日已解决 延迟问题 本篇 ...

  4. 【iPone(iOS)相关开发】

    =====================以下iPhone(iOS)开发相关=============================== 001) 开发iOS应用软件的相关条件? 0> 基于I ...

  5. 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结

    本节书摘来自异步社区<iOS 8应用开发入门经典(第6版)>一书中的第1章,第1.6节小结,作者 [美]John Ray(约翰 雷),更多章节内容可以访问云栖社区"异步社区&qu ...

  6. 《iOS 6高级开发手册(第4版)》——1.11节秘诀:获取和使用设备姿势

    本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异 ...

  7. 《iOS 9应用开发入门经典(第7版)》——第2章,第2.4节小结

    本节书摘来自异步社区<iOS 9应用开发入门经典(第7版)>一书中的第2章,第2.4节小结,作者 [美]约翰 雷(John Ray),更多章节内容可以访问云栖社区"异步社区&qu ...

  8. (0071)iOS开发之Category VS Extension区别理解

    转载: http://www.cocoachina.com/bbs/read.php?tid=235729 http://www.cocoachina.com/ios/20170406/19001.h ...

  9. 《iOS 6核心开发手册(第4版)》——2.1节UIControl类

    本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.1节UIControl类,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...

最新文章

  1. timer定时器_拾遗Timer定时器
  2. Matlab 训练深度学习模型函数 trainingOptions
  3. 单片机驱动DM9000网卡芯片(详细调试过程)【下】
  4. WORD文档中的表格:自定义方式的批处理,增删行列和内容
  5. android linux kernel VS standard linux kernel
  6. Fusionapp历史记录加收藏夹加清除缓存.fas源码
  7. 推荐几款好用的文本编辑器
  8. 移动端Vue3框架demo
  9. php京东接口开发,技术文档
  10. SAP License:ERP项目升级评标会偶遇以前同事感慨
  11. java spfa_SPFA算法简介
  12. eclipse SVN插件的缓存清理
  13. windows聚焦 电脑锁屏不显示图片问题
  14. javac编译带有package的java文件
  15. 常用标点符号中英文对照表
  16. [Intellij IDEA] 通过学生认证免费激活IDEA
  17. 看完这篇文章APP关键词覆盖增加70000|互联网行业公会
  18. Unity 重要概念
  19. 微软PDC2008西游记(1)从北京到洛杉矶
  20. Redis 的高并发实战:抢购系统 --浅奕

热门文章

  1. java空指针避坑指南
  2. java字符串去重复_java去除字符串中重复、不重复、消除重复后字符
  3. matlab作业参考4,matlab第四章作业
  4. 【trie树】HDU1247Hat’s Words
  5. Shell之awk常用用法
  6. [C#] C# 知识回顾 - 装箱与拆箱
  7. 计算 1!+2!+3!+……+10!
  8. Android Service 之 AIDL
  9. DebootstrapChroot
  10. university of liverpool writing techniques