iOS 8 新特性
这篇文章会介绍iOS8开发相关的主要特性。
App 插件
通过支持插件,iOS8让我们可以系统指定的区域进行扩展,也就是为用户的特定需求提供自定义的方法。例如:可以通过App插件帮助用户分享他们的内容到社交网站。在用户安装了这个插件后,当他在App中点击分享按钮时就可以选择这个插件了。自定义的插件提供接受,认证,发布用户内容的功能。系统会在分享菜单中列出他们并且在用户点击后实例化他们。
在Xcode中,可以通过添加预先配置好的带插件的app来创建它。当用户安装有插件的app后,用户可以在设置中启用它。当用户在使用其他app时,系统会在适当的系统界面中显示插件,比如分享菜单。
iOS在下面这些区域支持插件:
分享:分享内容到社交网络
动作:用选定的内容执行简单任务
今天:在今天的通知中心中提供快速更新或执行简单任务
照片编辑:在照片类型的app中执行图片或视频的编辑。
提供存储:为其他app提供文件存储。App使用文件选择控制器可以打开或移动文件到文件存储提供者。
自定义键盘:提供一个用户在所有app中都可以使用的键盘。
每种插件都定义了他们可以使用的API。当使用插件模版开始开发时,会自动创建一个带有默认值的模版。
Touch ID 认证
现在app可以使用Touch ID来认证用户。有些app可以需要安全登录才能查看内容,有些app可能部分内容需要安全登录,不管哪一种,都可以要求用户认证后再进行其他操作。可以使用本地认证框架(LocalAuthentication.framework)来弹出一个弹出框(指定为什么需要认证)来让用户进行认证。当app获得回复后,它可以根据用户是否认证成功来执行接下来的操作。
PassKit
PassKit框架支持支付凭证和支付请求。支付请求让用户可以安全的提供他们的支付信息来为实体货物或服务付款。支付凭证用在网络支付上。
照片
在app中拍更好的照片,为照片类app提供了新的编辑能力,并且为访问用户照片提供了更高效的方式。
照片框架
照片框架(Photos.framework)为照片和视频提供了新的API,包括访问由照片APP管理的iCloud照片。这是一个更强大的框架,主要功能包括线程安全的,获取和缓存缩略图和大图,修改图片。
可以使用这个框架来创建编辑图片和视频的插件
手动控制摄像头
AV基础框架(AVFoundation.framework)让我们可以容易拍出好照片。app可以直接控制摄像头的焦点,白平衡,曝光度等设置。另外app可以使用曝光截图来自动在不同曝光度下截图。
改进了摄像头方法
使用下来的API来发现iPhone6 和iPhone6 Plus中的摄像头新属性
新的属性(videoHDRSupported)可以检测设备是否支持高速运动捕获
新的视频稳定模式(AVCaptureVideoStabilizationModeCinematic)提供了更好的拍摄电影的模式
新的属性(HighResolutionStillImageOutputEnable)可以设置AVCaptureStillImageOutput对象来拍摄高清静态图片。
新的属性(autoFocusSystem)可以用来判断摄像头是如何聚焦的。
游戏
iOS8技术的改进让使用游戏的图形和视频更简单。使用上层框架的优势可以更容易的开发,也可以使用底层的技术来改进GPU的能力。
Metal
Metal提供了A7和A8底层GPU的访问,可以进行复杂的图形渲染和计算任务。Metal消除了很多技术瓶颈,比如传统图形API中很耗资源的状态验证。Metal把所有的状态转移和比较操作从关键的性能敏感的代码中移除。Metal预处理了着色器,状态对象,以及明确的计划任务来保证程序达到尽可能高的GPU性能和计算效率。这个设计思想也扩展到的创建app的工具中。在创建app时,xcode会预先编译Metal的着色器,这样可以消除运行时准备着色器的成本。
图形,计算以及位块传输指令被无缝高效的一起使用。Metal就是为高效处理这些事务设计的,比如多线程运算和共享内存,更好的使用GPU命令
使用Metal,可以使用一个精简的API,统一的图形和计算语言,基于Xcode的工具,这样就不用学习更重框架,语言,工具来使用GPU了。
SceneKit
SceneKit是一个Objective C框架用来创建简单游戏以及丰富用户交互的高性能的3D游戏。SceneKit在OS X 10.8就已经支持了,现在首次在iOS上支持。底层的API(比如OpenGL ES)需要实现详细的渲染场景的逻辑。相反,SceneKit只需要描述场景的内容(形状,材质,灯光,摄像头)然后加上如何做动画就行了。
SpriteKit
SpriteKit框架(SpriteKit.framework)添加了一些新属性来支持更好的游戏效果。包括自定义OpenGL ES着色器,和SceneKit交互,以及新的物理效果和动画。比如,可以使用SKFieldNode类创建物理区域来模拟重力,拖动,加速效果。可以很容易的实现物理的碰撞。
AV音频引擎
AVFoundation框架(AVFoundation.framework)增加了很多上层的音频方法。这些方法在OS X和iOS上都可以使用,包括访问音频输入输出,音频录制和播放,以及音频分析和转换。同时也可以添加特殊的效果和过滤器,控制播放速度,立体声和3D音频效果,以及MIDI乐器。
OpenGL ES
iOS8对APPLE_clip_distance, APPLE_texture_packed_float, APPLE_color_buffer_packed_float进行了扩展
HealthKit Framework
HealthKit(HealthKit.framework)是一个新的管理用户健康相关信息的框架。由于有各种不同的app和设备来追踪健康数据,用户很难明确的知道他们意味着什么。HealthKit让app更容易的分享数据,不管是从设备来的信息还是用户自己输入的。用户的信息数据被统一的安全存储起来。用户可以在Health app中看到所有的数据。
如果app准备支持HealthKit,它可以访问用户健康相关的数据并且也可以提供数据,而且不需要特定的健康相关的硬件。用户可以决定哪些数据可以分享给app。一旦用户允许app访问,app可以注册数据改变的通知。app会获得很详细的通知。例如,可以请求用户测量血压的通知,或者用户血压过高时接受通知。
HomeKit Framework
HomeKit(HomeKit.framework)是一个为交流和控制设备连接到家庭的新框架。家庭中的设备可以有更好的用户体验。HomeKit提供了一个设备间通讯的标准方式。
app可以使用HomeKit来在他们家庭中的设备间通讯。使用你的app,用户可以发现和配置家庭中的设备。他们也可以创建控制设备的动作,用户也可以通过Siri控制他们。配置好之后,用户也可以邀请其他人加入。比如,用户也可以临时加入一个家庭网络。
可以使用HomeKit模拟器来测试设备上的HomeKit app。
iCloud
iCloud有一个更新可能会对现有用户有影响
文件数据迁移
iClound在用户设备和服务器之间的文件和数据传输更可靠。当用户安装了iOS8并且登录iCloud账号,iCloud服务器会为当前用户执行一次文件和数据的迁移。这个迁移包括复制用户的文件和数据到一个新的文件夹下。这个文件夹只能在iOS8和OS X10.10中访问。之前的操作系统仍然访问以前的文件夹,但是对数据的改变不会出现的新文件夹下,新文件夹下的改变也不会出现在以前的文件夹下。
CloudKit
CloudKit(CloudKit.framework)是一个app和icloud传输数据的通道。和其他封闭的iClound技术不同,CloudKit让你可以控制什么时候传输。并且可以使用CloudKit控制所有类型的数据。
使用CloudKit存储数据到一个库中可以被所有的用户共享。这个公共的库绑定在一个app上但是可以被设备上任何地方访问(就算没有登录iClound账号)。作为开发者,可以直接管理这个数据并且可以管理所有的修改。
Document Picker
文件选择控制器(UIDocumentPickerViewController)可以让用户在程序外访问程序的沙盒。是app间共享文件的一种简单方式。它也支持一些复杂方式,比如用户可能在多个app中编辑同一个文件。
文件选择器可以访问多个文件提供者的文件。比如,iClound可以让你访问其他app存储在iClound的文件,第三方开发者也可以提供文件。
Handoff
Handoff是一个在OS X和iOS上跨设备增强用户体验的功能。Handoff可以让用户在一个设备上开始一个活动,然后切换到另一个设备上并且可以在另一个设备上保持同一个活动。例如,用户在Safari中浏览一个很长的文章然后切换到登录统一apple id的iOS设备上,同样的网页在iOS的Safari中会自动打开,并且会滑动到以前设备的地方。Handoff让中体验无缝连接。
要使用Handoff的话,app只需要实现Foundation中的几个API。每个用户正在运行的活动由一个对象表示,并且它包含其他设备上需要还原的信息。当用户选择要恢复活动时,这个对象会发给另一个设备。每个活动对象有一个委托,它会在合适的时候被调用来刷新活动。
如果继续活动不仅仅需要一个活动对象的数据,恢复的app可以与原始app建立一个数据流。基于文本的app会为基于iClound的文档自动支持这个功能。
支持新的屏幕大小和缩放
iOS8上的app需要准备支持iPhone6和iPhone6 Plus屏幕大小。在iPhone6 Plus上,app需要同时支持新屏幕的缩放。特别是,使用OpenGL ES和Metal的app需要选择CAEAGLLayer或CAMetalLayer来在iPhone6 Plus上有更好的展现。
要让系统知道app支持iPhone6的屏幕大小的话,需要在app中包含一个storyboard启动屏幕文件。在运行时,系统会寻找storyboard启动屏幕文件。如果这个文件存在,系统会认为app支持iPhone6和iPhone6 Plus并且会以全屏模式运行。如果不存在,系统会使用小的屏幕尺寸(320*480 或 320 * 568)这样app的屏幕计算仍然是正确的。然后内容会被拉伸来适应屏幕。
iOS8也添加了新特性让处理屏幕大小和方向更容易。创建一个界面同时支持iPad和iPhone,适应不同的方向和屏幕大小变的更容易。使用size类,可以获得设备在当前方向的整体大小信息。可以使用这个信息来实现最初设想的,哪些内容需要显示,以及这些元素和其他元素的相对位置。然后使用auto layout来重新计算大小和位置。Xcode6使用size类和autolayout来创建storyboards自动适应不同的尺寸。
描述Size类以及界面的缩放
Size类可以为界面元素指定属性,比如屏幕或界面。iOS8中有两种size类:regular和compact。regular用户定义大片的屏幕区域,比如在iPad上,或者屏幕上的一大张插图,或者iPhone的滚动。每个设备都有一个size类,包括横屏和竖屏。
下面的图展示了iPad的size类。因为有足够的空间,iPad的横屏和竖屏都有一个regular size类。
iPhone的size类根据设备的方向不同而不同。在竖屏下,屏幕水平的有一个compact size类,竖直的有一个regular size类。这是竖直滚动获取更新信息的常用方法。当iPhone在横屏下,他们的size 类就不同了。大部分iPhone在水平和竖直都有一个compact size类。但是iPhone6 Plus在横屏模式下有一个足够大的空间支持regular宽度。
可以把size类和view关联起来。当小界面包含在大界面中时这种方法很灵活。使用默认的size类来在大界面中布局用户界面,然后根据不同的size类调整到你任何合适的位置。
要支持size类的话,可以使用下面的类:
- UITraitCollection类用来描述对象的属性。Traits指定size类,显示的缩放,以及特定对象的属性。支持UITraitEnvironment协议的类(比如UIScreen, UIViewController,UIView等)都有一个trait集合。可以获得对象的trait集合以及在traits改变时执行他们。
- UIImageAsset类用来根据traits把图片之类对象的分组。把不同traits下细微不同的相似图片分组然后在对应的trait下自动的获取正确的图片。UIImage类为它做了一些修改。
- 支持UIAppearance协议的类可以根据不同的trait自定义对象的界面。
- UIViewController类可以为子界面获取trait集合。可以在viewWilltransitionToSize:withTransitionCoordinator:方法中改变子界面的布局。
Xcode6支持统一的storyboard。sotryboard可以添加删除界面以及根据当前显示的界面来限制布局。比起维护两个不同的storyboard,可以为多个尺寸设计一个storyboard。首先设计一个公用的界面,然后为不同的界面做微调,充分利用每个尺寸的优势。可以使用Xcode6在各种尺寸下测试来保证他们正确的显示
支持新屏幕缩放
iPhone6 Plus使用新的高清屏。为了支持这个分辨率,iPhone 6 Plus创建了一个屏幕大小是414 * 736以及缩放比例是3.0(1242 * 2208像素)的屏幕。屏幕的内容渲染后,UIkit会自动适应1080 * 1920分辨率。要支持这种渲染行为,需要设计新的3x屏幕图。在Xcode6中asset catelogs可以包含1x,2x以及3x大小。只要把新的图片加进去,iOS就会自动选载正确的大小在iPhone6 Plus上运行。iOS的图片加载同样支持@3x后缀。
在使用Metal或OpenGL ES的图形app中,内容可以直接按照当前的显示尺寸进行渲染。对于高性能的3Dapp来说每次渲染都需要很多计算。可以利用缓存为要显示的内容先渲染。
UIScreen对象提供了一个新属性(nativeScale)来查看当前屏幕的缩放比例。当nativeSale的值和屏幕的scale值相同时,渲染的像素分辨率和屏幕的实际像素分辨率是一样的。当两个值不同时,可以在显示之前对要显示的内容进行采样。
如果是一个OpenGL ES app,GLKView对象会分局界面大小以及contentScaleFactor属性自动的创建渲染的缓存。在界面加到窗口之后,把view的contentScaleFactor值设置为屏幕的nativeScale属性。
GLKView对象支持缩放
- (void) didMoveToWindow { self.contentScaleFactor = self.window.screen.nativeScale; }
在Metal app中,app也需要有上面相似的代码。另外,当界面的大小改变后,也需要更新drawableSize属性
CGSize drawableSize = self.bounds.size; drawableSize.width *= self.contentScaleFactor; drawableSize.height *= self.contentScaleFactor; metalLayer.drawableSize = drawableSize;
其他框架更新
除了上面的主要更新以外,iOS8也包含了其他的改进
API Modernization
一些iOS框架有一些接口上的改变来适应modern objective-c 语法
- 大部分类中,Getter和setter方法被properties替代。已经使用getter和setter方法的可以继续正常工作。
- 初始化方法更新为返回id类型返回值。
- 声明的内容会被指定的初始化。
大部分情况下, 这些改变不需要app做什么额外工作。然而,可能需要在你自己的objective-c代码中更新这些改变。也就是说,需要优化代码来更好的与Swift代码交互
AV Foundation Framework
AV Foundation框架(AVFoundation.framework)可以在拍视频时记录其他数据。各种数据可以随着时间嵌套在视频中。比如,可以记录拍摄视频的位置信息。
AVKit Framework
之前OS X中的AVKit框架(AVKit.framework)现在iOS也支持了。可以是使用它来播放视频。
CoreAudioKit Framework
这个框架让跨应用的音频变的容易。
Core Image Framework
- 可以在iOS中创建自己的图形内核
- Core image可以发现图形中的矩形以及QR码
Core Location Framework
- 可以判断设备在哪一层,如果设备在一个多层建筑上的话
- 访问服务提供一些用户感兴趣的地点信息
Core Motion Framework
Core Motion 提供了两个新类(CMAltimeter和CMAltitudeData)可以访问iPhone6和iPhone6 Plus的气压表。这两种设备上,也可以使用CMMotionActivity对象判断用户是否在自行车上。
Foundation Framework
- NSFileVersion类提供iCloud文档的历史版本。这些版本被存在iCloud,但是可以下载。
- NSURL类可以存储文件缩略图。
- NSMetadataQuery可以搜索app打开的iCloud文件
Game Controller Framework
- 如果控制器接到设备上,可以通过Game Controller Framework接收设备的动作数据
- 如果只在乎按钮点击而不在乎按的压力,按钮点击后可以传给游戏处理
GameKit Framework
- iOS7中添加的属性现在OS10.10也支持了,可以更好的制作跨平台游戏。
- 新的GKSaveGame类以及GKLocalPlayer让保存和加载用户的游戏进度更容易。数据被保存到iCloud。GameKit会处理设备和iCloud间的文件同步工作。
- 使用字符串标识用户的方法被弃用了。使用GKPlayer对象来标识用户。
UIKit Framework
- 使用本地或远程推送服务的app需要使用UIUserNofiticationSettings对象来明确的指明提示的类型。注册流程从注册远程推送服务的流程中分离祝来。而且需要用户同意。
- 推送可以执行app定义的操作。自定义的操作在提示中以按钮的形式显示。点击后,app会被通知然后执行相应的操作。本地通知也可以由位置信息驱动。
- Collection界面支持动态改变cell的大小。
- UISearchController类替代UISearchDisplayController来管理搜索相关的显示。
- UIViewController实现了traits以及新的计算大小的技术来调整内容。
- UISplitViewCOntroller可以在iPhone上支持了。
- UINavigationController有一些新的选项来改变navigation bar以及如何隐藏它。
- UIVisualEffect可以为界面增加模糊效果。
- UIPopoverPresentationController类处理popover中的内容。
- UIAlertController类替代UIActionSheet和UIAlertView类来显示提示信息。
- UIPrinterPickerController类提供一个显示打印机以及选择打印机的界面。打印机由UIPrinter类实例表示。
- 用户可以直接进入app相关的设置界面。
更多内容,参考官方文档