雪球 iOS Widget 从零到壹

雪球 iOS Widget 从零到壹

作者:春春

导语

在 2020 的 WWDC 上苹果发布了 WidgetKit 小组件,从头规划后的 Widgets,其展现不再局限于负一屏,并且支撑在 macOS 和 iOS 的主屏幕上供给动态信息和个性化内容。苹果架构师和程序员的差异对小组件定位要点在于信息展现,而非运用程序的便利办法或许小程序。因而,它的作业捆绑较多。怎样在有限的条件里做好用户ios退款体会,androidstudio安装教程就成为Xcode了雪球规划师和产品的重要应战。

WidgetKit 简介

为了供给符xcode教程合苹果美学与规范的小组件,团队在雪球小组件的产品规划前期就招集相关规划师和产品司理,一起学习了 WWDC20 中关于 Widgets 的ios模拟器 Sessions。

Widgets 中心要素

苹果关于优异 Widget 的介绍如下:

雪球 iOS Widget 从零到壹

  1. 在快速切换运用的主屏幕里,杂乱交互的运用界面并不切合用户需求,ios14桌面布局图片略清楚的内容才是用户重视的要点

  2. Widget 会在恰当机会展现正确的内容, 一起支撑预烘托、复用,并供给活络可控的更新战略来确保内容即时性。

  3. Widget 供给jsonp跨域原理架构图怎样做word性化定制,可针对不同规范及用户装备来展现不同的内容。

Widgets 的捆绑

Widget 规划的初衷是简略清楚的在恰当的机会展现一些带有个性化定制的内容,为了不让主屏幕的整体运用体会变得杂乱,Widget 捆绑了许多才干:

  1. 不供给动画,仅支撑静态页面展现。

  2. 不支撑拖拽、翻滚等凌ios8备忘录乱的交互,不支撑 Switch 等控件。

  3. 仅支撑点击指定的 URL 跳转json文件是干什么的到 App。

  4. 更新频率由体系经过机器学习来动态分配。

Widget 的生命周期

作业在主屏幕的小组件,其生命周期理论上与桌面进程共同。不过因为体系的捆绑,小组件只能在预订的时刻节点提交改写恳求,由体系来挑选是否需求进行照应。在其生命周期中,小组件的逻辑json文件是干什么的有三次被体系调用的时机:

雪球 iOS Widget 从零到壹

  1. 当用户批改主屏幕增加小组件时,先触发 placeholder(in:ios是什么意思) 来优先显现占位效果。

  2. 在预览情况,触发 getSnapshot(for:in:completion:) 创建快照以供给相对无xcode怎样用缺的信息展现。

  3. 究竟在主屏上成功增加小组件后,将实行 getjsonTimeline(for:in:completion:) 获取未来时刻节点上的数据和相关更新战略。

Tips: 一般来说,在创建快照时烘托适合的视图以供预览,在改写 timeline 时获取网络数据。

要了解小组件的生命周期,读懂架构规划 timeline 的概念就十分重要了。小组件的内容改变都依托于此。

timeline 本质上是根xcode怎样运转据时刻驱动的一连串静态视android下载图。

雪球 iOS Widget 从零到壹

经过 timelixcode病毒检测工具ne provideJSONr 供给在未来特定的时刻节点的一连串 TimelineEntry 数据,并且能够设置更新战略:

  • af架构师薪酬一月多少ter:在特定时刻后触发更新。

  • atEnd:在 timeline 中所有的 entry 都展现完之后更新。

  • neve架构是什么意思r:仅在主 App 触发更新。

当然,所供给的这些数据xcode怎样运转是否更新ios14.4.1更新了什么,究竟仍取决于体系。关于股价行情和热门Xcode作业这些不可预测的信息,咱们选选用 after 战略,json在必定时刻后更新信息。一起咱们会在主运用退到后xcode教程台时,调用 WidgetCenter 来触发定向更新。

Timeline 改写

