苹果旗下两大系列操作系统OS X和iOS发展步调并不一致。相对于iOS的迅猛发展,OS X显得不温不火。Yosemite的发布,应该说是个里程碑。本文基于Yosemite-Developer Preview 1.0版本简单介绍这个OS X家族的新成员。
很多朋友来问我:“你如何看待OS X一年一个新版本的演进策略?”我说:“去看看英特尔著名的Tick-Tock发展模式你就能理解了。”这并非是一个玩笑。
很长时间以来,OS X和iOS作为苹果在桌面和移动设备上的操作系统,发展步调并不一致。相对于iOS的迅猛发展,OS X显得不温不火。对于我这样的铁杆OS X用户来说,这并非一个好兆头。有一段时间我甚至有些悲观地认为OS X的生命可能不会长久,苹果随时都有可能放弃它。
然而,这种担忧从2011年OS X Lion的发布后逐渐消散。我发现苹果其实并没有这种打算,相反它却将越来越多的iOS中广受赞誉的特性带回到OS X,并且逐步打破了OS X和iOS之间的壁垒。从Lion中的iCloud、Launchpad,到Mountain Lion中的备忘录、提醒事项和通知中心,再到Mavericks中的iBooks、地图等。我们可以看到,相对于微软立志于直接融合桌面和移动操作系统的做法,苹果选择了不同的道路。它没有急于生硬地融合两种不同取向、不同操作方式的系统,而是着眼于应用层。首先将两种操作系统中内置软件进行统一,进而通过iCloud将用户数据在各个设备中进行同步。这样一来,用户可以根据需要在合适的设备上使用合适的软件舒服地进行工作。因为在苹果看来,在基于触摸的设备上使用为基于鼠标指针操作而设计的软件,是一件严重破坏用户体验的行为;反之亦然。在没有找到终极解决方案前,只在应用层进行数据整合,并保留各个平台的操作习惯才是最为安全稳妥的办法。
Yosemite的发布,应该说是这一理念的里程碑。本文就将以这个理念作为基调,并基于Yosemite-Developer Preview 1.0版本,来简单介绍一下这个OS X家族的新成员。
下载与安装
鉴于目前的Developer Preview版本尚未完善,所以我建议不要在任何生产环境下进行安装,并在安装前对现有系统进行备份。对于已拥有Mac App Developer账户的用户来说,只需登录苹果开发者网站,即可使用兑换码在Mac App Store中下载安装程序。对于非开发者账户,但又想体验新版本系统的用户来说,可以通过OS X Beta Program来进行申请,一旦申请通过则可以获得兑换码。
下载安装程序后双击即可安装,由于Yosemite安装程序本身的问题,我们尚无法使用其内置的createinstallmedia命令创建外置安装媒介,而是要使用手工方式创建。
- 右键点击Yosemite安装程序,并在弹出菜单中选择“显示包内容”。在Contents/SharedSupport目录下找到InstallESD.dmg并双击将其挂载到系统中。打开终端使用cd/Volumes/OS\X\Install\ESD命令进入到挂载的OS X Install EDS宗卷中。然后使用open BaseSystem.dmg命令,将其中隐藏的BaseSystem.dmg挂载到系统中(如图1所示)。
使用open BaseSystem.dmg命令,将隐藏的BaseSystem.dmg挂载到系统中
- 打开系统自带的磁盘工具,并插入USB闪存盘等外置存储设备到Mac。在左边栏中选中OS X Base System并在右边选择恢复。将USB存储设备图标拖拽到目标磁盘中,然后点击恢复(Restore)。恢复完毕后,在Finder中进入刚刚制作的USB安装设备中的System/Installation文件夹下。删除名为Packages的替身文件,并将OS X Install EDS宗卷根目录下的Packages目录整个拷贝到图2的目录里。
- 将处于/Volumes/OS X Install EDS目录下的BaseSystem.dmg和BaseSystem.chunklist文件拷贝到USB安装设备的根目录下即可最终完成安装设备的制作。
这时,打开系统偏好设置的启动磁盘项,即可选择使用我们刚刚制作的USB设备启动并进行Yosemite全新安装。目前,尚未有一种虚拟机软件可以安装OS X Yosemite。这是由于Yosemite在EFI启动器、内核路径以及内核缓存压缩算法方面的改变(由lzss变为lzvn)所导致。因此,在这些虚拟机软件更新之前,尚无法进行安装。
拷贝Packages目录
用户界面
当Yosemite安装完成并启动Mac后,即可发现不同。黑色的背景配合扁平化的白色苹果Logo,相信iOS 7的用户们并不陌生。从技术上来说,苹果只需替换boot.efi使用的资源文件而已。但就是这点改变,对于用户,特别是第一次接触Mac与OS X系统的用户来说,多了一点亲近感与熟悉感。然而直到登录界面的出现,我们才可以看到类似iOS设备锁定界面的登录窗口。这一改变清晰地表现出了OS X向iOS用户界面整体跟进的趋势。
Yosemite对图形用户界面组件进行了类似iOS的扁平化的处理,但这与iOS那种彻底的扁平化不同。阴影和组件边缘得到了保留(类似在iOS 7中开启Button Shape这个辅助选项后的效果)。这种处理上的差异其实是一种“因地制宜”的做法,毕竟Mac与iOS设备无论在屏幕空间、显示内容方式上都有巨大的差异。再加上OS X和iOS App的设计理念不同,如采用完全的扁平化设计会导致当前应用程序中各个组件元素的辨识率降低,给用户带来困扰,这是苹果不愿意看到的。当然,不排除苹果将来会对OS X App提出新的设计规范,使得完全扁平化成为可能。对于用户组件,这里有几个关键的特性需要开发人员注意。
简化且统一的图标设计
在OS X Yosemite自带的应用程序图标中,我们可以看出,苹果对于应用程序图标的设计大体上可分为三类:
- 以Finder、Terminal为代表的圆角矩形图标;
- 以Mail、TextEdit为代表的倾斜矩形图标;
- 以Safari、Mac App Store为代表的圆形图标。
因此,为了让自己的应用程序与OS X整体风格更加贴合,开发者在设计应用程序图标时,应该尽量遵循以上三种范式。当然,在这三种基础的图标设计方案中,每一种都有其特有的要求,需要在设计时注意,例如圆形图标的白色外边缘、垂直渐变以及底部阴影等。
系统字体
长久以来,OS X系统默认的英文字体为Lucida Grande,而在Yosemite中,则毫无意外地改为iOS系统用户所熟知的Helvetica Neue。这种改变对整个系统来说有什么意义呢?首先,Helvetica Neue作为系统默认字体在iOS 7中已存在了一年多,所以要让OS X和iOS在用户体验上相近,必须在两个系统中统一字体,这是一种既方便用户也方便开发者的做法。其次,在同样内容、同样字号的前提下,Helvetica Neue在字母宽度控制上优于Lucida,这有利于节省宝贵的界面空间从而更有利于界面的布局。第三,虽然Helvetica Neue在小于12号字以下较难分辨(特别是s、c、e、i、l)这类字母。但日渐普及的4K以上分辨率显示设备和苹果自家的Retina技术可在一定程度上对这个缺陷做出弥补(相反,低分辨率的设备在使用Yosemite时,文本显示效果并不如Lucida)。不过,由于我经常阅读英文文档,感觉Helvetica确实比Lucida更难分辨且更易造成疲劳。
层次与区域风格化
在扁平化风格的大背景下,如何突出应用程序内各个元素间的逻辑区域划分和窗口间的层次关系,是一个重要且困难的问题。这个问题在iOS 7发布的早期尤为突出。在OS X Yosemite中,苹果就提供了一系列新特性来方便应用程序开发者解决这个问题。其中最为重要的即半透明化的使用。以Finder为例(如图3所示),其侧边栏为半透明化,这样使得侧边栏区域(多为控制或选择区域)可以轻松地与内容区域区分开来。除了功能区域分割,半透明化也多用在窗口标题栏与工具栏,使得用户更能更加专注于内容本身。以Safari为例 ,当窗口中的页面开始滚动时,窗口标题栏和可能存在的工具栏及标签页栏都会变成半透明,从而尽量减少对用户的干扰,也在视觉上使得整个可视区域变大。对于半透明化利用得最为惊艳的部分当属通知中心。通过整个窗口半透明的设计,将由界面切换导致对用户的影响降至最低。最后一个应用半透明化效果较多的地方则是上下文菜单或浮动的工具、信息窗口,通过半透明化处理,也同样减少了这些元素对于用户的视觉干扰。
Finder的半透明化
色彩
Yosemite提供了全新的系统配色主题设定,除了默认的灰白配色外,还提供了一种全新的黑色主题以满足用户的不同需要。可以预见在Yosemite正式发布后,应该会有利用此特性的软件根据日出或日落时间动态调整系统主题。由于其在当前版本中并未完成,所以我们无法直接进行演示。不过,黑色主题以主题包的形式存在于以下路径中:
/System/Library/CoreServices/SystemAppearance.bundle/DarkAppearance.car
有兴趣的读者可以一探究竟。需要注意,此文件是一个Compiled Assets Resources(.car)文件,里面列出了此主题使用的组件资源文件。同时,Yosemite还提供一个名为CoreThemeDefinition.framework的私有框架,通过框架中的distill工具可以生成.car文件。这似乎也给第三方主题开发者提供了一个可能的自定义系统主题的途径。
动态效果
在系统风格扁平化后,如何让用户获得清晰明了的操作反馈是保证用户体验的另一个重点。在OS X Yosemite中,包括单/复选框、下拉菜单、搜索框等被赋予了默认的动态效果。对于使用非标准用户界面组件的开发者来说,使组件在符合扁平化设计的同时,也一定要有足够的动态反馈才能适合新系统。Core Animation是OS X中的组件动画框架,使用它可以通过简单的代码赋予组件新的活力。由于字体、色彩及半透明化的加入,苹果提供了一系列相对应的API以适应这种改变,这一点开发者应该引起注意。一段简单的示例代码见代码。
内置软件
随着OS X系统的更新,其内置软件附带的新特性也往往成为新系统的亮点。
Finder
Finder是OS X上最古老的应用之一,也是用户与文件系统沟通的唯一通道。在Yosemite中Finder进行了一系列改进。首先是其终于支持AirDrop在OS X和iOS之间的互通。这打破了两个孪生系统之间长达7年的数据隔阂。其次是加入了iCloud Drive功能。用户可以通过支付较低的费用,获取将任意类型文件存储于iCloud中,并获得在所有登录同一苹果ID的设备间进行同步的能力。其实这并非是新功能,早在几年前的.Mac服务时代,用户即可通过iDisk服务在各设备间同步数据。这次苹果将此功能重新带回OS X中,其实还是想利用庞大的用户群体在云存储市场分得一杯羹。毕竟从技术方面来说,在已有iCloud的基础上实现iCloud Drive并非难事。第三,苹果为Finder提供了一个名为FinderSync的新特性,第三方应用程序可以利用此特性为应用程序直接开发基于Finder的扩展,而无须从头编写逻辑。以往,类似Dropbox这类应用,需要通过编写代码监听系统对特定文件夹的 FSEvents从而获知文件夹动作,然后做出同步操作,并编写代码根据状态改变文件夹图标,为特定文件创建上下文菜单等。而通过FinderSync,只需通过配置文件声明即可直接获取到特定文件夹的动态信息,而且,系统提供API使得应用程序可以方便地对特定文件夹及其内容设定提示、图标和上下文菜单。这使得应用程序可以直接发布一个FinderSync扩展注册至系统而无须后台持续监听。
Safari
Safari的改变则更为激进。首先,Safari通过整合窗口标题栏和工具栏为用户争取到了多一点的内容显示空间。其次,它支持自动标题栏、工具栏半透明显示,从而让用户可以更加专注于内容的浏览。在标签页的实现上更进一步,抛弃了以往的等长标签页,而使用自适应宽度的标签页显示。这样,当你打开很多标签页时,可以通过在标签页区域双指左右滑动来浏览标签页。另外,Safari还将标签页和iCloud标签页功能进行整合,当你在Safari主窗口使用两指捏合手势时,Safari即可聚合同一域名下的所有标签页并在窗口下半部分显示其他设备上Safari已打开的链接。值得一提的是,除了传统的Google、Yahoo!、Bing和百度外,Safari还提供了将DuckDuckGo这个新兴的搜索引擎设定为默认搜索项的功能。
Mail
Mail最大的改进有两点,首先是提供了一个名为Markup的功能,使用户可以直接在Mail中对图片、PDF等数据进行标注操作。它的实现原理非常简单:Markup是由预览(Preview.app)提供的一个扩展,你可以通过右键点击/Applications/Preview.app选择显示包内容,然后在Contents/Plugins/目录下即可找到这个名为Markup的扩展。这个扩展非常重要,下文将详细介绍。第二,当你需要使用邮件发送大型附件时,往往首先将其上传到类似Dropbox这样的云存储中,并将链接通过邮件发送。在Yosemite下,你可以利用Mail提供的Mail Drop特性实现同样的功能。当你在附件中添加超大附件时,Mail会提示你是否通过Mail Drop上传附件并将链接通过邮件发出。这个特性需要iCloud邮件账户,并通过与iWork iCloud文档分享类似的技术实现。
Messages
Messages中的最大改进是可以通过Mac同步接收或发送SMS短信息。只需使用同一个苹果ID登录到Mac和iPhone即可实现此功能。另外,点击窗口右上角的联系人详细信息可以直接拨打对方电话,进行FaceTime通话。
Notification Center
Notification Center除了在显示上的改变外,其进一步整合了今天(Today)事项显示,iOS 用户应该较为熟悉此功能。对于功能本身其实并没有太多新意,但这里需要注意的是,第三方应用程序开发者也可以在自己的应用程序中通过扩展向此处添加小工具项(Widget),例如系统自带的“提醒”即可被添加到此处。与前文中介绍的Markup类似,在/Applications/Reminders.app/Contents/Plugins文件夹下,有一个名为com.apple.RemindersNC.appex的系统扩展,它就是Reminders项目在今天事项中显示的关键。
核心技术
对于OS X Yosemite来说,一切新特性都是基于底层技术的更新。这里就来介绍几个Yosemite中的技术重点。
Handoff
Handoff功能是Craig Federighi重点介绍的系统新特性之一。它是一个利用iCloud将工作进程和数据在iOS和OS X设备间进行无缝衔接的技术。简单来说,无论是通过Mac进行接打电话、收发SMS短信息的操作,还是Mac能自动发现开启了热点的iPhone都属于Handoff的技术范畴。当然,对于当前工作状态的同步则是Handoff最重要的特性之一。要使用此功能,首先要求你有一台与Mac登录了相同苹果ID的并运行iOS 8或以上版本的iPhone/iPad设备。然后在Mac上打开系统偏好设置,在通用设定页中启用Handoff。
Handoff特性的中心在于一个NSUserActivity类型的对象。通过将当前应用程序的状态信息存储进NSDictionary类型的userInfo属性中,即可发起一个Handoff请求。对于数据量较小的状态,完全可以直接通过此对象进行传输。对于较大的数据,如附件中的图片或新创建的文档等,则可能需要通过流化数据来提高传输效率。当操作对象在iCloud存储中时,则只需在NSUserActivity对象中保存状态,并提供iCloud文件路径等信息即可。需要注意的是,Handoff并非是一个一对一的关系。例如,一个全功能OS X App可以声明多个类型的Handoff状态,而每一个状态可以对应一个iOS App。另外,如果你拥有一个站点,并在iOS或OS X上有一个本地运行的应用程序,则同样可以通过NSUserActivity将状态传输至另一个没有本地应用程序的设备上,这时,这台设备也可以获取状态并通过浏览器继续。Handoff对于基于文档的应用程序是默认启动的,而其他类型的应用程序需要开发者显式开启。同样,只有通过App Store发布或经过苹果Developer签名的应用程序才能使用Handoff特性。
在OS X上,用来支撑Handoff特性的后台服务是lsuseractivityd,其由launchd启动,配置文件为/System/Library/LaunchAgents/com.apple.coreservices.lsactivity.plist。你可以通过/private/var/folders/g/yy8gxl7972n58k0np3lk112m0000gn/T/lsactivity-actions.log查看接收到的User Activity记录。
App Extension
App Extension在我看来,是苹果近年来最为令人瞩目的一项新特性之一。从其特性来看,苹果在某种程度上放松了对系统的控制,为开发者带来更大的施展空间,利用开发者的力量完善用户体验。以OS X来说,我们可能已习惯使用系统自带的分享功能将图片、网页URL等直接分享到Twitter、微博等社交媒体。但新的社交媒体层出不穷,我们确实无法为OS X添加这些功能。其实自OS X 10.8开始,系统自带的分享功能就是以插件的形式存在的,我们可以通过/System/Library/PrivateFrameworks/ShareKit.framework/Versions/A/PlugIns来查看它们。而App Extension特性的出现将会改变这一状态,任何OS X开发者都可以通过在应用程序内添加App Extension或直接提供App Extension对系统功能进行扩展。像我们在上一节中提到的预览提供的Markup功能和提醒提供的小工具项都是这个特性的实现。在OS X中,App Extension有以下几种。
- Action Extension,Markup扩展即是这种类型。简单来说,这种类型的扩展提供了在其他应用上下文中处理当前数据的能力。如同在使用Mail撰写邮件时,可通过Markup功能直接对邮件附件中的图片进行标注操作而无须打开预览应用。我在Mac App Store有一款应用程序ezText 2,它可以将乱码的文本文件进行处理,并以正确的编码进行存储。如果利用Action Extension,则用户无须打开ezText即可在如文本编辑应用程序中直接使用ezText 2提供的扩展来解决乱码问题。
- Today Extension,提醒所提供的在通知中心Today页面下显示提醒项目的功能就属于这一类型,你也可以编写一个获取当天外汇牌价的小工具项直接在此显示。这一类型的小工具与 Windows下的Widget非常相似。
- Share Extension,它与我们使用的系统自带的分享功能类型相同。这一类型的扩展可以为系统分享菜单添加将数据和文件分享到任意社交网络的项目。当然分享只是一个宽泛的定义,实际上,你可以编写任何代码将数据通过任何形式进行传输、发送或保存。相信通过这个扩展,我们以后就能在OS X系统中直接将文件、数据分享到豆瓣、人人等社交网络中了。
- FinderSync,我们在介绍Finder时曾介绍过这一特性,这里就不赘述了。需要注意的是,FinderSync是以文件为基础的,并且只基于Finder的扩展。
这里以一个Today Extension的例子说明创建一个App Extension有多么简单。首先使用Xcode创建一个OS X App工程。然后点击File菜单,选择New →Target。然后在弹出菜单中选择Application Extension,再选择Today Extension即可。这时Xcode会自动根据模板创建Extension所需要的源文件及一个TodayViewController.xib的Interface Builder项。这就完成了大部分的创建操作,你可以不用改动一行代码直接编译整个工程,Xcode会自动将Today Extension项目正确地打包进主应用程序包中。你可以将此应用程序拷贝至/Applications下等待片刻。这时打开Notification Center点击最下方的Edit按钮,即可将你创建的扩展项加入到Today中。Today Extension的实现较为简单,只有一个方法,如下代码所示。
这里读取的是苹果主页并在一个WebView中显示。WebView放置于TodayViewController.xib中。请注意completionHandler这个Block,当需要刷新数据时,即可通过completionHandler通知系统刷新View并显示新内容。
AppleScript
AppleScript作为一个经常被应用开发者及用户忽略的功能,在OS X Yosemite中也获得了较大更新。主要是在语法层面,其加入了使用JavaScript语法编写AppleScript脚本的特性。其实在我看来,这是一种用于讨好应用开发者的做法。这里用一段简单的语句来说明以上观点,比如获取当前系统进程列表中第一个进程的名称等信息,使用AppleScript编写语法如下:
而使用JavaScript语法则如下面代码:
对于程序员来说,显然第二种JavaScript的表达方式更为顺手也容易理解。这里也顺便建议各位开发者,在力所能及的情况下尽量为你的应用添加AppleScript可操作的接口,从而使你的应用程序更容易被融合进用户的工作流中。这也是目前国产App比较欠缺的。
|