iOS:Today Extension
PS:此文仅作对TodayExtension的一些简单的使用,且大多参看前辈文章所写,作者目前水平尚水….
学无止境,多多指教
Extension是iOS8引入的一个非常重要的新特性,主要是为了改善iOS沙盒机制对应用间通信限制,让app之间的数据交互成为可能,用户可以在app中使用其他应用提供的功能,而无需离开当前的应用。
iOS 8系统有6个支持扩展的系统区域(也称为扩展点),
今日(Today)-在下拉通知的“今天”的界面中添加一个小插件
分享(Share)-点击分享按钮后,将网站或者图片通过应用分享
操作(Action)-点击Action按钮后发送内容到应用
图片编辑(Photo Editing)-在系统的照片应用中提供编辑的功能
文档管理(Document Provider)-提供和管理文件内容
自定义键盘(Custom keyboard)-自定义键盘和输入法
iOS 9新增了4个扩展点:
音频单元(Audio Unit)-为音乐App提供扩展功能,例如GarageBand
Spotlight索引(Spotlight Index)- Spotlight搜索扩展
共享的链接(Shared Links)-Safair共享的连接扩展
广告拦截(Content Blocker)-Safair广告拦截扩展
-----------------------------------------搜了一段----------------------------------------------
本次主要是介绍Today Extension的应用吧:
1、创建
ps:扩展点不能独立存在,所以应创建于原有工程基础上
在原用工程中,点击Xcode菜单的File->New->Target,选择iOS中的ApplicationExtension的Today Extension。
填写Today名字之后出现一个alert;这个选择无关要紧、因为我们可以自己在scheme中更改
选择Activate之后:
当然也可以自己改回来
选择此种方式只是方便调试罢了,区别WidegetsDemo这个scheme只是不用把通知栏了拉下来罢了.......
检查一下我们工程,发现多出4个文件
点击storyBoard、我修改了一下原有label的文字
command + R选择Today点击run就可以看到文章首图片的效果
当然,在扩展中我们的名字可以与应用不一:
还记得我们新增添的文件吧?提醒到这估计大家都会明白了,直接在新增plist文件中修改Bundle display name即可
当然,widget的高度是可调整的
尝试了下在storyBoard中修改VC的view属性,SB中显示是作出了修改的,但是模拟器跑出来的却依然高度为默认值(得再找找在SB上修改高度的方法)
在代码区写入[self setPreferredContentSize:CGSizeMake(0, 100)];则成功地修改了widget的高度
PS:如果在SB下修改的话,最好写在awakeFromNib中啦,当然也可以随时修改wideget的高度只要在手势或者是target-action中添加即可(可以以此做一些伸缩动画)。
如果选择代码布局工程的话,就把SB删掉吧…同时配置plist文件的字段:
将NSExtensionMainStoryboard删除掉
使用NSExtensionPrincipalClass替代之
嗯,之后我们就可以沉浸在代码的海洋里啦~~~你想怎么搞就怎么搞…
细心的同学肯定发现我上面label中怎么是不居中而是有一定的偏移的呢?给了VC属性view一个颜色却发现其存在一定的缩进
此外打印台出现了一个警告、这是设置了背景颜色之后才出现的,取消则消失:
相信很多同学都已经发现是VC是遵循NCWidgetProviding协议的,那么在里面能否找我我们心仪的方法呢!
打开
发现里面有仨方法
//今日扩展的刷新设置,内容刷新完调用
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResultresult))completionHandler {
// If an error is encountered, use NCUpdateResultFailed
// If there's no update required, use NCUpdateResultNoData
// If there's an update, use NCUpdateResultNewData
[self updateWithCurrencyData];
completionHandler(NCUpdateResultNewData);
}
//界面左侧的偏移量
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets{
return UIEdgeInsetsZero;//使左侧默认留白区域被填充
}
//实现vibrancy特效 (还是不清楚这里是怎么用...)
+ (UIVibrancyEffect *)notificationCenterVibrancyEffect;
那么在这里我们就是用第二方法,
调用后成功是的界面的缩进量减为0
加量个button试了下、确实可以响应
接下来、如何做到点击widget就能点进去应用呢?
需要使用Open URL的方式打开
首先在容器APP的plist文件上添加
在容器APP的AppDelegate中添加如下代码:
然后在TodayExtension那边的一个button的事件中加入
来跑一个?OK,这样我们就成功进入到APP
前面都可以说是一些简单的小菜吧。
下面来正题:探讨下与容器APP之间的数据的共享
方式:通过AppGroup来共享数据,同属于一个group的App可以共同访问并修改某个数据。
到容器APP中target位置点击Capabilities创建一个group,同时也在targets中的TodayExtension中加入到这个group中,这样我们就可进行数据的共享了。(此处是没有申请证书的……)
详细的流程为:
Shared User Defaults:
选中Host App Target -> Capabilities,找到App Groups,设置为ON。这时,Xcode会连接developer.apple.com,自动到我的开发者账号中寻找app group,过一会儿就会列出所有曾经创建过的app group。点击加号创建一个新的。命名方式:group.TE/*名字最好具体一点*/。Xcode会自动把新创建的app group添加到开发者账号中。
在Extension中重复以上步骤(不需要创建新的),在列表中选中刚刚创建的就好。
注意:打开了app group之后,Xcode会自动创建一个entitlements文件,在工程的根目录下。在Build Settings -> Code Signing -> Code Signing Entitlements中,也能看到这个文件名。因为多了这个entitlements,所以,相应的Provisioning Profile也需要重新生成,生成的步骤和以前相同。
且据说这俩证书是收费的,如果没有去申请的话,一个帐号可免费测试10个证书,容器APP一个,TodayExtension扩展点一个,也就是说一个带Today扩展的应用需要俩证书。
容器APP VC处
TodayExtensionVC处
成功地收到容器APP的数据。
Failed to inheritCoreMedia permissions from439: (null)
又是小警告,真不知道是什么鬼。。。有大神说用command+shift+K clean一下项目可是用了后连打印台都不工作了。。。再command+R还是出现这样的错误(再看看吧~~~)
当然,上面只是一个小小的数据共享演示,一般的话我还是会运用归档和解档去进行数据的共享的。
另外:如果想要在容器APP中控制TodayExtension的话可以在容器APP中如下操作(实质上我们在依在Today直接edit处理掉…)
#import <NotificationCenter/NotificationCenter.h>
[[NCWidgetControllerwidgetController]setHasContent:NO/*YES为显示NO为隐藏*/forWidgetWithBundleIdentifier:@"wizet.WidgetsDemo.TodayExtension"];
最后附上几篇参考文章:
http://wangchao0802.blog.163.com/blog/static/5022249920151221338677/
http://www.hmttommy.com/2014/11/02/widget/#u4E0A_u4F20_u6CE8_u610F_u4E8B_u9879
http://www.cnblogs.com/xdream86/p/3855932.html
http://www.cocoachina.com/ios/20141023/10027.html
http://www.tuicool.com/articles/UfI7vy6