iOS 使用Swift开发Widget

最近玩手机发现了widget这个app外的控件还是蛮有意思的,于是在上网查了一下资料,是iOS 8的系统开始开放的一个快捷显示操作功能,这个功能弥补了没有3D touch功能的iPhone。虽然网上百度可以查看到很相关的开发资料,但是我发现基本上都是Objective-C的例子,关于Swift开发的我仅仅只是看到了一篇(可能有一些我没看到),主要是都不够详细,作为一个新手的我,也为了让新手们少爬一些坑,我将详细为大家讲解如何玩转这个widget功能。附上图片

屏幕快照 2017-02-17 11.24.25.png

开发环境:Xcode 8.2.1
开发语言:Swift 3.0(以上)

1.第一步:如何创建widget
如何创建?在网上有已经有很多了,这里我还是给大家截图一下:

屏幕快照 2017-02-17 11.30.49.png
屏幕快照 2017-02-17 11.31.42.png

选择Today Extension ,点击Next ,项目中就会自动创建一个如下图所示的文件夹:

屏幕快照 2017-02-17 11.35.22.png

(这里的swiftWidget文件夹是我自己命名的)

屏幕快照 2017-02-17 11.37.32.png

里面有一个TodayViewController.swift、MainInterface.storyboard和Info.plist文件(里面的image的两个文件夹是我后来放的图片)

到这里就创建完成了!可以运行下看看效果(建议真机上运行效果更加)

2.第二步:界面UI布局
widget的UI布局,一般来讲以iOS 10为分界线,iOS 10和10以上是一种,iOS 8至iOS 10(不包含iOS 10)又是一种,如下图:

iOS 10及以上.png
iOS 10以下.png

主要是背景的不同,虽然widget也可以自定义背景色,但是最好还是用系统自带的!这里我给了两套UI。

编写UI界面布局有两种,这里要注意用纯代码编写需要修改widget文件夹里面的Info.plist文件里面的NSExtension的配置文件:如下

NSExtensionMainStoryboard:MainInterface(你的storyboard)这个是默认的

屏幕快照 2017-02-17 13.45.54.png

NSExtensionPrincipalClass:TodayViewController(你widget控制器的名称)

屏幕快照 2017-02-17 13.48.24.png

重点注意:(我自爬出来的坑)
用Swift开发(目前的swift3.0版本)widget的UI布局必须用storyboard拉取控件,也就是上面默认的,如果你用纯代码编写是不会有效果出来的(本人也是个纯代码控,这里Swift这个坑确实难搞,我经过数十次的尝试才发现这个bug。网上根本没有人记载,apple官方文档我也看不懂,问大神也不知道是怎么回事,爬坑的过程是痛苦的...。如果有大神知道如何用Swift纯代码来布局UI的话,迫切希望您能告诉我,我也收回说这是Swift语言的bug的话)。但是Objective-C两者都行,这里我只说Swift如何来写。


用storyboard来编写UI布局.png

具体如何给约束,还是你们自己去搞吧!这个不难!当然Swift虽说不能用纯代码来UI,但是用storyboard拉取控件定义的属性和方法还是必须要用代码来写的,要不然就不能开发widget了!_
对于如何使用两套UI,这个就要根据iOS 系统来做判断,改变image了!

3.证书申请:
如果要上架的,那么必须要申请证书了。我的这个demo一开始就用的证书运行的(本人强迫症,只要真机运行就要用证书)这里我就跟大家讲讲需要注意哪些事情:
因为widget是一个单独的控件,所有它是需要独立的bundle ID和证书的

widget的证书.png

当然主app的bundle ID也是一样的,但是两者不能相同的名字,这里我用的企业级证书申请的。

这里要注意的是widget是app的一个组件,要数据共享的话,这里涉及到一个叫做App Groups的id设置和申请:

BFF39167-B2C0-4E39-91A8-3489F6E2953D.png

注意主app的id和widget的id设置都需要打开App Groups这个功能,这里我只用widget的id的截图做示范:

widget ID的App Groups和主app ID的App Groups都需要开启.png

还需要与你申请的App Groups的ID和主app的ID相关联,如果你之前就已经申请了证书但是未关联的话,请编辑bundle ID,重新添加:

CB86CBB5-697E-4EE4-A491-C1C9DE02905A.png
选中申请的App Groups的ID.png

然后在Xcode中一定要重新更新证书,打开App Groups:

主app和widget都需要打开这里选中组件id.png
主app的App Groups.png

(一定能要更新证书后才能使用哦!因为苹果的证书在网站上更新后,在你的xcode中并没有更新,他会重新生成一个新的,需要你手动删除再添加)。

至此,证书和App Groups的添加完成。如果有报错,请仔细检查(你要相信,程序是不会故意报错的;有错误,一定是你那里没有做好,在自己身上找原因)。

4.数据共享和传输:
有了上面的App Groups的添加,我们就可以用代码进行数据传输和共享了。一般来讲,widget这个功能只是在手机上快捷显示的数据和操作的功能,你可以用你手机上的支付宝来进行测试操作一下。

这里我把代码截图出来,我用的UserDefaults来存储数据,在主app里面进行判断,打开相应的界面。

在TodayViewController里面进行相应的操作.png

注意因为widget是单独的控件操作,所以这么的点击widget上的按钮,跳转到主app,需要给主app一个URL Schemes:

主app的URL Schemes.png

然后在主app里面进行判断你存储的数据(这里要注意,iPhone的程序有两种情况,一种是在后台状态,一种是程序完全关闭状态),跳转相应的界面。说明一下,我上面的充电状态是我自己给的死数据,没有做相关的数据共享操作,自己思考解决,很简单的。如果有需要demo的,请在github下载:https://github.com/chenwupeng/CCwidget/tree/7f28c5f458a38cb174b7e038dc21db7a7710dcd6
总结一下,这次用Swift开发Widget,确实走了很多弯路,不过还好的是,从坑里爬起来了,也希望苹果能快点把这个坑填起来!在这里,希望我的这篇文章能对同行的你们有些帮助,如果发现有关swift开发的坑,尽量会帮大家指出来!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,010评论 4 62
  • 虽说每天都是24小时,对每个人都没有差别。可是度过的方式不同,感受又千差万别。 有人只是简单的重复前一天,有人却在...
    呼啦啦啦飞阅读 278评论 0 0
  • 我把眼泪藏在心里 不想让你看见 没想到汇成了河 于是我筑起了高高的大坝 并小心防护不让它决堤 没想到时间让它变成了...
    yiyi_4f59阅读 199评论 0 0
  • 读太白、明远乐府诗《夜坐吟》,复忆裕之《雁邱词》有感。故作之。 清夜晓寒霜露重,玉阶不澄离草泣。 离草泣,霜叶枯,...
    玉階生白露阅读 362评论 1 2
  • 这座小城已有三百年历史。 有阳光、有海岸、有椰子树,有高大豪华的大楼,有破旧的篷房,有豪华的超五星级酒店,有路边烧...
    狗熊的熊阅读 113评论 0 0