服务器之家

服务器之家 > 正文

iOS开发 widget构建详解及实现代码

时间:2021-02-06 14:08     来源/作者:iOS开发网

ios开发之widget实现

前言

    ios extension的出现,方便了用户查看应用的服务,比如用户可以在today的widgets中查看应用的简略信息,然后点击进入相关的应用界面。
暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友。

iOS开发 widget构建详解及实现代码

图1 today的widget展示----以支付宝为例说明

文章将依次从以下几个问题着手,进行详细说明:
1、如何为现有的工程添加widget;
2、如何绘制ui;
3、如何调起app;
4、如何与host app共享数据。

添加today extension

iOS开发 widget构建详解及实现代码

图2 添加today的target

   如图,为现有的工程添加today extension,命名这里不赘述了,大家都懂的。

iOS开发 widget构建详解及实现代码

图3 添加today之后的工程目录

    这是添加today extension之后的工程目录。
    到这里,为现有的工程添加today extension算是完成了,运行程序就可以看到类似图1的简单的效果了,很简单哈。

绘制ui

    与网上发表文章的童鞋们一样,我也是个代码控(装b一下),习惯用纯代码来绘制today的ui。

iOS开发 widget构建详解及实现代码

图4 删除默认创建的maininterface并修改info.plist

    这里,删除默认创建的maininterface.storyboard,并按图4所示修改info.plist文件。(当然,习惯使用storyboard的童鞋可以略过,直接操作storyboard即可)

iOS开发 widget构建详解及实现代码

图5 设置widget展示视图的大小

    首先,设置widget展示视图的大小。关于widget的背景色,以及具体展示的内容大家按需绘制,这里暂且不表。

iOS开发 widget构建详解及实现代码

图6 设置widget视图距离左侧边界距离为0

    运行程序后,会发现一个问题:绘制的内容与左侧边界有一定距离(约30px)。如何解决这个问题呢,如图6所示,todayviewcontroller遵守的ncwidgetproviding协议给出了解决方案。

调起app

    因为extension和containing app是两个完全独立的进程,所以它们之间不能直接通信(不能像应用内部点击按钮,跳转到指定页面)。为了实现widget调起app,这里通过openurl的方式来启动containing app。

- (void)openurlcontainingapp{ //通过extensioncontext借助host app调起app [self.extensioncontext openurl:[nsurl urlwithstring:@"appextension://xxx"] completionhandler:^(bool success) { nslog(@"open url result:%d",success); }]; }

 

数据共享

iOS开发 widget构建详解及实现代码

图7 添加app groups

   通过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];
}
读取数据
- (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
保存数据
- (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;
}
读取数据
- (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中可以浏览预设的快捷服务.

      感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部