「译」ios 9,为前端世界都带来了些什么? – balancex

2015 年 9 月,Apple 重磅发布了全新的 iPhone 6s/6s Plus、iPad Pro 与全新的操作系统 watchOS 2 与 tvOS 9(是的,这货居然是第 9 版),加上已经发布的 iOS 9,它们都为前端世界带来了哪些变化呢?作为一个 web 开发者,是时候站在我们的角度来说一说了!

注! 该译文存在大量英文术语,笔者将默认读者知晓 ES6、viewport、native app、webview 等常用前端术语,并不对这些已知术语进行汉语翻译
对于新发布或较新的产品名称与技术术语,诸如 Apple Pen、Split View 等专有名词,笔者将在文中使用其英文名,但会尝试对部分名词进行汉语标注
另外,出于对 wiki 式阅读的偏爱,笔者为您添加了很多额外的链接,方便您查阅文档或出处

简而言之

如果你不想阅读整篇文章,这里为你准备了一个总结:

新的设备特性

  • iPhone 6s 与 6s Plus 拥有 3D Touch,这是一个全新的硬件特性,它可以侦测压力,是一个可以让你拿到手指压力数据的 API
  • iPad Pro 的 viewport 为 1024px,与以往的 iPad 全都不同
  • 想在 iPad Pro 上支持新的 Apple Pen?不好意思,目前似乎并没有适用于网站的 API

新的操作系统特性(与 web 相关的)

  • iPad 上的 Safari 现在可以通过 Split View(分屏视图)与其他应用一起使用,这意味着新的 viewport 尺寸将会越来越常见
  • 新的 Safari View Controller(SFSafariViewController)可以让你在 native app 内提供与 Safari 界面、行为连贯一致的应用内网页浏览体验
  • 注意啦!Safari 新加入了 Content Blocker(内容拦截器)。以后,并不是所有的访问都一定会出现在你的 Google Analytics 了
  • Universal Links 可以让应用的拥有者在 iOS 内部“占有”自己的域名。因此,访问 yourdomain.com 将会打开你的应用(类似 Android 的 Intents 机制)
  • App Search(应用搜索):现在,Apple 将会抓取你的网页内容(与 native app 内容)用于 Spotlight 与 Siri 的搜索结果,想知道你的标签都兼容吗?
  • 你的网站现在可以通过 JavaScript API 访问 iCloud 的用户数据

新的 API 支持

  • Performance Timing API 在 iOS 9 得到回归
  • 关于 HTML5 Video,你现在可以在支持 Picture in Picture(画中画)的 iPad 设备上提供这项新功能;你的视频甚至可以在 Safari 关闭后继续播放
  • 更好的 ES6 支持:classes(类), computed properties(可计算属性), template literals(模版字符串)等
  • Backdrop CSS filters(背景滤镜)
  • CSS @supports 与 CSS Supports JavaScript API
  • CSS Level4 伪选择器
  • 用于支持分页内容的 CSS Scroll Snapping
  • WKWebView 现在可以访问本地文件了
  • 我们仍然需要等待 Push Notification,camera access,Service Workers 这些现代 web API 的到来

新的操作系统

  • 新一代 Apple TV 的 tvOS: 没有浏览器,也没有 webview。但是 JavaScript、XHR 和 DOM 可以通过一个叫做 TVML 的标记语言来使用
  • Apple Watch 的 watchOS:完全没有任何浏览器和 webview

再注! 由于原文写于 Apple 发布会之前,为了不让读者感到奇怪,笔者将会对文章进行适当改写与补充,以保证本文的连贯性

新的 iOS 设备特性

iPhones 6s 与 3D Touch

从 web 设计与开发的角度来说,新的 iPhone 6s 与 6s Plus 与之前的版本并没有太多差别。不过,有一个特性注定会吸引我们的目光:3D Touch

我们无法确定 Apple 是不是只是重命名了一下 “Force Touch”(用于 Apple Watch、TrackPad 2 与最新的 MacBook 上)或者 3D Touch 的确是一个为 iPhone 定制的似曾相识却不同的东西。3D Touch 允许操作系统和应用侦测每一个手指与屏幕接触时的压力。从用户体验的角度来说,最大的变化莫过于当你用点力去触碰或者拖拽屏幕时,操作系统将会触发诸如 peek,pop 这些新机制。那么问题来了:我们是否能够在网站中使用这个新玩意呢?让我们一点点来看:

iOS 9 搭载的 Safari 包含了一些用于 “Force Touch” 的新 API,但它们其实并不是那个用于 iPhone 6s 3D Touch 的 API。你可以理解为这些 API 就是 MacBook 版 Safari 里为 Force Touch 准备的那些 API ,因为共享一套 codebase,所以它理所当然得存在了 iOS 版里而已。

Force Touch API 为我们添加了两个新东西:

  1. 你的 click 事件处理函数将会从 MouseEvent 中收到一个新的属性:webkitForce
  2. DOM 也新增了四个事件:(webkit)mouseforcewillbeginmouseforcedownmouseforceupmouseforcechange。下边的示意图将告诉你这些事件是在何时被触发的:

Force Events

相信你已经从它们的名字中意识到了,这些事件都是基于鼠标而非触摸的,毕竟它们是为 MacBook 设计的。并且,TouchEvent 也并没有包含 webkitForce 这个属性,它仅仅存在于 MouseEvent 里。在 iOS Safari 里,你确实可以找到 onwebkitmouseforce 这一系列事件处理器,但是很可惜它们并不会被触发,click 返回的 MouseEvent 也永远只能得到一个 webkitForce: 0

可喜可贺的是,故事还没有结束。Touch Events v2 draft spec(触摸事件第二版草案) 中正式添加了 force 属性。3D Touch 也得以在 iPhone 6s 与 6s+ 中通过 TouchEvent 访问到。不过,笔者也要在这里提醒大家,由于没有 webkitmouseforcechange 这样给力的事件,在手机上我们只能通过 轮询 TouchEvent 的做法 来不断检测压力值的改变……非常坑爹

@Marcel Freinbichler 第一个在 Twitter 上晒出了自己的 Demo。在 6s 或 new Macbook 的 Safari(目前仅 Safari 支持)上访问就可以看到圆圈会随着压力放大。墙内的小伙伴可以直接试试下面这个圆圈,体验下 3D/Force Touch 带来的的奇妙体验。