0%

一文带你读完WWDC21核心(新)技术点

一年一度的WWDC又来了,一起来看看今年又有哪些值得关注的技术点吧~

(温馨提示:本片内容来源自WWDC21:Platforms State of the Union

想了解更多WWDC2021内容的小伙伴,可以阅读我以下文章,欢迎多多交流和指正

检测和诊断内存问题

APP终极性能生存指南

iOS中的Hang是什么?该如何治理?

诊断APP的电源和性能回归

Xcode Cloud

试想一个一站式的iOS开发体验,在Xcode中提交代码后,自动在云端编译并且测试,接下来开发者只需根据Xcode上显示的测试结果改进代码,当一切准备就绪,就会自动将应用分发到各平台的TestFlight中…,为了实现这样流畅的开发体验,Apple将开发流程中所涉及到的所有环节,都集成到了Xcode中。

温馨提示:Xcode Clould目前限时免费,大家可以在官网申请Beta版权限

截屏2021-06-08 下午9.53.50

  • 原有的开发流程

    • 各个环节

      Coding -> 测试 -> 整合 -> 分发 -> 改进

      这里的整合指的是功能分支合到主干分支的过程。

      截屏2021-06-09 上午7.25.41

    • 痛点

      每个环节依赖不同的工具,而环境切换的过程往往会中断我们编写代码的思路

  • Xcode Cloud

    一个负责持续集成和分发服务的工具

    • 优势:

      • 内置在Xcode,无需切换工作上下文;
      • 提交Commit后,自动在云端编译;
      • 灵活且可扩展,支持集成其他CI系统;
      • 数据安全,保证源码、密钥安全。
    • 工作流:

      • 选中项目

        截屏2021-06-09 上午7.39.33

        截屏2021-06-09 上午7.39.01

      • 确认工作流

        截屏2021-06-09 上午7.40.22

      • 授权访问源代码

        截屏2021-06-09 上午7.42.25

      • 连接App Store Connect

        截屏2021-06-09 上午7.41.50

      • 查看结果

        截屏2021-06-09 上午7.43.28

        • 左侧导航器会根据项目的分支名进行分组

        • 右侧详情页会显示所有动作的状态

          截屏2021-06-09 上午7.44.35

      • 增加新的工作流

        截屏2021-06-09 上午7.45.54

        • 设置触发编译的条件

          • 方案一:分支上每次代码变更时触发

          • 方案二:Pull Request分支上每次代码变更时触发

          • 方案三:对标签(Tag)进行修改时触发

            截屏2021-06-09 上午7.52.36

        • 选择Xcode的版本

          截屏2021-06-09 上午7.52.36

        • 添加Action

          截屏2021-06-09 上午7.54.36

          • 添加UI Test

            截屏2021-06-09 上午7.55.14

        • 查看Action运行结果

          截屏2021-06-09 上午7.57.03

          • 可以使用Xcode Cloud通过UI Test过程中的截屏查看运行过程

            截屏2021-06-09 上午7.57.37

  • 分支整合

    • 在Xcode中管理Pull Request

      截屏2021-06-09 上午7.58.36

    • 在当前编译的条件下,Xcode Cloud会自动构建和测试所有Pull Merge分支上的新Commit

      截屏2021-06-09 上午8.00.04

    • 还可以快速定位至评论中所涉及到的代码位置

      点击左侧栏中带有信息标识的类名,点击可以直接定位到对应的位置,并查看评论

      截屏2021-06-09 上午8.01.48

      截屏2021-06-09 上午8.03.02

  • 分发

    • 云端自动签名

      开发者无需关心描述文件和密钥等事项

    • 支持多平台 TestFlight自动分发(包括Mac版)

  • 改进

    • 在测试过程中,Xcode Organizer可以在几分钟内收到TestFlight用户的反馈信息,开发者可以根据用户描述的信息对代码进行改进

      截屏2021-06-09 上午8.04.24

Swift

异步

  • 理解asymc/await

    await表示当前调用者正在等待异步函数的结果

    比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。

    • 原有嵌套式写法(伪代码):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      func prepareForShow {
      // 演员热身
      danceCompany.warmUp {
      // 工作人员从仓库找出道具
      self.crew.fetchStageScenery {
      // 搭建舞台
      self.setStage {
      // 登场演出
      dancers.moveToPosition
      }
      }
      }
      }
  • 使用async/await的直线排列式写法:

    1
    2
    3
    4
    5
    6
    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)

    再比如:完成一次舞蹈演出需要三个 异步步骤:演员热身、工作人员从仓库找出道具、搭建舞台,完成这些演员才可以登台演出。其中演员热身工作人员从仓库找出道具、搭建舞台可以同时进行

    • 创建并发子任务

      1
      2
      3
      4
      5
      6
      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

      1
      2
      3
      4
      5
      6
      actor 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了

