作者:破船之家

引言

今天(北京时间2013年06月11日)凌晨,由库克引领的苹果发布了iOS7,本次新系统的发布可以说是iOS自发布以来最大的一次变革,iOS的设计由之前的拟物变为了现在的扁平化——这也标志着苹果真正的进入了库克时代。
目前苹果只发布了iOS7的beta版本,虽然据闻有不少bug,不过无论你对iOS7的设计是吐槽也好,惊艳也罢,基调已经定下来了,苹果的这次革新,是否能够获得用户的青睐,就让用户来检验吧。
按照往年的惯例,iOS7的release版本预计会在今年9月份发布,在这差不多3个月的时间里面,苹果的主要任务估计就是完善并加强iOS7的稳定性了。
为了观察开发者对WWDC2013的关注情况,在WWDC开幕的时候,笔者分别在新浪微博和Twitter上检索WWDC关键字,发现相关新讯息更新的速度非常快,从这一个角度来说,无论是国内的开发者,还是国外的开发者,对苹果非常的期待。
虽说iOS和相关设备的每次升级更新,都会引来大批的code monkey吐槽(譬如去年iPhone5的发布),不过吐槽归吐槽,想想社会是进步的,没有大胆的尝试,又哪来进步呢——无论成功与否,苹果这种引领业界创新的精神才应该是值得大家欣赏与效仿的!
好吧,上面说了一大堆内容,貌似与本文主题“iOS新特征”偏离太远,下面我们就来看看iOS7里面的一些新特征:
无论是对于开发者或用户来说iOS7都是非常重要的一次更新,iOS7对UI进行了彻底的重新设计。另外为了创建2D和2.5D游戏,iOS7引进了一套全新的动画系统。在iOS7中,多任务的增强、点对点的连接,以及其它一些重要的特征都足以使iOS7意义非凡。
下面我们就来细数一下iOS7的新特征:
[green_box]关键字:用户界面的改变、多任务的增强、游戏、地图、AirDrop、应用程序间的音频、点对点的连接、一些新的Framework、已有Framework的增强、OC和弃用的一些API等。[/green_box]

用户界面的改变

在iOS7整个系统中,每一方面的设计都重点突出功能以及用户的内容——半透明和精致的视觉感受——流畅和逼真的动作——具有清晰、深入和有活力的用户体验。对于开发者来说,无论是创建一个全新的App,或者对已有的程序进行升级更新,在设计的时候,都需要时刻记住这些特点。
在用户界面设计中,新增了一个重要的概念:UIKit动力(UIKit Dynamics)。通过UIKit动力,在我们的程序中可以为UIView对象指定动力行为,以及让别的对象遵循UIDynamicItem协议——(遵循该协议的对象称为动力项[dynamic items])。动力行为通过将现实世界中的行为和特征与程序相结合(例如将重力加入程序的动画中),以提供一种增强用户体验的方法。UIKit默认支持如下5种动力行为:

  1. 吸附行为(UIAttachmentBehavior):有一个对象UIAttachmentBehavior,该对象用来指定两个动力项(项或点)之间的连接,当一个项或者点移动时,吸附的项也随之移动。当然,这个连接并不是完全是静态的(static),吸附的项有两个属性damping(阻尼)和oscillation(震荡),这两个属性决定了吸附项的行为是如何随时间而变化的。
  2. 碰撞行为(UICollisionBehavior):通过对象UICollisionBehavior指定一个边界,并且让各个动力项,在该边界内参与碰撞。UICollisionBehavior对象还可以指定这些动力项适当的回应碰撞。
  3. 重力行为(UIGravityBehavior):通过对象UIGravityBehavior给动力项指定一个重力矢量,具有重力矢量的动力项,会在重力矢量的方向上一直加速,直到与别的动力项产生了冲突或者,遇到了边界。
  4. 推动行为(UIPushBehavior):通过对象UIPushBehavior给动力项指定一个持续的或者瞬时的力(force vector)。
  5. 捕捉行为(UISnapBehavior):通过对象UISnapBehavior给动力项指定一个捕捉点。动力项会根据配置的效果,来抓住这一捕捉点。

