iOS之widget开发(Today Extension)
前言
extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。
extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today Extension中查看应用展示的简略信息,而不用再进到我们的应用中,同样可以快捷操作app的功能,这将是一种全新的用户体验。
今天我们介绍一下给工程添加Today Extension的步骤。
添加Today Extension工程
在原有的工程基础上,想要使用Today Extension,我们需要创建一个新的target,点击File-->New-->Target-->Today Extention,如下图所示:
添加成功后项目的目录会如下图所示:
运行项目会看到如下图所示的效果:
定制UI
由于我习惯使用纯代码写UI,所以我会选择删除默认创建的MainInterface.storyboard,并在info.plist中删除NSExtensionMainStoryboard,添加NSExtensionPrincipalClass为TodayViewController,如下图所示:
我们可以使用以下方法配置视图的大小
//配置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工程中配置如下
Today Extension如下图
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",如下图
完成之后你还要做以下修改
- 编辑你的contain app的APP ID,Service中选中App Groups,并且点击右边的Edit按钮选中刚刚创建的group,返回后,点击Done完成APP ID的编辑
- 此时contain app的Provisioning Profiles文件会显示为无法使用,需要更新下文件,并且下载下来覆盖安装
Today Extension工程与app工程的配置都如下图所示
通过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。所以你需要按以下步骤操作,才能真机调试以及打包
去苹果开发者中心操作以下步骤
- 需要为Today Extension创建一个APP ID,一般命名方式为你的contain app的bundle id加上你创建的Today Extension工程名"com.companyName.xxx.xxx",App Services中勾选上App Groups,完成创建。如下图
- 去Provisioning Profiles中创建Today Extension对应的profile文件,下载下来,安装,真机调试和打包需要用到,如下图
- 将Today Extension的bundleID修改为刚刚为Today Extension创建的APP ID
- Today Extension版本号与contain app配置一致,否则审核上传的时候会有警告
- 打包或者真机调试的时候contain app与Today Extension选择各自的profile文件。
完成以上的准备工作之后,我们就可以开始真机调试以及打包了。
总结
本篇暂时只是Today Extension简单的功能实现,我会在后面更新iOS10的适配,以及其他功能使用。如果有错误的地方欢迎指出~谢谢~
扩展阅读
- WWDC2014之App Extensions学习笔记
希望对您有帮助,如果文章中有问题,欢迎评论留言~,谢谢支持~欢迎关注,我会在空余时间更新技术文章~
iOS之widget开发(Today Extension)相关推荐
- 如何进行 iOS Widget 开发?
简介:iOS 14 重磅推出了新功能 Widget,可以在主屏上展示一些关键信息,如日程.待办事项.设备电量等.Widget 的设计定位是什么?有哪些限制?如何进行 Widget 开发?本文基于一个小 ...
- iOS Widget开发
前言: 想了解什么是Widget的童鞋请绕道,想在项目中添加Widget的同学,请耐心往下看 首先看一下我们需要实现的效果:仿网易云音乐和仿支付宝两个效果 总效果图(左) 仿网易云音乐展开后的 ...
- iOS14 Widget开发踩坑(五)定位与地图的使用
iOS14 Widget开发踩坑(五)定位与地图的使用 前言 分析 实现案例 地图 定位 问题 适配黑暗模式 2022年12月15日已解决 中心点偏移问题 2022年12月19日已解决 延迟问题 本篇 ...
- 【iPone(iOS)相关开发】
=====================以下iPhone(iOS)开发相关=============================== 001) 开发iOS应用软件的相关条件? 0> 基于I ...
- 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结
本节书摘来自异步社区<iOS 8应用开发入门经典(第6版)>一书中的第1章,第1.6节小结,作者 [美]John Ray(约翰 雷),更多章节内容可以访问云栖社区"异步社区&qu ...
- 《iOS 6高级开发手册(第4版)》——1.11节秘诀:获取和使用设备姿势
本节书摘来自异步社区<iOS 6高级开发手册(第4版)>一书中的第1章,第1.11节秘诀:获取和使用设备姿势,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异 ...
- 《iOS 9应用开发入门经典(第7版)》——第2章,第2.4节小结
本节书摘来自异步社区<iOS 9应用开发入门经典(第7版)>一书中的第2章,第2.4节小结,作者 [美]约翰 雷(John Ray),更多章节内容可以访问云栖社区"异步社区&qu ...
- (0071)iOS开发之Category VS Extension区别理解
转载: http://www.cocoachina.com/bbs/read.php?tid=235729 http://www.cocoachina.com/ios/20170406/19001.h ...
- 《iOS 6核心开发手册(第4版)》——2.1节UIControl类
本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.1节UIControl类,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...
最新文章
- timer定时器_拾遗Timer定时器
- Matlab 训练深度学习模型函数 trainingOptions
- 单片机驱动DM9000网卡芯片(详细调试过程)【下】
- WORD文档中的表格:自定义方式的批处理,增删行列和内容
- android linux kernel VS standard linux kernel
- Fusionapp历史记录加收藏夹加清除缓存.fas源码
- 推荐几款好用的文本编辑器
- 移动端Vue3框架demo
- php京东接口开发,技术文档
- SAP License:ERP项目升级评标会偶遇以前同事感慨
- java spfa_SPFA算法简介
- eclipse SVN插件的缓存清理
- windows聚焦 电脑锁屏不显示图片问题
- javac编译带有package的java文件
- 常用标点符号中英文对照表
- [Intellij IDEA] 通过学生认证免费激活IDEA
- 看完这篇文章APP关键词覆盖增加70000|互联网行业公会
- Unity 重要概念
- 微软PDC2008西游记(1)从北京到洛杉矶
- Redis 的高并发实战:抢购系统 --浅奕
热门文章
- java空指针避坑指南
- java字符串去重复_java去除字符串中重复、不重复、消除重复后字符
- matlab作业参考4,matlab第四章作业
- 【trie树】HDU1247Hat’s Words
- Shell之awk常用用法
- [C#] C# 知识回顾 - 装箱与拆箱
- 计算 1!+2!+3!+……+10!
- Android Service 之 AIDL
- DebootstrapChroot
- university of liverpool writing techniques