截屏2021-06-09 上午8.10.55

  • 在iPad上可以直接发布应用到TestFlight

    截屏2021-06-09 上午8.12.18

Focus

  • 通知

    原有的通知无论优先级如何,都会以相同的方式堆积在我们的屏幕上,完全看不出哪一条通知更重要

    • 现在通知可以归类成四类干扰等级

      • Passive

        无声且不会唤醒设备,下一次拿起手机时显示,用于时效性不强的通知

      • Active(同之前默认的通知类型)

        带有音效和触感反馈,同以往的通知一样

      • Time Sensitive

        这一等级的通知会马上推送给用户,用户不点击会停留在锁屏页上一段时间,用于马上需要读取的通知

      • Critical

        即使设备静音,也会播放声效,只有关系到健康和安全的重大通知,才能设置成这一等级,且设置时需要用户授权

      除此之外,还有一种特别的通知:

      • 消息类型通知(信息或者通话)

        如果你开发的是通信类APP,可以告诉系统,这是消息或者通话类型的通知,系统会自动调整通知的样式和运行方式,以便人们更好的查看消息

    • 通知摘要

      为了避免人们错过一些通知,同时帮助用户能在自己想要的时间查看通知,系统提供了一种新的通知展示样式 — 通知摘要,用户可以使用通知摘要,在选择的时间来集中查看推送

      截屏2021-06-09 上午8.26.35

      • 消息类型:只展示Passive或Active类型的通知

      • 通知摘要的顶部有两个轮播位置

        • 轮播位通知选取规则:
          • 带有大缩略图的通知会比没有大缩略图的通知,优先入选
          • 默认情况:推送最多的APP会优先得到推荐,当然用户可以在此基础上个性化定制摘要
    • 等级调整

      系统根据用户和APP通知的交互行为,推荐用户将其调整为合适的干扰等级

      • 如果用户经常在专注模式使用某APP

        系统会建议将该APP调整为专注模式时允许接收通知

        截屏2021-06-09 上午8.27.35

      • 如果用户经常与某APP的Time Sensitive通知进行交互

        系统会建议将改APP的通知等级调回为Active

        截屏2021-06-09 上午8.30.33

      • 如果某APP不断发送通知,用户却没有反应

        系统会建议将这个APP发送的通知静音

        截屏2021-06-09 上午8.33.44

  • 小结

    • 通过设置通知相关性分数和合适的缩略图,使通知占据摘要顶部的轮播位置
    • 思考APP的通知最适合哪一干扰级别
      • 例如:如果是聊天软件,应该使用最新的User Notifications API来告诉系统来自APP的消息和来电通知
    • 使用最新的Focus Status API,在APP里显示用户的专注模式状态

Widget

通过Widget的新特性让你的APP更好用、且更容易被用户看到

  • 使用iPad上的超大尺寸小组件

    截屏2021-06-09 上午8.34.23

  • 通过Intents框架让Widget自动加入到智能堆叠小组件中

    截屏2021-06-09 上午8.35.14

SharePlay

人们聚会时,除了聊天以外,分享体验也很重要,SharePlay Kit的出现正是为了帮助人们在难以相见的时候,依旧保持紧密联系。

截屏2021-06-09 上午8.36.35

  • 入口

    • FaceTime
    • iMessage

    让人们在视频聊天的同时,共同进行一项活动,比如:共享视频播放、共享画布。

  • 共享视频播放

    截屏2021-06-09 上午8.37.18

在视频APP里采用Group Activities和AVPlayer同步,从而可以快速集成这一功能。

  • 共享画布

    基于Group Activities,将笔画发给FaceTime群组中的每一个人,从而实现协同绘画

    截屏2021-06-09 上午8.38.07

小结:只需要让APP实现Group Activities,就可以实现基于FaceTime的共享体验