一年一度的WWDC又来了,一起来看看今年又有哪些值得关注的技术点吧~
(温馨提示:本片内容来源自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表示当前调用者正在等待异步函数的结果
比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。
原有嵌套式写法(伪代码):
1
2
3
4
5
6
7
8
9
10
11
12
13func prepareForShow {
// 演员热身
danceCompany.warmUp {
// 工作人员从仓库找出道具
self.crew.fetchStageScenery {
// 搭建舞台
self.setStage {
// 登场演出
dancers.moveToPosition
}
}
}
}
使用async/await的直线排列式写法:
1
2
3
4
5
6func 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)
再比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。其中演员热身和工作人员从仓库找出道具、搭建舞台可以同时进行
创建并发子任务
1
2
3
4
5
6func 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
1
2
3
4
5
6actor StageManager {
var stage: Stage
func setStage(with scenery: Scenery) -> Scene {
}
}以前通过串行dispatch queue进行属性互斥访问的方式,由于需要管理很多冗余代码,很容易引入额外的竞争机制,从而出现问题, 而将actor作为一级构造嵌入到Swift里,可以底层设计层面避免了这种情况的发生。
MainActor
函数会同步到主线程执行
1
2@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的共享体验