苹果供给了两种改写小组件的办法,System reloadsApp-driven reload

System reload

由体系发起,改写频次也由体系控制架构图模板。为了确保功能,体系会依据各个 reload 恳求的重要程度来控制是否改写 timeline。因而,过于一再的提交android的drawable类改写恳求或许无法达到预期。

App-driven reloads

由 App 触发小组件的 timeline 改写。当主程序在后台时,可经过后台推送触发改写;当主程序在前台时,能够经过 WidgetCenter 完毕。不过 WidgetCenter API 仅供给了 Swift 版别,关于像雪球选用了ios退款 Swift + ObjC 混编的项目无法直接在 AppDelegate 中运用,需求经过 bridge 的办法暴露到 ObjC 来完毕调用。

雪球 Wixcode版别dget

Widget 规划

雪球希望为用户供给其所关心的市场行情和及时的生意信息。而凭仗小组件这一新的内容展现办法,能够在必定程度上帮助用户调集和触达他所重视的信息。

然而 主意无限,时刻有限,咱们究竟挑选先检验几个有用功用:

雪球 iOS Widget 从零到壹

分别选取了用户所关心的大盘行情、自选股、热门话题以及雪球日历。

其他针对自选股还支撑了大、中、小三种规范:

雪球 iOS Widget 从零到壹

关于 Widget 规划能够参阅这两个 Session:

  • Dandroid手机esign great Widgjson文件是干什么的ets

  • Meet WidgetKiios14.4.1更新了什么t

0x01 环境建立

首要,Widgets 小组件本质上是存在于主项目之外的独立进程 (即 App Exteios卖肉直播不收费下载nsioandroid手机n) ,它具有自己的xcode怎样编写c语言生命周期和存储空间,体系会依据用户触发的架构师薪酬一月多少作业进行处理。App Extension 依托主运用程序为载体,假设将主运用程序卸载,那么 App Extension 也将不复存在。

因而,咱们需求为小组件建立根底设备,如网络通信,图片缓存,数据耐久化等等。除此之外,你还需求json文件是干什么的了解 Swift 并且了ios退款解 SwiftUI 的一些根底用法。

网络通信

小组件中能够运用 URLSession,而雪球在 Swift 2.0 已接入 Swift,且依据 Alamofire + SwiftyJSON 封装了一层内部网络库。仅需简略抽离即完毕了小组件网络库的封装。

作为独立于主工程的小组件,咱们需求在 Podfile 中为小组件的 target 引入所需的依托结构。

`target'Snowball'do`
`...`
`target'SnowballWidgets'do`
`inheios模拟器rit!:search_paths`
`pod'Alamofire','~>5.0.2'`
`pod'SwiftyJSON','~>5.0.0'`
`...`
`end`
`end`

json体网络封装本文不做翻开。

数据同享

因为 App Extension 不能直接同主程序直接通讯,不过苹果供给了 App Groups 的办法来进行通讯。ios14桌面布局图片App Groups 有两种同享数据的方json数据法:UserDefaultsFileManager

关于即将展现的用户自选数据,必需求先获取登录授权信息。一起雪球的认证机制比较杂乱,其无缺功用存在于内部独立的 OAxcode下载安装uth SDK 中,无法直接在 extension 中运用。因而,咱们挑选经过 UserDefaults 来同享 access_t架构师薪酬一月多少oken 及用户偏好设置,如涨跌色彩等。

UserDefaults 同享数据

同享 Usios卖肉直播不收费下载erDefaults 数据要设置 suitename为对应ios是什么意思项目的 App GroupID,ios是什么意思有两种设置办法:

`架构师和程序员的差异init?(suiteNamesuitename:Sxcode怎样用tring?)`
`//or`
`funcaddSuite(namedsuiteName:String)`

设置之后即可运用该实例来储存和获取同享数据了。咱们以 access_token 为例:

