WWDC 2016 印象初步

原文:WWDC 2016 Initial Impressions
作者:Chris Wagner
译者:kmyhy

今天是苹果开发者在本年度的最精彩的一天!
WWDC 第一天带来了许多新的 APIs 和新特性,让人目不暇接,包括 Swift 3,SiriKit,iMessage Apps 等等。

从“Platforms State of the Union”这一节开始,我就开始编写文档,我想从一个开发者的角度,将我对 WWDC 的第一印象发表出来,也许是个不错的主意。
欢迎各种吐槽,各种喷!

Swift 3

今年,对各位开发者影响最大的变化就是2016年末即将发布的 Swift 3,因为这会对我们编写 Swift 代码做出非常大的改变。
但是,如果你一直在关注 Swift evolution 项目,这就没什么好奇怪的了。自从 Swift 开源依赖,苹果和社区在过去 6 个月中努力奋战,每一件事情都被公开讨论过。今天的内容完全没有任何新东西,除了这个:Swift 3 和 Swift 2.3 都被打包进 Xcode 8 中了。

这解决了我从去年以来的一个最大的不满:如果我不将我的源代码也升级到 Swift 2,我就无法使用 Xcode 7。由于 Xcode 8 包含了 Swift 2.3(和 Swift 2.2 在源码上完全兼容),现在你可以在 Xcode 8 中打开你的 Swift 2.2 项目了,一直到你决定升级到 Swift 3 的时候再说。

如果你没有关注关于 Swift 3 的讨论,我们将在明天发布一篇题为“What’s New with Swift 3”的帖子。与此同时,我想提一下另外一件影响到我们所有人的事情。

Objective-C API 更加“Swift 化”

Swift 3 的一个最大的改变是,苹果让它的 APIs 更加 “Swift 化”。
下面的例子能让你很容易理解这一点。这是一个使用字符串的例子:

// Swift 2.2
let content = listItemView.text.stringByTrimmingCharactersInSet(
    NSCharacterSet.whitespaceAndNewlineCharacterSet())

// Swift 3
let content = listItemView.text.trimming(.whitespaceAndNewlines)

注意,Swift 3 的版本更简洁,以及它使用枚举的方式有所不同。

这是一个使用 Core Graphics 的例子:

// Swift 2.2
let context = UIGraphicsGetCurrentContext()
CGContextMoveToPoint(context, 5, 0)
CGContextAddLineToPoint(context, 10, 10)
CGContextAddLineToPoint(context, 0, 10)
CGContextClosePath(context)

// Swift 3
let context = UIGraphicsGetCurrentContext()!
context.moveTo(x: 5, y: 0)
context.addLineTo(x: 10, y: 10)
context.addLineTo(x: 0, y: 10)
context.closePath()

注意,调用全局 C 函数变成了调用 context 的方法。

然后是一个调用 GCD 的例子,API 的调用被简化了:

// Swift 2.2
let queue = dispatch_queue_create("myqueue", nil)
dispatch_async(queue) { 
  // do stuff
}

// Swift 3
let queue = DispatchQueue(label: "myqueue")
queue.async { 
  // do stuff
}

如你所见,原来冗长的命名被精简为简短但表达清晰的代码;同时将原来的全局函数修改为相应类型的成员方法。
对于熟练的开发者,这种改变需要一定的时间才能慢慢适应,但一旦坚持下来将使你的代码更加简洁,同时也更适合刚接触的开发者。Xcode 8 自带了一个迁移工具,能够将你的老代码升级到 Swift 3,这会节省你不少力气。
我确实为这些改变感到高兴,因为这些新 APIs 最终会变得越来越直观。

注:要学习更多内容,请阅读苹果的 API Design GuidelinesBetter Translation of Objective-C APIs into Swift

iPad 版的 Swift Playgrounds

