成都网站建设设计

将想法与焦点和您一起共享

ios开发widget,iOs开发是什么意思

iOS14 Widget小组件开发实践5——网络图片的加载

以上都是使用 Image 加载本地图片资源,但是 SwiftUI 中的 Image 没有提供直接加载 URL 方式的图片显示,那么如何在 SwiftUI 中让 Image 加载网络图片呢,可以采用异步加载网络图片数据,由 data 转换成 UIimage ,再给 Image 展示

在天柱等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站制作 网站设计制作按需规划网站,公司网站建设,企业网站建设,品牌网站设计,全网整合营销推广,外贸网站制作,天柱网站建设费用合理。

但是这种异步加载图片的方式在 Widget 中却失效了, Image 显示不了图片。

在 TimelineProvider 的 getTimeline 中 completion(timeline) 执行完之后,不再支持图片的异步回调了,所以必须在数据请求回来的处理中采用同步方式,将图片的 data 获取,转换成 UIimage ,在赋值给 Image 展示。

接下里给 iOS14 Widget小组件开发实践2——自定义Widget 里搭建的古诗视图增加一个网络封面图片显示,效果如下:

因为这个免费的 API 接口没有返回图片封面数据,所以就自己网上找个图片用来测试。关于图片请求的时机,这里我是将它放在了 API 接口回调后处理 json 转 model 的这一步:

最后在给 PoetryWidgetView 布局界面:

SwitUI-实现URL图片显示

iOS14 Widget小组件开发实践3——Widget点击交互

根据官方文档的描述,点击 Widget 窗口唤起 APP 进行交互指定跳转支持两种方式:

Widget 支持三种显示方式,分别是 systemSmall 、 systemMedium 、 systemLarge ,其中:

1、 systemSmall 只能用 widgetURL 修饰符实现URL传递接收。

2、 systemMedium 、 systemLarge 可以用 Link 或者 widgetUrl 处理

这两种方式的本质都是 URL Schemes

在查找资料的时候,看到网上有的地方说在 AppDelegate 实现 OpenUrl 进行跳转处理:

然而试了之后发现根本没有响应,其实是需要在 SceneDelegate 里面实现跳转处理,因为 iOS13 后, APP 的 UI 生命周期交由 SceneDelegate 管理,这里拿到需要的 URL ,就能处理产品需求实现了。

creating-a-widget-extension

iOS13 URL Schemes 跳转与传值问题

iOS14 Widget小组件开发(Widget Extension)

File - New - Target - Widget Extension

本文主要以 未勾选 用户配置属性的情况说明

为小组件展示提供一切必要信息的结构体,遵守 TimelineProvider 协议,产生一个时间线,告诉 WidgetKit 何时渲染与刷新 Widget,时间线包含一个你定义的自定义TimelineEntry类型。时间线条目标识了你希望WidgetKit更新Widget内容的日期。在自定义类型中包含你的Widget的视图需要渲染的属性。

Timeline的刷新策略是会延迟的,并不一定根据你设定的时间精确刷新。同时官方说明了每个widget窗口小部件每天接收的刷新都会有数量限制

TimelineProvider官方解释

渲染 Widget 所需的 数据模型 ,需要遵守 TimelineEntry 协议。

屏幕上 Widget 显示的内容,可以针对不同尺寸的 Widget 设置不同的 View。

一个Widget只能实现大中小三个不同尺寸的组件形式,如果现有需求要做不同功能并且相同尺寸规格的组件则需要实现多组件

1.通过修改原Widget入口文件方法添加更多配置来支持多个Widget

2.另建SwiftUI文件实现组件功能,并去除 @main ,修改相同函数名

并在Widget页面中 Entry 中绑定对应的模型

如果主APP用的swift编写,可以将网络请求模块文件共享或pods库共享(方法后文会介绍)

posterFromJson 此数据模型转换方法仅适用简易接口(为了偷懒????♀️),复杂数据模型还是用 HandyJSON 或 KaKaJson 解析

若用第三方模型转换方法,图片的同步请求处理放置于 getTodayPoster 的请求中同步处理即可

然后更新补全 placeholder getSnapshot Previews 处相应的 Entry 即完成Widget内容展示

点击Widget窗口唤起APP进行交互指定跳转支持两种方式:

Widget三种尺寸规格中

接收方式

APPDelegate 中接收返回的URL

如果项目实现了 SceneDelegate 则需要在 SceneDelegate 里面实现跳转处理

由于widget跟APP间相互独立,如果想用相同的数据则需要两者间数据共享,创建 App Group

主APP中 Target - Signing Capability - +Capability - 添加 App Group

ps:网上说的还需创建申请 APPID 但在开启自动管理 Automatically manage signing 的情况下xcode会自动给你创建相关联的APPID

两者间的数据共享主要通过 UserDefaults 和 FileManager 两种形式。

以OC中使用 UserDefaults 共享数据为例

oc、swift混编调用

完成后即可使用pods中的第三方SDK了

Pods第三方SDK使用错误提示

如果在pods导入共享第三方库,或者使用 [UIApplication sharedApplication] 方法报错如下时

则需要在 pods Target 里面,选中出错的SDK并点击 buildSettings 搜索 Require

然后把 Require Only App-Extension-Safe API 然后把YES改为 NO 即可

2022-04-02 -- iOS 14 widget 小组件开发

刷新widget 的语法只支持 swift。主项目是 OC时, 需要创建桥接文件

然后在 Appdelegate 的 didFinishLaunchingWithOptions 调用刷新,也可在 app 退出后刷新一次。

目前好像只支持 swift 库。 OC库即使共享了也导入不了


本文名称:ios开发widget,iOs开发是什么意思
标题网址:http://chengdu.cdxwcx.cn/article/dsehjhi.html