`publicextensionUserDefaults{`
`@objc`
`staticvarshared:UserDefaults{xcode下载安装`
`ifletvalue=Bundle.main.object(forInfoDictionaryKey:"Groupjson格局Identifier")as?String{`
`returnUserDefaults(suiteNios卖肉直播不收费下载ame:value)??.stander`
`}else{`
`returnUserDefaults(sxcode怎样设置成中文uiteName:"group.xxx")??.staios模拟器nios8备忘录der`
`}`
`}xcode病毒检测工具`
`}`

这儿咱们经过读取 Info.plist 中预设的 Grandroid什么意思oupIdentifier 作为 App GroupID。用来处理内网发布所用的企业证书和 App Store 的个人证书不同,导致 App GroupID 不同的问题。

无缺的 Widget token 获取流程如下:

雪球 iOS Widget 从零到壹

  1. 用户在雪球登录后,从服务端获取 tokeAndroidn。

  2. 雪球 App 退到后台时,将 token 写入 App Group。

  3. 改写 Widget 时,从 App Group 获取 tandroid什么意思oken 来进行接口恳求。

  4. 用户在雪球退android平板电脑价格出后,将 token 从 App Group 中删去。

不过,这个流程中还有一处缺点,便是当用户初次增加小组件时,或许并未在雪球 App 上完毕登录操作。这儿就需求增加未登录 ⏰。

雪球 iOS Widget 从零到壹

究竟,关于数据量较大的文件同享,能够经过 FileManagercontainerURL(forandroid下载SecurityApplicationGroup架构图怎样做wordIdentifier:) 获取 App Group 同享的储存空间架构规划地址,进行文件的存取操作。

因为咱们在 Userdefaults 中所运用到 key 都需求在主工程中赋值,在 Widget 中读xcode怎样运转取。为了避免 key 的多处重复界说,以及便利 API 的共同调用,android下载安装将公共逻辑抽离到独自文件中,经过 Comple Source 分别在主工程和 Widget 中引用,来完毕逻辑共用。

`@propertyWra架构师薪酬一月多少pper`
`publicstructUserDefa架构规划ultsWrapper<Value>{`
`letkey:String`
`letdefaultValue:xcode怎样运转Value`
`varstorage:UserDefaults=.shared`
`publicvarwrappedValue:Value{`
`get{`
`letvalue=storage.value(forKey:key)as?Value`
`returnvalue??defaultValue`
`}`
`set{`
`storage.setValue(nejson格局wValue,forKey:key)`
`}`
`}`
`}`
`publicextjson格局ensionUserDefaultsWrapperwherexcode怎样运转Value:ExpressjsonibleByNilLiteral{`
`init(key:String,storage:UserDefaults=.shared){`
`self.init(key:key,defaultValue:nil,storage:storage)`
`}`
`}jsonp`
`publicextensionUxcode怎样运转c++程序serDe架构规划faults{`
`@UserDefaultsWrapper(key:"com.xxx.Widgets.token")`
`@objcstaticvarWidgetToken:String?`
`@UserDefaultsWrapper(key:"com.xxx.Widgets.stockColor",xcode怎样运转defaultValue:0)`
`@objcstaxcode病毒检测工具ticvarWidgetStockandroid是什么手机牌子Colios卖肉直播不收费下载or:Bool`ios下载
`json转map...`
`}`

这儿还使用了 @propertyWrapper 特性,将 key 收口,运用者仅需关心对应的特色即可。

0x02 SwiftUI & Custom View

本节咱们简略谈谈运用 SwiftUI 来开发 Widget 的一些小细节和留意事项。

因为雪球工程历android的drawable类史包袱较大,在上面进行 Widget 的开发调试功率较低,且无法充分使用 SwiftUI 的 preview 特性进行 UI 调试。依据这个考虑,笔者直接在新建的 Xcode 工程中进行 SwiftUI 构建,完毕后再同步回主工程。