自从 iPad Prod 面世,开发者们就开始期盼在 iPad 上推出 Xcode。
对此我们不予置评,但起码在 iPad 上推出 Swift Playgrounds 表明了这是一个好的开始。这很像是我们之前认识的 Playgrounds,但增加了一个漂亮的键盘和 UI,使我们更容易编写代码,同时还有带了一个初学者教程。
看起来这很适合用来将 Swift 作为第一门编程语言教授学生学习,当然对于老练的程序员也很有用,可以用来验证一些原型代码。

Xcode 8

如果 Xcode 没有一个主版本的升级,那就不是 WWDC 了!
我在这里列出一些这次升级的最主要的内容。

Memory Debugger

最爽的一个升级就是 Xcode 8 的内存调试器。
这是一个内置根据,允许你以图表方式查看正在运行的 App 中的全部内存对象,这样你就可以迅速发现内存泄露和循环引用。一旦在图表中找到问题之所在,你可以选中它,查看每帧的堆栈并直接跳转到出现问题的代码行。太过瘾了!
此外,新的内存调试器能够自动检测内存泄露并帮助你快速诊断问题。演示十分精彩,获得了观众的一片喝彩。循环持有,Bye-bye 了!

Interface Builder 的改善

你有没有曾经想在 Interface Builder 中缩放后再拖入一个按钮?但是很快你就醒悟过来,除非你正在处于 100% 的缩放率下,否者你根本做不到?

是的,这都是过去式了!现在 Xcode 中的 Interface Builder 允许你在任意缩放率下编辑场景了。

同时增加了一个新的工具条,允许你轻松地在不同设备和 Size class(iPhone、iPad等)下预览 view controller 了,并且能够在 Build&Run 之前识别出有冲突的布局约束。这真的节省了不少时间。

源码编辑

Xcode 8 改进了代码编辑器,自动将项目中的图片资源以图片预览的方式集成到代码中:

要做到这个,你只需输入图片名,就会得到一个非可空的 UIImage 实例。
此外,Xcode 8 可以在代码中显示和定义时相一致的颜色:

这一切只需要你在代码编辑器中输入 color 然后选择“Swift Color Literal”菜单,就会立即显示一个色彩选择器。

还可以创建代码编辑器扩展,用于定制书写代码时的体验。现在 Xcode 增加了这个新模板,当你编写完这个扩展后,你可以通过 Mac App Store 或者用你的开发者账号签名的二进制文件来发布这个扩展。我很期待看到你开发出这样的扩展!

性能改善

苹果声称 Xcode 8 在许多方面都比以前快许多——例如索引测试比之前加快了 50 倍。
速度提升对开发者来说意味着效率更高,这真是一个天大的好消息!

iOS 10 SDK

iOS 10 SDK 新增了大量的新 kit、扩展以及对现有框架进行增强。下面列出了其中一小部分我觉得重要的内容。

SiriKit

开发者期待已久的一个特性就是能够集成 Siri 了。在 iOS 10 中增加了 SiriKit!

SiriKit 规定,你可以在 app 的 6 类业务中使用 Siri:

  • 语音或视频电话
  • 消息
  • 支付或接受支付
  • 照片查找
  • 预定行程
  • 健康管理

如果你的 app 存在上述功能,你可以在 app 暴露一个 Intents 扩展。Siri 负责解决语言转换和语义分析中的细微差别,将用户请求翻译成你的 Intents 扩展能够处理的动作。当 app 从 Siri 或 Maps 收到一个 Intent 时,你甚至可以显示你自己的 UI。

在你的扩展中必须提供一些细节,以便系统知道你的 app 能够处理用户的某些请求,如果你了解 iOS 8 中的 App 扩展的开发,那么开发一个 Siri 扩展是一件很轻松的事情。

注:要了解更多内容,请阅读SiriKit Programming Guide

iMessage Apps

作为一个 Slack 和 Facebook Messager 的用户,我对于 message 的这些增强尤其觉得振奋。会动的 GIF 图片和 Firework,终于派上用场了!
在 Keynote 中,苹果演示了一堆很酷的新功能,比如:link/media unfurling、reactions、消息气泡效果以及窗口效果,当然我还不是很明白如何实现的。在演示过程中,当我正在想“他们最好声明一个扩展,允许第三方开发者进入到消息平台中”的时候,他们就已经这样做了。通过新的 Messages 框架,你可以通过创建扩展来让用户发送文本、表情、媒体、文件和一件最有意思的事情:交互式消息。