当动力行为被添加到animator(UIDynamicAnimator类的实例对象)时,动力行为就被激活。animator为动力行为的执行提供了上下文。动力项可以有多个行为,只不过所有这些行为都必须添加到相同的animator中。
更多关于动力行为的使用,请参考UIKit Framework Reference。
另外还有Text Kit是一个功能齐全、更高级别的Framework——通过该Framework,可以对程序中的文本内容进行精致的排版。Text Kit能够将文本内容按照段落、列和页进行布局。可以很容易的让文本围绕着某个区域进行布局(例如图形),并且可以管理多种字体。值得一提的是,在iOS7中,已经将TextKit整合到所有基于文本的控件中,这样一来,在程序中,对文本的创建、编辑、修改和显示都非常的容易——不像在之前iOS中,需要更多的代码来实现。
关于动力行为和Text Kit,随后,笔者会给出一些示例,敬请关注!
下面我们来看看iOS7中对多任务都做了哪些增强。

多任务的增强

iOS7中,应用程序的后台执行模型,新增了如下两种类型:

  1. fetch:如果应用程序需要从网络中有规律的下载新数据,那么现在可以通过向系统注册一下,使新数据的下载操作可以定期的被唤醒或者启动以在后台进行下载。注册方法为:在程序的Info.plist中,将UIBackgroundModes键值设置为fetch,然后在app delegate中,使用方法setMinimumBackgroundFetchInterval:来设置下载新数据操作之间的最小时间间隔。另外,必须在app delegate中实现application:performFetchWithCompletionHandler:方法以执行任意的下载。
  2. remote-notifaction:在iOS7之前,程序中使用的推送通知是用来给用户推送新的消息,而有新的消息到达时,如果需要获得消息相关更多内容时,还需要用户启动相应的程序,以在程序中获取新的消息内容,而现在在iOS7中,通过推送通知,可以启动一个后台下载操作任务。要使用这种模型,只需要将程序Info.plist文件中的UIBackgroundModes键值设置为remote-notification,然后在app delegate中实现application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。

无论是fetch或remote-notification后台执行模型,在适当的时机,都有可能被启动或者从休眠(suspended)状态转移到后台状态。就拿fetch后台模型来说,系统会根据当前可用的信息来来决定启动或者唤醒程序的最佳时机。例如,当网络条件不错,或者设备已经被唤醒的时候,会启动或唤醒程序以执行程序的fetch后台操作。再来看看remote-notification后台执行模型——当有一条新的推送通知到达设备时(在通知用户之前),程序可以先去下载新的消息内容,当内容都准备好之后,就可以通知用户了——可见,对于remote-notification后台执行模型,可以让用户把注意力都集中在内容上,这也符合本文开头提到的iOS7设计重心。
在程序中,处理后台下载数据时,应用使用NSURLSession类。这个类对已有的NSURLConnection类进行了改进——针对初始化和处理NSURLRequest对象,提供了一个简单的、基于任务的接口。单个NSURLSession对象可以初始化多个下载和上传任务,并且通过它的delegate,可以处理来此服务器的任意身份认证请求。
关于多任务的更多内容,在随后的博文中,笔者会进行详细的介绍,读者也可以查阅iOS App Programming Guide中的“App States and Multitasking”。
[yellow_box]建议:本文的内容主要参考苹果官网提供的一份文档:What’s New in iOS 7(From GitHub,From Apple),如果你英文好的话,建议你去阅读原文。[/yellow_box]
下面继续介绍iOS7中的新特征:游戏、地图和AirDrop。

游戏

