Widget就是iPhone左滑展示出来的小窗口,我理解为——自家app的又一个入口,哈哈。比如下图中的天气。
其实就觉得这个东西比较神奇好玩儿才打算试试的,但是其中,却遇到了很多的问题。接下里就系统的记录一下,如何简单的实现这个小的东西,和其中自己遇到的一些问题吧。源代码点这里。
首先我是创建了一个新的工程,其次因为Widget是一个独立的进程,所以我们要再创建一个target,File —— New —— Target 然后选择Today Extension.
创建好工程之后,就可以先进行代码的编写了。但是这里有几个问题问题需要注意。
1、如果在Extension中用到了需要配置路径的第三方库,需要切换到Extension中的Target中进行配置。
2、我是用cocoapod管理第三方工具的,所以这个时候,进行第三方管理的时候,需要区分是给那个target添加第三方库。
3、当代码及库都配置好之后,就需要进行代码的运行了,这个时候为了将两个进程联系起来,就需要添加组了。两个进程一定要加到同一个组里面,并且,组要和BundleID一致。同时配置BundleID的时候,主进程是正常配置,但是Widget进程的BundleID的格式是BundleID.工程名称。这点需要注意。其实默认的格式是正确的,只要按着格式改成自己的BundleID就好,但是就怕遇到像我这种,看都不看直接改的。所以这里需要注意啊~~~
4、运行代码之前还有一个配置需要修改。直接上图,按照图修改就好。一定要改这里,否则的话是加载不出来的。
需要配置的差不多就这些了,但是这些都是很重要的,很容易造成最后显示的效果就是无法载入,这是最悲伤的了。接下来是关于Widget的一些基本信息的内容吧。
1、Widget有两种模式,一种是展开状态,一种是隐藏状态。通过代码可控制。
/*设置widget的展示模式:
NCWidgetDisplayModeExpanded 展开
NCWidgetDisplayModeCompact 隐藏
*/
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
2、Widget的样式是可以通过更改展开模式的协议方法来进行更改的。比如高度的修改。
//隐藏展开模式改变是调用此方法
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize
{
if(activeDisplayMode == NCWidgetDisplayModeCompact)
{
self.preferredContentSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, 110);
}
else
{
self.preferredContentSize = CGSizeMake([[UIScreen mainScreen] bounds].size.width, 210);
}
}
3、Widget的高度,一般来说最低是110,也就是说,当设置widget的高度时,低于110的均是110。
4、设置好模式和高度之后,就可以正常的创建Widget的页面了,但是页面不要太过复杂,通过查看资料,Widget页面能承载的最大内存是11M。
5、设置页面之后,如果与app主体有交互,首先需要页面点击事件通过以下调起URL的方式来进行反馈。这个方法其实是跟app外部通过URL来调起app是一样的道理,所以同样的也需要设置一个scheme URL,这个过后还会有说明。
6、页面代码完成之后,相应了,为了能调起app需要在AppDelegate中配置相应的代码。
7、刚说过,如果要调起app需要配置一下scheme URL,这里是要配置app主体的scheme URL。配置规则则是与之前代码中设置的URL的规则保持一致。
都配置完成之后,运行代码之后,应该就可以了。但是这个时候左滑会看不到自己的小窗口。其实是因为自己没有加入而已。只需要点击那个编辑,然后加入自己的widget就可以啦!
最近做Widget差不多遇到的就这些问题了,目前做的很简单,只是页面的展示,并没有数据的交互和刷新之类的。就以后继续补充吧。