从这一篇开始,我会把iOS 7.0 到最新版本的更新摘要都整理出来,时间跨度可能会很久。这是每一个 iOS SDK(Release Version)发布时,同步发布的 “What's New in iOS x.x” 的摘要(说摘要可能更好一点,毕竟我有许多不熟悉的模块,说翻译要被打肿脸的。。。)。

  做这件事有几个原因:

  1、让自己更加明确 iOS 每个版本的改动。这样的话,我就有很多东西要去学习、完善与修复了;

  2、提升用户体验。因为 iOS 8 一定会比 iOS 7 更好用。如果我的 target 是 iOS 7.0 的话,那我也要做 iOS 8 特有的适配,这让用户觉得 app 细节到位,UI/UE设计与时俱进;

  3、让比我懒的人可以快速了解更新内容。

 

  下面是我阅读的摘要,推荐配合官网原文查看。如果发现我曲解的地方,请留言回复,万分感谢。

 

iOS7.0 更新摘要 (What's New in iOS 7.0)

User Interface Changes(UI变化)

iOS 7有了一套全新的UI设计,用来提升用户体验。

UI Redesign(重做UI)

iOS7最直观的改动是UI。从这个版本开始,UI进入扁平化设计,放弃了拟物化的交互界面。扁平化有诸多优点,最直接的就是简单粗暴,层层深入直达目的。符合信息时代,高效的数据挖掘思路。

Dynamic Behaviors for Views (页面的动态特性)

只要遵守UIDynamicItem 的 protocol 就可以现实view的动态效果。UIKit支持下面这几种行为:
  1、UIAttachmentBehavior  联动效果,两个items的依附
  2、UICollisionBehavior  碰撞效果,对象具有实际体积就可以
  3、UIGravityBehavior  重力效果,字面意思,不过可以设置方向
  4、UIPushBehavior  推动效果,可以是一次性动力,也可以是持续的动力
  5、UISnapBehavior  快速动作,给出一个坐标后,快速响应到那里

  UIDynamicAnimator,这是一个动力对象的处理者,它提供处理所需的context。
  ps:UIDynamic + CA 各种炫酷效果就出来了。。。

Text Kit

这是CoreText的简化版,图文混排从此不再复杂。要玩转它,你要了解这几个类:
1、 NSAttributedString  这是必须要会的,支持各种新增特性。从此文本框可以炫起来。
4、 NSTextStorage  NSAttributedString 的子类,是用来存放文本,可以对文本进行各类操作
2、 NSLayoutManager  这个Manager用来管理文字内容的排版
3、 NSTextContainer  这是整个放置排版好的文本的容器

64-Bit Support(支持64位)

从这个版本开始,iOS SDK 内的 frameworks 和 libraries 都兼容了32位和64位。配合上重新编译后的64位runtime,app可以更快,64位的处理器会给出更多的资源。iOS 会运行在 LP64 模式下,代码移植出错的几率将会降低。(OS X 和其他的 UNIX 都是运行在 LP64 下的。在 LP64 模型中,long 和 pointer 类型都以64位为单位进行对齐。)

Multitasking Enhancements(多任务的增强)

新增两种后台运行(UIBackgroundModes)的任务类型:
  1、fetch  这是用来在后台定期获取数据的。
    在info.plist 里面勾选它就会生效
    setMinimumBackgroundFetchInterval: 这个方法可以设置获取的频率
    application:performFetchWithCompletionHandler:  这个方法用来获取并处理数据。

  2、remote-notification  远程唤醒推送。因为可以唤醒app,所以频率有限制。
    在info.plist里面勾选它并且在aps的payload里面加上这个字段content-available就好了。
    application:didReceiveRemoteNotification:fetchCompletionHandler: 这个方法用来处理推送信息



*** 除此以外的几种分别为:
  1、audio          播放音乐  iOS 4.0+
  2、location        后台定位  iOS 4.0+
  3、voip          VoIP语音  iOS 4.0+
  4、newsstand-content     苹果的NewsStand服务  iOS 5.0+ 
  5、external-accessory    定期向设备传输数据    iOS 5.0+
  6、bluetooth-central     蓝牙交互        iOS 5.0+
  7、bluetooth-peripheral  蓝牙外设模式交互    iOS 6.0+
*** 共7种




Games

iOS7 加强了对游戏的支持。

Sprite Kit Framework

为 2D 和 2.5D 提供了一个图形硬件加速动画系统。并且提供了大多数游戏所需的基础支持:图像渲染、后台音频播放、还有一个模拟物理引擎。

Game Controller Framework

这个 Framework 可以用来连接为 iOS 设备制作的 MFi(Made-for-iPhone/iPod/iPad)设备,比如游戏手柄。这些设备基于蓝牙或者 Wi-Fi 与设备进行交互。你可以控制每个 app 相关的输入。

Game Center Improvements

游戏中心的提升。
  1、新增 Exchanges               游戏玩家间的社交功能
  2、优化 per-app leaderboards    排行榜由25人,加到100人。如果用了 GKLeaderboardSet 设置的话,上限500
  3、优化 Challenges              增加了设置挑战约束的功能,如可以限制使用同一个道具完成任务
  4、加强 prevent cheating        加强了游戏认证以及防作弊的措施

Maps(地图)

MapKit.framework 的改动,包括了许多的提升与新特性的加入。旨在让app能够获取更多地图相关的基本信息。当然3D也开始支持了,并且可以控制视角。Maps Kit还有以下的加强:
  1、覆盖物可以放置在不同的层,也就是你可以自由切换显示的东西了。
  2、可以放一个 MKMapCamera 的实例在地图里面。它可以设置很多参数:位置,倾斜度,标题信息,来提供一个3D的视角。
  3、MKDirections 可以让你从 Apple 获得方向性的信息。你可以依据这些信息设置覆盖物。  
  4、MKGeodesicPolyline 可以让你依据地表弧度创建一个线性的覆盖物。
  5、MKMapSnapshotter 可以让你在地图上截图。
  6、MKOverlayRenderer 提供了更好,更便捷的渲染方式用呈现可视化的覆盖物。
  7、MKTileOverlay MKTileOverlayRenderer 可以改地图的网格切片。

AirDrop

OS X 10.7(Lion)开始支持 AirDrop,而 iOS 到 iOS7 才可以使用。(ps: AirDrop 是通过无线进行文件传输的,不过需要开启蓝牙用于发现设备。)
  AirDrop 在 iOS7 上仅在这个类 UIActivityViewController 里面可以配置。这个类展示了各种分享 app 内容的方案。如果你还没使用过这个类,你可以考虑在你的 app 里面试一下。实现以下两步你就可以接受 AirDrop 传输的文件了:
  1、在 Info.plist 里面配置这个请求
  2、在 app 的 delegate 中,实现这个 application:openURL:sourceApplication:annotation: 方法。当你接受到文件时,这个方法会被调用

  你接受到的文件会被放在 home 目录下的 Documents/Inbox 里面。不过如果你想改动这些文件的话,你要先移动出来再改动。(The system allows your app to read and delete files in this directory only. 这个目录系统只给了你读和删权限。)这个目录下的文件是有加密保护的,所以你要让你的文件在设备锁定时无法被访问。

Inter-App Audio(APP 间的音频)

这个功能依赖于 AudioUnit.framework 新增的特性,它使得同一台设备上的应用程序可以相互发送 MIDI 命令和音频流。使用这个特性,你可以在当前 app 录制音频,然后发送给别的 app 去处理。

  1、想要传输数据给别人处理的话,你要发布一个别的 app 可以发现的音频I/O单元(AURemoteIO)。
  2、想要发现别人分享出来的数据的话,你可以使用 Audio 组件下的发现功能接口。

Peer-to-Peer Connectivity(端对端通讯)

Peer-to-Peer Connectivity:端对端通讯的 MultipeerConnectivity.framework 支持发现附近的设备,和直接发起通讯(可以不需要联网)。它让我们可以轻易建立多点会话,并且可以可靠的按序传输数据以及实时传输数据。依靠它,我们可以和附近的设备进行无缝的数据传输。

  它还提供了相关的界面,让我们发现和管理附近的设备与网络。应用程序可以通过集成这个类 MCBrowserViewController 来展示附近的设备,并且进行选择。当然,你也可以用这个类 MCNearbyServiceBrowser 通过编程来查找和管理端设备。

New Frameworks(新增的 frameworks)

1、GameController.framework,主要是给了游戏外设的支持
  2、SpriteKit.framework,提供了基于精灵(sprite)的动画和图像渲染的API
  3、MultipeerConnectivity.framework,提供了端对端设备交互的API
  4、JavaScriptCore.framework,这个可以直接抓取 webview 运行时的 JS。也就是可以用 js “直接”调用 native 了
  5、MediaAccessibility.framework,提供了展示 app 内媒体文件的隐藏信息API
  6、SafariServices.framework,可以用它把 URL 加入到系统 Safari 的阅读列表中去

Enhancements to Existing Frameworks(现有 framework 的加强)

UIKit Framework

 

1、所有的UI都改成了iOS7风格。
  2、UIKit Dynamics 可以 mimic(模拟)现实世界的动力效果。
  3、Text Kit 提供了更精细的文本编辑和展示功能。
  4、UIView 有了以下提升:
      - 可以使用 tintColor
      - 可以设置 keyframe(关键帧)动画和‘出场’动画
  5、UIViewController 有了以下提升:
      - 可以定义 transitions(转场)
      - 可以控制 status bar(状态栏)样式和可见性
  6、UIMotionEffect 定义了基本的运动视觉效果(其实并不明显)
  7、Collection views,加强了自定义layout的支持。用 Dynamics 还可以给每个 items 加动效
  8、UIImage imageNamed: 这个方法现在支持调用 asset 里面的资源了,也就是 @1x,@2x(以及@3x)的可以放在一起了
  9、UIView and UIScreen 可以自己进行 snapshots,新的截图生成方式明显比渲染页面进行截图要来的快
  10、基于动力的手势可以确保,添加一个新的时,旧的已经失效
  11、UIKeyCommand 可以响应硬件键盘的 evens,这些 events 可以传给 app 处理
  12、UIFontDescriptor 这个实例可以保存字体 attributes 的信息。这个 UIFontDescriptor 可以与其它平台交互(互通)
  13、UIFont and UIFontDescriptor 提供了文本大小的动态支持,这让 app 的可读性更好。因为这可以更好的控制字体,所以每个 app 都应该使用
  14、UIActivity 支持了许多新特性:使用 Air Drop 传输文件,向 Safari 的阅读列表加 URLs,向 Flickr, Tencent Weibo, and Vimeo 发送内容
  15、UIApplicationDelegate 添加了后台获取数据(fetch )的 API
  16、UIKit支持了 guided-access 模式下的运行,这个模式可以保护 app 的内容不被修改。就是可以限制他人的使用
  17、状态存贮,现在支持 any object 了。只要你的 object 实现 UIStateRestoring 的协议,你的 object 的状态就可以在 app 进入后台时写入,在下次返回前台时保持住状态
  18、Table view 现在支持了 cell 高度和别的参数的预估计,这让滚动的体验更好了
  19、你现在可以更容易的将 UISearchDisplayController 和 UINavigationBar 协同工作

Store Kit Framework

SK框架 迁入到了一个新的回执系统,也就是你可以自己通过设备或者服务器查看 iap 的订单回执。

Pass Kit Framework

PassKit.framework 新增了许多 APIs,包括一次添加多个通行证。新增的特性如下:
  1、列举通行证(pass)的过期时间的新键值
  2、你可以根据附近特殊的 iBeacons,列举对应的 pass
  3、新的特性可以控制每个 pass 的展示。可以配置文本,时间样式等等
  4、你可以给每个 pass 关联一些额外的信息。这些信息可以与你 app 相关,但是用户不可见
  5、你可以自定义 pass 的展示区域内,展示的载体

OpenGL ES

iOS7 新增了对 OpenGL ES 3.0 的支持,并且给 OpenGL ES 2.0 添加的很多新特性。

  OpenGL ES 3.0 (被加入)
  在 iOS 中3.0被作为2.0 带有许多新特性的核心功能的扩展。但是 3.0 新增了纹理特性相关的API和一个从来没有在手机上能被使用的核心功能:包括多重渲染目标(MRT)技术与变换反馈技术。
  在设备上创建一个 3.0 的上下文,传递这个常量 kEAGLRenderingAPIOpenGLES3 到 initWithAPI: 方法。

  OpenGL ES 2.0 (新增特性)
  1、EXT_sRGB 的扩展,增加了对帧缓冲器(frame buffer)的 sRGB 的支持;
  2、GL_EXT_pvrtc_sRGB 的扩展,增加了对存放在 PVRTC 中的压缩格式的纹理的sRGB支持(同样手用与3.0);
  3、GL_EXT_draw_instanced 和 GL_EXT_instanced_arrays 的扩展,提升了多个相同 objects 的渲染操作。你可以用单个调用来 draw 出相同的 objects。

  Textures
  2.0 和 3.0都支持了纹理的点作色。查询这个特性 MAX_VERTEX_TEXTURE_IMAGE_UNITS 你可以了解到你需要的纹理的参数(数值类型)。老的版本里面这个参数一直是 0。

Message UI Framework

MFMessageComposeViewController 新增了短信附件的支持。

Media Player Framework

MPVolumeView 提供了用来获取到用户选择了的,无线设备的 route 信息(AirPlay 和 蓝牙)的功能。而且你还能知道这里的 route 现在是不是活跃的。



*** 相关变量如下:
    有没有可用的AirPlay以及是否被选中:
        areWirelessRoutesAvailable 
        isWirelessRouteActive
    这两个是变更时的通知:
        MPVolumeViewWirelessRoutesAvailableDidChangeNotification
        MPVolumeViewWirelessRouteActiveDidChangeNotification
***




Map Kit Framework

这个的变化,在 Maps 里面说了。

Image I/O Framework

现在提供了 UI 界面,用来获取和设置图片的元数据(metadata)。

iAd Framework

iAd.framework 为别的 frameworks 新增了两个扩展,使他们更容易植入广告。
  1、给 MPMoviePlayerController 加了两个方法,让你可以在播放视频前放一段广告
  2、给 UIViewController 扩展了一下,让你可以在显示真实页面前放一段广告

Game Kit Framework

这个有很大的变化,见 Games(游戏)中的  Game Center Improvements。

Foundation Framework

Foundation.framework 有以下的增强:
  1、NSData 支持了 Base64 encoding
  2、NSURLSession 被推出用来替代 NSURLConnection 和 NSURLDownload 以及上述两个的代理
  3、NSURLComponents 可以用来解析 URL 里面的相关内容。解析支持的协议标准为  (rfc3986/STD66)
  4、NSNetService and NSNetServiceBrowser 支持的端对端基于 Wi-Fi 和 Blueteeth 的数据传输
  5、NSURLCredential and NSURLCredentialStorage 提供了让你创建一个同步协议的证书的API,并且也给出了从 iCloud 中使用同步协议移除这个证书的API
  6、NSURLCache, NSURLCredentialStorage and NSHTTPCookieStorage 现在支持异步处理请求的存储
  7、NSCalendar 支持新的日历样式
  8、NSProgress 给出了通用的 API,来监视进度和提供进度数据给 app 中需要的地方

Core Telephony Framework

CoreTelephony.framework 让你获得设备上语音通话相关的信息。app 开发时结合了载体的话,就可以依据载体验证是不是一个特定用户。

Core Motion Framework

CoreMotion.framework 新增了计步和运动跟踪功能。使用计步功能,这个 framework 可以依据用户的运动,发现移动信息,并记录步数。因为是系统帮你记录,所以你的 app 没有运行一样有数据。同时,这个 framework 可以区分运动的类型,包括各种运动的反馈,步行、跑步或者骑车。导航类的 app 可以使用这个特性获得的数据,来告诉用户方位。

Core Location Framework

CoreLocation.framework 支持区域监控和蓝牙定位。前者让你知道你(的设备)到了一个特殊区域,后者让你知道与附近的蓝牙设备的相对位置。举个例子:一个艺术博物馆可以通过区域监控知道参观者在哪一个画廊,然后设置相应的 iBeacons 在附近的作品上。然后 参观者走进站在作品前面时,作品信息就出现在他的手机上。
    
  这个 framework 还提供了设置定位的时间间隔和最小精度的方法。

Core Foundation Framework

CoreFoundation.framework 现在允许你安排线程队列中的流对象。

Core Bluetooth Framework

CoreBluetooth.framework 包括以下增强:
  1、这个 framework 支持保存中央和周围的对象的状态,并且在 app 启动的时候加载回来。使用这个特性,可以支持与蓝牙相关设备的长期交互
  2、中央和周围的类对象,现在统一用 NSUUID 来设置存储唯一标识符
  3、你现在可以通过内部管理对象,同步恢复外部对象

AV Foundation Framework

AVFoundation.framework 有了以下加强:
  1、AVAudioSession 支持了下面的新特性:
    - 选择喜好的音频输入,包括内置的麦克风
    - 多声道的输入输出
  2、AVVideoCompositing 协议和相关类,让你可以自定义视频的合成排版
  3、AVSpeechSynthesizer 及其相关类,让你可以进行语音合成
  4、摄像功能有了改动:
    - 扫描功能的格式和帧速度
    - 高速(高fps)摄像
    - 静态拍摄的稳定性
    - video 的画面大小
    - 实时扫描支持机器可读数据源(二维码的识别)
    - 自动对焦的限制
    - 摄像时平滑的自动对焦
    - 拍摄时共享app的音频(拍摄时可以加BGM)
    - 接入时钟
    - 调用摄像头和麦克风需要用户授权
    - 给出数据输出和 AVAssetWriter 的推荐设置
  5、新的元数据 keys 支持 ISO 标准的格式,如 MPEG-4 和 3GPP。并且提升了转换元数据对象到输出文件时的过滤能力(使用 AVAssetExportSession)
  6、AVAssetWriter 提供了格式化输出的配置,并且是最新的 H.264 标准
  7、AVPlayerLayer 新增了 videoRect 属性,这个属性可以用来获取视频图片的大小和位置
  8、AVPlayerItem 有了以下改变:
    - 当 AVPlayerItem 对象在后台就绪时,Asset里面的属性成员可以自动加载到里面了
    - 当你的 app 接入 iOS 7 SDK时,许多参数都会有默认的返回值了,这和之前的 SDK 版本都不一样。也即是 AVPlayerItem 不会 block 住你的 app 了。当你的播放对象状态转为 AVPlayerItemStatusReadyToPlay 时,getter 会映射到媒体资源实际的数值。如果你用了 KVO,他会收到这些属性改变的通知的
  9、AVPlayerItemLegibleOutput 可以处理媒体文件的字幕
  10、AVAssetResourceLoaderDelegate 协议现在支持从媒体文件中加载任意段落数据

Accelerate Framework

Accelerate.framework 包括以下加强:
  1、可以操纵 Core Graphics 的数据类型
  2、支持1、2、4 ppi 的灰度图像
  3、为图片间的格式转化以及内容转化,定义了新的规则
  4、支持双二阶滤波器(IIR数字滤波器)操作

Objective-C

OC 现在支持了模块化,这使得编译和项目索引更快速。Xcode 5 支持所有项目的模块化,已经存在的项目,你要去修改它的可模块化配置,已保证它可以支持。

Deprecated APIs(弃用的 API,这里的都比较关键)

有时,Apple 会给一些 API 加上弃用的宏,用来说明这些 API 以后将不在开发中使用了。当然,这个宏,并不代表这些 API 会立刻失效,而是我们会有更好的选择来替换这些 API。因为某些历史因素和很多已经发布的程序,这些弃用的 API 依旧是有效的。不过,新的 app 建议使用新的 API,因为新的 API 变化不大,只是修复高危 bugs 和增加安全补丁而已。弃用的 APIs,会在将来的操作系统中被彻底移出。

  作为一个开发者,尽量避免在你的 code 中使用弃用 APIs 是非常重要的。 至少,你新的 code 绝不应该用弃用的 API,已经写好的 code 就去 update 一下。所幸,Xcode 的编译器会在你使用到弃用 API 的地方,给你一个警告,而你可以按照这个警告的提示来更新代码。

  这一个发布版的弃用 APIs,包括一下几个技术区域:
  1、Map Kit framework 中 MKOverlayRenderer 类来代替原有的 MKOverlayView 和它的子类
  2、Audio Session API 中 AudioToolbox.framework 被 AVFoundation.framework 中的 AVAudioSession 类所替换
  3、Core Location framework 中 CLRegion 类被 CLCircularRegion 替换了。但是这个类被当做抽象基类,用来支持地理信息(Geo)和 信标区域(beacon region)
  4、CBCentral 类中的 UUID 被弃用了。设备的唯一标识,可以使用设备的 identifier 属性
  5、Game Kit framework 包含了各种各样的描述,意在清空已有的 API,对新特性提供更好的支持 
  6、UIKit.framework 有以下动作:
    - UIViewController 的 wantsFullScreenLayout 属性被弃用,从iOS 7 开始这个属性默认支持
    - UIColor 对象不再像早期 iOS 版本一样;现在不支持背景纹理了
    - 许多 NSString 类的 draw 选项都被弃用了,因为出了新的变体方法
  7、libsyscall 库中的 gethostuuid 方法被弃用了
  8、从 iOS 7 开始,如果你尝试获得设备的 MAC 地址的话,会永远返回 02:00:00:00:00:00。如果你需要使用唯一标识符,你可以用 UIDevice 的 identifierForVendor 属性;如果你需要做广告的话,必须使用 ASIdentifierManager 的 advertisingIdentifier 属性。