iOS 7 GameCenter
在iOS7中,苹果加强了对游戏开发的支持。这主要体现在如下三个方面:
Sprite Kit Framework
Sprite Kit Framework (SpriteKit.framework)提供了一个优化了的硬件加速动画系统——用于创建2D和2.5D游戏。包括了游戏开发中许多重要的基本内容:图形渲染、动画系统、声音播放,并还有一个物理模拟引擎。通过Sprite Kit Framework可以让开发者把工作重点放在游戏内容的设计和交互上。
Sprite Kit Framework中,内容是以场景(scenes)的形式组织的。一个场景可以包括:纹理对象、视频、基于路径的形状、图片滤镜以及其它有些特殊的效果。Sprite Kit以最有效的方式来决定这些对象在屏幕上的渲染。当需要在场景中对某个对象进行动画时,可以使用Sprite Kit来明确的指定一个动作,或者使用物理模拟引擎给某个对象定义一个物理行为(例如重力、吸附和排斥)。
除了Sprite Kit Framework,苹果还提供了Xcode工具来创建粒子发射效果和纹理集合。通过Xcode工具可以管理程序的assets,以及快速的更新Sprite Kit场景。
更多关于如何使用Sprite Kit,读者可以参考Sprite Kit Programming Guide。苹果也提供了一个示例演示如何使用Sprite Kit:Explained Adventure(From Apple)。
Game Controller Framework
Game Controller Framework (GameController.framework)可以让你在程序中发现并对游戏控制器硬件进行配置。通过Game Controller Framework可以让iOS设备通过无线或者蓝牙进行连接。当控制器可用的时候,该Framework会通知你的程序。
更多相关信息可以参考Game Controller Programming Guide。
Game Center 改进
在iOS7中,苹果对游戏中心(Game Center)做了如下改进:
给玩家提供一个与其它玩家互动的机会,即使目前还没有轮到该玩家。通过该功能,可以实现玩家之间的聊天、交易等(即使没有轮到玩家)。
每个程序的排行榜限制已经从原来的25变为100.通过GKLeaderboardSet对象,可以对你的排行榜进行组织,并把上限增加只500。
在游戏中进行挑战(做任务)的时候,可以为这个挑战添加条件限制。例如,在驾驶游戏中,指定必须使用相同的车辆。
为了防止作弊,增加了认证的支持,以及其它有些功能。
更多关于如何使用新的Game Center功能,请参考Game Center Programming Guide 。
关于Game Kit Framework,请参考Game Kit Framework。

地图

iOS 7 Map
基于地图信息,苹果对Map Kit framework (MapKit.framework)做了大量的改进,并新增了不少功能。使用地图来显示的位置信息现在可以利用3D地图了,可以通过编程的方式来控制地图的视角。Map Kit还做了其它一些重要的改变:

  1. 图层(Overlay)可以被放置在地图中不同的层中,这样就可以将图层放置在相关数据的上面或者下面。
  2. 可以使用MKMapCamera对象在地图中增加一个位置、倾斜和航向信息。摄像头信息可以给地图增加3D视图体验。
  3. 通过MKDirection类可以从苹果那里请求获得方向相关的线路信息。通过获得的线路信息可以创建一个图层并显示到地图中。
  4. MKGeodesicPolyline类可以参照地球的曲率,创建一个基于线条的图层。
  5. 使用MKMapSnapshotter类可以捕捉基于地图的图片。
  6. 目前可视化的图层是基于MKOverlayRenderer的,这取代了之前的图层视图,并提供了一个简单的渲染方法。
  7. 可以使用MKTileOverlay和MKTileOverlayRenderer类来取代地图上已有的大头针(tile)。

更多相关信息,请阅读Map Kit Framework Reference 。

AirDrop

iOS 7 Airdrop
通过AirDrop,用户可以给附近的iOS设备分享图片、文档、URL以及其它有些数据。AirDrop支持内置到已有的UIActivityViewController中——这个类会根据分享的不同数据显示出不同的选项。苹果建议:如果你的程序中还没有使用这个类,请考虑将其添加到程序中。
更多关于利用activity view controller来访分享数据的信息,请参考UIActivityViewController Class Reference。