关于界面开发而言,作业量最大的便是进行元素布局,在 SwiftUI 中每个元素是怎样供认方位和巨细的呢 ?

大致分为三步:

  1. 父视图为子视图供给预估规范巨细。

  2. 子视图核算自己的实践规范巨细。

  3. 父视图依据本身和子视图的规范以及特色,来核算子视图的布局。json文件是干什么的

其间在第二步json数据,子视图核算自json文件是干什么的身规范时,SwiftUI 供给了三种设置规范的办法:

  • 无需设置,依据内容自行核算,如 Text。

  • 手动设置 frame + position

  • 设置 aspectRatio 宽高比,例如 Image

具体可参照:WWDC19 – Bandroid下载安装uilding Custom Viejson转mapws wi架构师证书怎样考th SwiftUI

自选布景完毕

在 Widget 规划一xcode版别节中,能够看到在自选、热门话题及雪球日历均有一个淡色渐变的 logo 布景,仅仅色彩不同。

因为布景是撑满整个 Widget 且 logo 坐落极点的相对方位,即顶部或底部。因而,这儿选用了手动布局 frame + position 的办法。

`funclogoPosition(_contentSize:CGSize)->CGPoint{`
`letoffset:CGios14.4.1更新了什么Float=logoSize/3`
`ifjsonpedge==.top{`
`returnCGPoint(x:contentSize.width-offset,y:offset)`
`}else{`
`returnCGPoint(x:contentSize.width-offset,y:contentSize.height-offset)`
`}`
`}`

其他为了便利比照调试,直接增加了多种情况的预览视图:

`structLogoView_Previews:PreviewProvider{`
`staticvarpreviews:someViandroid/yunosew{`
`Group{`
`LogoBackgroundView(edge:.top,style:.custom(.blue99))`
`LogoBackgroundView(edge:.top,style:.custom(.gold))`
`LogoBackgroundView(edge:.bottxcode下载安装om,style:.custom(.gold))`
`.environment(.colorScheme,.dark)`
`}`
`.previewContext(WidgetPreviewContext(family:.sjson解析ystemMedium))`
`}`
`}`

无缺代码和预览效果如下:

雪球 iOS Widget 从零到壹

自选列表项完毕

自选列表项在整个小组件中算是相对杂乱的布局了,需求支撑用户的不ios退款同登录情况、自选展现内容和数量的可批改、不同的画xcode怎样运转布规范以及用户涨跌幅色彩装备等。不过相比 UIKit 而言简,SwiftUI 进行页面编写几乎不要太爽,以自选列架构师表项 PortfolioItemView 为例,仅需 50 行不到的代码就能完毕 UI 与数据逻辑。

效果如下:

雪球 iOS Widget 从零到壹

其他,当获取的股票数据正常时,会将整个视图用 Link 包装,以响运用户点击。股票链接将会跳转到雪球ios模拟器上对应的个股页。

这儿需求留意的是⚠️ ,在 Widget 中自界说的 Button 作业时无json格局怎样翻开法被照应的,咱们能做的仅仅是装备架构规划 Link。除了 Link 控件之外,还能够经过 WidgetURL 来设置跳转链接,不过它仅针对究竟一次设置的 URL 收效。

0x03 批改你的自选

雪球支撑用户增加几百只的股票作为其重视标的,而自选小组ios退款件最多可展现的股票数量仅 6ios8备忘录 只。为此,咱们需求供给能够依据用户的挑选来展现对应自选的装备项。而xcode教程该功用需求使用 Intents 结构来界说股票挑选界面,之后体系会依据事前界说好的数据来构建装备页。

交互效果如json转map下:

雪球 iOS Widget 从零到壹

Tips: 关于怎样创建和运用 Intent 结构,推荐 WWDC20 – Widgets Code-along, part 3: Advancing tiiOSmelines。

装备 Intenxcode版别tDefinition

当咱们创建小组件时就能够挑选对应的 Intent 装备:jsonp跨域原理

雪球 iOS Widget 从零到壹

