美文网首页
iOS:Today Extension

iOS:Today Extension

作者: wizet | 来源:发表于2016-06-06 11:31 被阅读735次

    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:

    创建一个app group流程

    选中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

    http://www.jianshu.com/p/e669daa714b2

    http://www.cocoachina.com/ios/20150417/11597.html

    相关文章

      网友评论

          本文标题:iOS:Today Extension

          本文链接:https://www.haomeiwen.com/subject/genrdttx.html