表情包

最简单的扩展类似就是表情包。创建表情包极其容易,你可以定义一套表情从而用户能够将它们发送给好友。如果你用过 Facebook Messenger,你会发现这和 Messenger 非常像,除了一点:表情可以被“打开”并置于其它消息之上。说实话,这虽然有点噱头的味道,但仍然很有趣 :]

交互式体验

然不仅仅是表情包。这个 APIs 允许你在 Messages app 中创造出全新的体验,甚至可以定制 UI!像 Giphy 这样的服务无疑是很有意思的,你可以提供类似这样的扩展,体验会比如今的第三方键盘要好得多。当然,用在业务环境中也是非常强大的!

想像一下某个服务公司,它的技术团队使用 Messages 进行沟通。他们可以用这个扩展来访问 CRM 系统的数据(就在 Message 中),从而使信息快速地传递给每个人。通过交互式消息,每次聚会都能用一条消息来发起。Keynote 给出了一个例子,创建一个团购的菜单,在菜单发送之前,群聊中的每个人都可以修改这个菜单。

我可以预料到将有成千上万的 app 会因此而受益。从一个用户的角度来说,我非常乐意看到这一天的到来。

注:要了解更多内容,请阅读Messages Framework Reference

User Notifications

增加了一个新的框架 UserNotificationUI,允许开发者创建富媒体通知,而在之前是完全不可能的。
例如,现在可以在通知中嵌入富媒体,就像内置的 Messages app 一样。这是通过一个新的扩展来实现的,当通知到达时这个扩展就被调用,这个功能看起来非常强大。你甚至可以通过这个通知扩展来实现一个的端到端的加密层。这部分的内容我没有时间细看,关于这部分的详细内容请看会议视频,或者阅读UserNotifications framework reference

Widgets 大变样

在 iOS 10 中,Widgets 完全变样了,对此我举双手赞同。在 iOS 8 的时候我曾经对 widgets 感到兴奋,但后来 widgets 在通知中心呆得久了,也就没那么兴奋了。
现在,widgets 位于 Home 屏左侧,就像它们在 macOS 上的一样。widgets 也可以通过在 app 图标上方/下方的 3D Touch 快捷菜单来显示。以我的观点来看,用这种方式查看快捷信息更加自然。它就像你在窥视这个 app 的内容一样。

watchOS 3

有一种普遍的观点认为,Apple Watch 平台在对待 app 开发者的态度上有些失败。尽管它非常吸引人,核心功能做得非常好,但它从一开始就有一个先天不足的缺陷:速度。
要在 watch 上启动一个 app 简直是一件痛苦不堪的事情。通常你会看到一个小圆圈在转啊转,差不多要20-30秒才会消失,甚至会完全停摆,让你觉得懊恼不已。最终你会将表藏到抽屉里,卖掉,或者像我一样仅仅是把它作为时钟佩戴,或者查看一下通知而已。

当 Kevin Lynch 打开 keynote,讲到他们主要集中精力让 app 迅速启动时,我立马泪流满面了!如果这是真的话,我又开始对 watchOS 开发充满信心了 :]

速度提升

Apple watch 速度提升的后面是依靠 Snapshots、Dock 和后台任务的引入。这三者结合起来允许 watch app 随时待命,用户一点就开。
Snapshots 和后台任务和 iOS 并无不同:

  • 系统通过 Snapshots 对 UI 进行屏幕截图,并在 app 的启动和切换是使用它。
  • 通过后台任务,你的 app 能够在后台有一定的时间去更新信息以便在 app 打开时这些数据就已经准备就绪。

可以使用 SceneKit 和 SpriteKit 了

你现在可以在 watch app 中使用 SceneKit 和 SpriteKit 了。我首先想到的是在游戏中使用它们,但苹果演示了另一种用法:为常规 app 中创建优美的自定义动画。

