前言
ios extension的出现,方便了用户查看应用的服务,比如用户可以在today的widgets中查看应用的简略信息,然后点击进入相关的应用界面。
暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友。
文章将依次从以下几个问题着手,进行详细说明:
1、如何为现有的工程添加widget;
2、如何绘制ui;
3、如何调起app;
4、如何与host app共享数据。
添加today extension
如图,为现有的工程添加today extension,命名这里不赘述了,大家都懂的。
这是添加today extension之后的工程目录。
到这里,为现有的工程添加today extension算是完成了,运行程序就可以看到类似图1的简单的效果了,很简单哈。
绘制ui
与网上发表文章的童鞋们一样,我也是个代码控(装b一下),习惯用纯代码来绘制today的ui。
这里,删除默认创建的maininterface.storyboard,并按图4所示修改info.plist文件。(当然,习惯使用storyboard的童鞋可以略过,直接操作storyboard即可)
首先,设置widget展示视图的大小。关于widget的背景色,以及具体展示的内容大家按需绘制,这里暂且不表。
运行程序后,会发现一个问题:绘制的内容与左侧边界有一定距离(约30px)。如何解决这个问题呢,如图6所示,todayviewcontroller遵守的ncwidgetproviding协议给出了解决方案。
调起app
因为extension和containing app是两个完全独立的进程,所以它们之间不能直接通信(不能像应用内部点击按钮,跳转到指定页面)。为了实现widget调起app,这里通过openurl的方式来启动containing app。
1
2
3
4
5
6
|
- ( void )openurlcontainingapp{
//通过extensioncontext借助host app调起app
[self.extensioncontext openurl:[nsurl urlwithstring:@ "appextension://xxx" ] completionhandler:^( bool success) {
nslog(@ "open url result:%d" ,success);
}];
}
|
数据共享
通过app groups提供的同一group内app共同读写区域,可以用nsuserdefaults和nsfilemanager两种方式实现extension和containing app之间的数据共享。
1 通过nsuserdefaults共享数据
保存数据
1
2
3
4
5
6
|
- ( void )savedatabynsuserdefaults{
nsuserdefaults *shared = [[nsuserdefaults alloc] initwithsuitename:@"group.c
om.xxx"];
[shared setobject:@ "asdfasdf" forkey:@ "widget" ];
[shared synchronize];
}
|
读取数据
1
2
3
4
5
6
|
- (nsstring *)readdatafromnsuserdefaults{
nsuserdefaults *shared = [[nsuserdefaults alloc] initwithsuitename:@"group.c
om.xxx"];
nsstring *value = [shared valueforkey:@ "widget" ];
return value;
}
|
2 通过nsfilemanager共享数据
保存数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- ( bool )savedatabynsfilemanager{
nserror *err = nil;
nsurl *containerurl = [[nsfilemanager defaultmanager] containerurlforsecuri
tyapplicationgroupidentifier:@ "group.com.xxx" ];
containerurl = [containerurl urlbyappendingpathcomponent:@"library/caches/
widget"];
nsstring *value = @ "asdfasdfasf" ;
bool result = [value writetourl:containerurl atomically:yes encoding:nsutf8stringencoding error:&err];
if (!result) {
nslog(@ "%@" ,err);
} else {
nslog(@ "save value:%@ success." ,value);
}
return result;
}
|
读取数据
1
2
3
4
5
6
7
8
9
10
|
- (nsstring *)readdatabynsfilemanager{
nserror *err = nil;
nsurl *containerurl = [[nsfilemanager defaultmanager] containerurlforsecuri
tyapplicationgroupidentifier:@ "group.com.xxx" ];
containerurl = [containerurl urlbyappendingpathcomponent:@"library/caches/
widget"];
nsstring *value = [nsstring stringwithcontentsofurl:containerurl encoding:
nsutf8stringencoding error:&err];
return value;
}
|
到这里,在today中添加应用的widget就完成了,从today中可以浏览预设的快捷服务,在文章ios 10 today widget中接着说ios 10的适配问题。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.jianshu.com/p/ca3e11d7686c