Include Configuraandroid的drawable类tionxcode怎样运转 Intentxcode版别框挑选了 Xcode 所ios14运用装备,☑️ 表明支撑ios体系用户装备,反之则不支撑。

  • StaticConfiguration:无装备特色的 Widget。

  • IntentConfiguration:可动态装备的 Widget。

Tips:动态装备的功用是集成在 SiriKit 中,这是因为在 iOS 中 Springboard 上的许多装备均与 SiriKit 相关。

勾选了 Include Configuration Intent,Xcode 会自动生成 IntentDefinition 文件,并且在编译经过后会自动生成一个名称为 PortfolioSelectionIntent 的 ConfigurationIntent 类。类名可经过 Custom Class 来指定。

每当咱们更新 IntentDejsonfintion 装备,需求从头编译以生成对应的办法。

自选小组件的 Intentxcode版别Defintion 文件如下:

雪球 iOS Widget 从零到壹

这儿咱们界说了一个 Portfolio 类用于处理股票数据,属于自界说的参数模版相同也由体系生成。其他,咱们勾选了 Dynaxcode版别mic Optionalandroid平板电脑价格 中的 providejson格局s search results 用于支撑用户输入成果查询。

编译后体系自动生成的 PortfolioSelectionInandroid体系tent 类:

雪球 iOS Widget 从零到壹

究竟咱们在 Widget 的 IntentTimelineProvider 进口关联 Intent:架构师证书怎样考

`typealiasIntent=PortfolioSelectionIn架构师需求把握哪些常识tent`

雪球 iOS Widget 从零到壹

处理 Iios退款ntxcode教程entHandler

完毕绑定后,还需求新建一ios下载PortfolioSelectionIntentHandler 的 Target 用来处理和响运用户输入。

雪球 iOS Widget 从零到壹

究竟在 IntentHandler 文件json是什么意思中完毕 PortfolioSelectionIntentHandling 协议即可。假设在开发进程找不到对应的协议,能够供认一下对应的 .intentdefinition 文件是否增加到 tios下载arget 中。当用户完毕操xcode怎样用作后,体系会经过 IntentTimelineProvider 来改写小组件。在 getTimeline(for:json解析in:coXcodem架构师和程序员的差异pletion:) 的 configuration 中将回来包含了用户的所android下载挑选的自选股票。

至此,整个小组件开发就告一段落。大android平板电脑价格xcode怎样用能够前往 AppXcodeStandroid下载ore 下载 12.27 版其他雪球 iOSios是什么意思 App 进行体会(需求升级到 iOS 14)。

总结

在实践的 Widget 开发上涉及到多样的常识盲区,也算是摸着石头过河。其他,得益于 SwiftUI 的高效开发模式,使得 Widget 这样轻交互的 UI 能够被快速开发出来,还顺带推行了一波 Swift 可谓一 多吃。

虽然 Widget 在功用xcode是什么软件和交互上同 App 有着极大的捆绑,但是它也大大提高了用户主屏幕的丰盛程度,且适合展现像股票行情和新闻资讯类信息。

Widget 特色总结如下:

  • 仅支撑展现文本和静态图片资源,亦无法确保实ios模拟器时改写。

  • 增加了产品的曝光进口,自界说装备结合智能堆叠,为用户带来更多个性化的内容。

  • 缩短了功用的访问途径,一键触达用户所需,供给用户想要的功用进口。

还有一件事xcode怎样运转c++程序

雪球事xcode怎样编写c语言务正架构师需求把握哪些常识在一日千里的展开,工程师团队等待牛人的参加。假设你对「做中国人首选的在线财富处理渠道」感兴趣,希望你能一起来添砖加瓦,点击「阅读原文」ios模拟器检查热招职位,就等json文件是干什么的你了。

热招岗位:大前端架构师、Android/iOS/FE 工程师、推荐算法工程师、Java 开发工json格局怎样翻开程师。