当前 UIKit 在 watch 上的限制是开发者无法创建自定义动画。但在 watchOS 3,你可以将 .scn 文件打包在你的资源中,这样就可以在 app 中添加 3D 图形内容了。或者用 .sks 文件来创建交互式 2D 动画。这就有意思了,想想一下开发者能用来做些什么呢?

Complication 的改进

当用户将你的 complication 添加到他们的 watchOS 3 设备的表盘上时,你能够让你的 app 处于准备启动的状态,并且每天可以接收 50 条 push 通知。如果你对 app 的数据感兴趣的话,这一点就足以刺激你去制作一个 complication 了。哪怕有时候 complication 的数据对用户没有意义,它也能加快 app 的启动。

tvOS 10

tvOS 10 的改变就没有那么多了。
TV provider 现在有了 sso(单点登录)的概念,用户只需要向 provider 授权一次,然后可以在所有支持的视频频道 app 中不用登录了。如果你开发的 app 需要使用这个功能,请参考 VideoSubscriberAccount 这个框架。

tvOS 最令人感兴趣的升级是将许多已有的框架开放给开发者了:

  • ExternalAccessory
  • HomeKit
  • MultipeerConnectivity
  • Photos
  • ReplayKit
  • UserNotifications

macOS

OSX 在问世 15 年之后被重新命名为 macOS,以便和其他三个平台的名称保持一致。macOS 的最新版本是 macOS Sierra。
我不是一个 macOS 开发者,因此在这里无法过多讨论。但是我会重点介绍一个我最感兴趣的特性。

Apple Pay for the Web

使用 macOS Sierra 的用户现在可以在 web 上使用 Apple Pay 进行支付了。

这对于电子商务网站的 web 开发者来说很重要,因为它将用户的支付门槛完全降低了一个档次。因为不再需要负责用户信用卡数据的安全问题——更妙的是,让用户知道他们的信用卡信息不会保存到各种网站上,从而更容易获得他们的信任。

据我所知,没有任何理由(除非法律明文规定)不在你的网站上支持 Apple Pay。这个过程需要用到一个 [Apple Pay Javascript](Apple Pay JavaScript framework) 框架。

苹果文件系统(Apple File System)

最后还有很重要的一点就是,我想来点相对跨平台的东西:苹果发布了一个全新的文件系统!
我从来没在博客中听到 John Siracusa 提过这种文件系统,这有点出人意料了。这个改进显然是经过深思熟虑的!

当前的文件系统默认是 HFS+,它出现在 1998 年,那时候还在使用软盘。现在大部分都在用——我查看了一下,哪怕是最基础的 iMac 也在使用 5400 转的硬盘了——而比较新的系统用的都是带高速闪存的 SSD。苹果文件系统正式基于 Flash/SSD 而设计的,同时还支持本地加密。

从苹果文件系统中,用户将获得如下好处,比如崩溃保护、空间共享、克隆和快照。崩溃保护采用了一种 copy-on-write metadata 机制,确保升级到文件系统不用担心崩溃,同时减少 HFS+ 上用到的日志大小。空间共享允许在同一磁盘上的多个文件系统能够共享磁盘剩余空间,而无需对驱动器进行重新分区。

克隆能够创建文件和目录的实时拷贝而不占用磁盘空间。由于 copy-on-write 机制,克隆文件和目录并不会进行真正的复制,除非有修改动作发生。*NIX 用户可能会想到符号链接,我首先想到的也是这个,但是我可以肯定它远远不是符号链接那么简单。最后是快照(snapshot),它允许系统插件数据的只读的实例,这样便能够随时将数据恢复到某个时间点。

结束语

我对今年苹果发放的“新年福利”的初步印象就到此结束了。
正如我提到过的,我没有时间关注所有的方面,很可能还有一些好东西被遗漏了。如果你发现有什么不对的地方,请告诉我,我会非常乐意并及时更新内容。
同时,我们将竭尽全力在未来数周内推出一系列新的文档教程、视频教程和书籍。敬请关注。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值