一年一度的WWDC又来了,一起来看看今年又有哪些值得关注的技术点吧~
附赠食用指南:
一:足不出Xcode,体验一站式开发?集成Xcode Cloud的Xcode满足你的一切开发需要(Xcode Cloud Beta现在限时免费,感兴趣的小伙伴可以去官网申请)
二:async/await,Structured concurrency,Actors如何让Swift异步编程更安全便捷?
三:Swift Playgroud让iPad重回生产力,在iPad上开发应用的时代来了!
四:Focus模式,别让通知分散你的注意力!通知新增的四种干扰等级了解一下?
五:如何让你的Widget更容易被用户看到? 答:做个更大的Widget
六:有了Shareplay,让团建不再被距离局限!
(温馨提示:本片内容来源自WWDC21:Platforms State of the Union)
想了解更多WWDC2021内容的小伙伴,可以阅读我以下文章,欢迎多多交流和指正
Xcode Cloud
试想一个一站式的iOS开发体验,在Xcode中提交代码后,自动在云端编译并且测试,接下来开发者只需根据Xcode上显示的测试结果改进代码,当一切准备就绪,就会自动将应用分发到各平台的TestFlight中…,为了实现这样流畅的开发体验,Apple将开发流程中所涉及到的所有环节,都集成到了Xcode中。
温馨提示:Xcode Clould目前限时免费,大家可以在官网申请Beta版权限
-
原有的开发流程
-
各个环节
Coding -> 测试 -> 整合 -> 分发 -> 改进
这里的整合指的是功能分支合到主干分支的过程。
-
痛点
每个环节依赖不同的工具,而环境切换的过程往往会中断我们编写代码的思路
-
-
Xcode Cloud
一个负责持续集成和分发服务的工具
-
优势:
- 内置在Xcode,无需切换工作上下文;
- 提交Commit后,自动在云端编译;
- 灵活且可扩展,支持集成其他CI系统;
- 数据安全,保证源码、密钥安全。
-
工作流:
-
选中项目
-
确认工作流
-
授权访问源代码
-
连接App Store Connect
-
查看结果
-
左侧导航器会根据项目的分支名进行分组
-
右侧详情页会显示所有动作的状态
-
-
增加新的工作流
-
设置触发编译的条件
-
方案一:分支上每次代码变更时触发
-
方案二:Pull Request分支上每次代码变更时触发
-
方案三:对标签(Tag)进行修改时触发
-
-
选择Xcode的版本
-
添加Action
-
添加UI Test
-
-
查看Action运行结果
-
可以使用Xcode Cloud通过UI Test过程中的截屏查看运行过程
-
-
-
-
-
分支整合
-
在Xcode中管理Pull Request
-
在当前编译的条件下,Xcode Cloud会自动构建和测试所有Pull Merge分支上的新Commit
-
还可以快速定位至评论中所涉及到的代码位置
点击左侧栏中带有信息标识的类名,点击可以直接定位到对应的位置,并查看评论
-
-
分发
-
云端自动签名
开发者无需关心描述文件和密钥等事项
-
支持多平台 TestFlight自动分发(包括Mac版)
-
-
改进
-
在测试过程中,Xcode Organizer可以在几分钟内收到TestFlight用户的反馈信息,开发者可以根据用户描述的信息对代码进行改进
-
Swift
异步
-
理解asymc/await
await表示当前调用者正在等待异步函数的结果
比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。
-
原有嵌套式写法(伪代码):
func prepareForShow { // 演员热身 danceCompany.warmUp { // 工作人员从仓库找出道具 self.crew.fetchStageScenery { // 搭建舞台 self.setStage { // 登场演出 dancers.moveToPosition } } } } 复制代码
-
-
使用async/await的直线排列式写法:
func prepareForShow() async throws -> Scene { let dancers = try await danceCompany.warmUP(duration: .minutes(45)) let scenery = await crew.fetchStageScenery() let openingScene = setStage(with: scenery) return try await dancers.moveToPosition(in: openingScence) } 复制代码
-
结构化并发(Structured concurrency)
再比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。其中演员热身和工作人员从仓库找出道具、搭建舞台可以同时进行
-
创建并发子任务
func prepareForShow() async throws -> Scene { async let dancers = try await danceCompany.warmUP(duration: .minutes(45)) async let scenery = await crew.fetchStageScenery() let openingScene = setStage(with: await scenery) return try await dancers.moveToPosition(in: openingScence) } 复制代码
-
-
actors
-
actor
actor StageManager { var stage: Stage func setStage(with scenery: Scenery) -> Scene { } } 复制代码
以前通过串行dispatch queue进行属性互斥访问的方式,由于需要管理很多冗余代码,很容易引入额外的竞争机制,从而出现问题, 而将actor作为一级构造嵌入到Swift里,可以底层设计层面避免了这种情况的发生。
-
-
MainActor
函数会同步到主线程执行
@MainActor func display(scene: Scene) 复制代码
小结:async/await让异步代码写的更自然,结构化并发让代码更容易理解,actors用来构建安全的共享状态
Swift Playgrounds
现在在iPad上也能用Swift Playgrounds开发app了
-
在iPad上可以直接发布应用到TestFlight
Focus
-
通知
原有的通知无论优先级如何,都会以相同的方式堆积在我们的屏幕上,完全看不出哪一条通知更重要
-
现在通知可以归类成四类干扰等级
-
Passive
无声且不会唤醒设备,下一次拿起手机时显示,用于时效性不强的通知
-
Active(同之前默认的通知类型)
带有音效和触感反馈,同以往的通知一样
-
Time Sensitive
这一等级的通知会马上推送给用户,用户不点击会停留在锁屏页上一段时间,用于马上需要读取的通知
-
Critical
即使设备静音,也会播放声效,只有关系到健康和安全的重大通知,才能设置成这一等级,且设置时需要用户授权
除此之外,还有一种特别的通知:
-
消息类型通知(信息或者通话)
如果你开发的是通信类APP,可以告诉系统,这是消息或者通话类型的通知,系统会自动调整通知的样式和运行方式,以便人们更好的查看消息
-
-
通知摘要
为了避免人们错过一些通知,同时帮助用户能在自己想要的时间查看通知,系统提供了一种新的通知展示样式 — 通知摘要,用户可以使用通知摘要,在选择的时间来集中查看推送
-
消息类型:只展示Passive或Active类型的通知
-
通知摘要的顶部有两个轮播位置
- 轮播位通知选取规则:
- 带有大缩略图的通知会比没有大缩略图的通知,优先入选
- 默认情况:推送最多的APP会优先得到推荐,当然用户可以在此基础上个性化定制摘要
- 轮播位通知选取规则:
-
-
等级调整
系统根据用户和APP通知的交互行为,推荐用户将其调整为合适的干扰等级
-
如果用户经常在专注模式使用某APP
系统会建议将该APP调整为专注模式时允许接收通知
-
如果用户经常与某APP的Time Sensitive通知进行交互
系统会建议将改APP的通知等级调回为Active
-
如果某APP不断发送通知,用户却没有反应
系统会建议将这个APP发送的通知静音
-
-
-
小结
- 通过设置通知相关性分数和合适的缩略图,使通知占据摘要顶部的轮播位置
- 思考APP的通知最适合哪一干扰级别
- 例如:如果是聊天软件,应该使用最新的
User Notifications API
来告诉系统来自APP的消息和来电通知
- 例如:如果是聊天软件,应该使用最新的
- 使用最新的
Focus Status API
,在APP里显示用户的专注模式状态
Widget
通过Widget的新特性让你的APP更好用、且更容易被用户看到
-
使用iPad上的超大尺寸小组件
-
通过Intents框架让Widget自动加入到智能堆叠小组件中
SharePlay
人们聚会时,除了聊天以外,分享体验也很重要,SharePlay Kit的出现正是为了帮助人们在难以相见的时候,依旧保持紧密联系。
-
入口
- FaceTime
- iMessage
让人们在视频聊天的同时,共同进行一项活动,比如:共享视频播放、共享画布。
-
共享视频播放
在视频APP里采用Group Activities和AVPlayer同步,从而可以快速集成这一功能。
-
共享画布
基于Group Activities,将笔画发给FaceTime群组中的每一个人,从而实现协同绘画
小结:只需要让APP实现Group Activities,就可以实现基于FaceTime的共享体验