一、iPad多任务功能增强
1、全新的多任务界面
在iOS 9中,多任务界面从原来的横向单层排列进化成层叠排列,从而减少滚屏手势距离,从而加快多任务切换速度。效果如图:
2、多任务分屏功能
在iOS 9中,可以让用户在不离开当前应用的同时,通过侧滑手势来打开第二个App。目前该功能只支持iPad Air 2设备。
分屏功能涉及两部分功能:
* Slide Over- 让我们可以在不离开当前应用的同时就可以打开第二个应用程序,两个应用程序会同时显示在iPad的屏幕上。
* Split View- 放入两个App的显示容器,可以任意切换两个屏幕的比例(五五分屏; 三七分屏)。
注:该功能由用户触发,开发者无法干涉该过程,但是开发者需要做好下面两件事情:
1.由于系统在内存缺乏的情况下,系统会优先结束掉占用内存较大的应用程序。因此,要控制好自己开发的应用所占用的资源(包括内存占用、CPU占用等)。
2.使用Size Classes来适配屏幕。
3、画中画(Picture in Picture, 简称PiP)功能
假如你正在观看一个视频,但突然要用iPad干别的事情,那么现在你不用关闭这个视频了,只需要将这个视频转换成浮动窗口,并随意改变它的大小以及显示位置,接下来你就可以打开别的应用而不会影响视频的显示了。
开发者可以通过使用AVKit.framework中的AVPictureInPictureController和AVPlayerViewController类来实现画中画功能。(参考:Multitasking Enhancements for iPad)
注:AVFoundation.framework也有加入相关的PiP特性。但是在MediaPlayer.framework不支持PiP特性并且被标记为弃用。
二、搜索优化与增强
iOS 9开放了搜索的API,为用户提供了可以访问应用内部信息的搜索功能,当开发者设置应用的内容可以被搜索时,用户可以通过Spotlight、Safari搜索结果、Handoff或者Siri建议中访问到你应用中的内容信息。
使用搜索API可以决定应用中哪些内容会被索引,在搜索结果中显示什么信息,并且可以监听用户在自己应用或者网站上点击的结果来进行重定向操作。
在搜索中可能会涉及到用户的隐私信息,为了让用户得到好的搜索体验并能能够保护自己的隐私,iOS 9中有包含两种索引方式:
1、个人设备索引 - 每个设备都包含一个这样的索引,并且该索引的信息不会与苹果服务器或者其他设备进行共享。当搜索项加入这个索引中,那么只有该设备的用户才能够进行搜索。
2、苹果服务器索引 - 该索引只会存储开发者在网站上标记公开的数据。
开发者可以通过下面API来建立属于自己的内容搜索:
1、NSUserActivity-NSUserActivity API是iOS 8介绍新功能Handoff时引入的,不过在iOS 9里,Spotlight也能搜索到activity。你现在可以给acitivity提供metadata,表示这个activity是能搜到的。实际用起来是一个历史记录栈,跟你平常浏览网页类似。用户可以从Spotlight里快速打开最近使用过的activity。
2、Web Markup-Web Markup的机制是,app可以把内容镜像到一个网站上,然后Spotlight就会索引里面的内容。即使用户设备上没装这个app,Spotlight里也能显示出搜索结果。苹果的爬虫会在网络上持续爬取,寻找网站上的特定markup。之后搜索结果在Safari里和Spotlight里都会出现。
3、CoreSpotlight-CoreSpotlight是一个iOS 9的新框架,能让你索引app里的任何内容。之前提到的NSUserActivity可以用来保存用户的历史信息,而这个新的API可以索引任何数据。它为你接触到用户设备上的CoreSpotlight索引提供了必不可少的桥梁。
三、游戏技术的优化和改进
1、GamePlayKit
GamePlayKit是一个帮助新手开发者们在OS X和iOS平台创作游戏的基础工具和技术框架,可提供游戏资源、模块、玩法设计以及系统规则方面的内容,并不包括视觉渲染等功能。其中包括:
1、随机化(Randomization) - 使用GKRandom协议、GKRandomSource以及GKRandomDistribution class,而且还有更多独特的子类来增加游戏玩法的不确定性,同时不会增加BUG调试量。
2、实体组件系统(Entity-component architecture)- 实体组件系统是一种非常流行和先进的组织游戏逻辑的方式,采用它编写的游戏代码,更容易维护,更容易扩展,同时也更加灵活。
3、状态机(State Machines)-状态机是游戏玩法的骨架,游戏本身就是由一系列的状态机组成的。比如主角动画,AI状态,UI切换,关卡切换等,这些都可以使用状态机巧妙地解决。GamePlayKit通过封装了GKStateMachine和GKState类,把一些共用的逻辑全部抽象出来了,开发者再也不用为每一个游戏去开发单独的状态机了。
GamePlayKit还包含了一些常见的游戏算法,可以使开发者节省开发这些算法的时间,并投入更多的时间来研究游戏中的独特玩法机制。其中算法实现如下:
1、AI策略(Minmax Strategist) -MinMax AI主要用于一些回合类游戏,比如象棋,围棋,Tic-Tac-Toe等。它还能给人类玩家提供一些建议,比如告诉你下一步棋该怎么下。另外,通过计算时间的设置,AI可以定义不同的难度等级。 其中的GKMinmaxStrategist类为这些回合制游戏中的敌人提供AI设计。
2、代理、目标和行为 -Agent指的是会自已移动的游戏实体,它们通过Goal和Behavior来驱动自身的逻辑。Behavior是由一系列的Goal组成的,每一个Goal都包含有相应的权重。Agent在与玩家进行游戏交互的时候,可以表现得更像人类,因为它们也会做决策。以往只有在一些很复杂的游戏里面才会看到的AI,如今通过GamePlayKit,我们可以非常轻松地给自己的游戏也添加了。通过给游戏里面的怪物添加一些AI,能够极大地增强游戏的趣味和粘性。
3、规则系统-可以制作更加复杂的游戏AI,游戏世界的交互不再是“黑即是黑,白即是白”,而是以事先定义好的一定的规则去交互。游戏AI可以实现所谓的模糊逻辑,游戏怪物的活动可以根据定义好的规则系统去动态地调整和评估自己的行为。通过使用GKRuleSystem和GKRule类来制定复杂的游戏逻辑,包括模糊推理(fuzzy reasoning)以及应急行为。
4、寻路算法 - 可以让指定一些节点生成一个双向连接图,然后可以通过简单的API调用找到任意两个点之间的最优路径。所有的有向图的基类是GKGraph,它是一个抽象类。它提供一些共用的逻辑,比如动态地添加和删除节点,连接这些节点并找到任意两个节点之间的路径。此外,GamePlayKit还提供了两种特殊类型的图节点:GKGridGraph和GKObstacleGraph。GKGridGraph非常适合2D游戏里面的路径查找。而GKObstacleGraph则可以设置一些障碍物,节点在寻路的时候,这些障碍物是无法穿越的。SKNode的边界,物理刚体和纹理都可以当作障碍物。
5、随机数发生器 - 每个游戏都有一些特别的随机数生成需求,而rand()函数只能生成一些伪随机数,并且可能跟平台实现还有一些出入。作为开发者,我们需要一个与具体平台无关的随机数生成器,另外这个随机数生成器还能产生符合一定数学分布的随机数。
2、ModelI/O
Model I/O是用处理3D资源和数据的框架,我们可以通过Model I/O快速地加载和导出3D资源文件。另外,它集成在Xcode里面并且和可以非常容易地与GameKit API配合。它的主要功能特性如下:
1、支持多种3D文件格式的导入导出。
2、可以对资源进行修改和Bake。
3、支持3D模型三维像素化(Voxels)。
4、集成Playground, Swift和Finder,并且能够在Finder的Quick look里面预览资源。
5、支持基于物理的材质和光照。
6、结合MetalKit,、GLKit或者SceneKit提供的API来装载资源数据到GPU的缓冲区进行渲染。
3、MetalKit
MetalKit.framework提供了一组工具类和函数,目的在于节省开发Metal应用的时间,让Metal开发变得更加简单。
MetalKit对于一些常见的应用场景提供了高效的实现,开发者可以用更少地代码来开发应用,并且开发出来的应用性能和稳定性会更高。
MetalKit提供了一个MTKView类,它统一处理了渲染一个Metal场景所需要的设置代码,另外,它提供了一个纹理加载器,它可以从一个图片文件中创建一个Metal纹理。最后,MetalKit完美支持Model I/O,让3D模型的处理更加简单。
4、MetalPerformance Shaders
Metal performance shader是一个为GPU提供数据并行算法的一个框架,目前只支持A8处理器。
它定义了一些类似操作CPU风格的API,这样可以让GPU编程变得更加简单。它提供了很多内置的并行算法,比如兰索斯重新取样(Lanczos resampling),卷积函数(比如高斯滤镜等),直方图等。
5、Metal新特性
1、新的内存模型:它一共支持3种内存模型,分别是共享内存模型,私有内存模型和托管内存模型。
2、新的纹理压缩格式(ASTC)
3、设备GPU类型判断:自动根据设备的GPU类型来判断支持的特性集合。
4、MetalKit框架:让Metal应用开发更加简单方便。
5、Metal performance shader框架:提供了一系列数据并行算法。
6、Metal调试工具:更方面地调试Metal图形应用。
7、Metal应用程序瘦身:这一点和上面介绍的SpriteKit瘦身原理是一样的。
6、SceneKit新特性
SceneKit是苹果为了让游戏开发者更方便地开发3D游戏而推出来的,它支持iOS和MacOS X。同时,它还完美支持粒子系统,物理集成和SpriteKit。iOS9中改进了场景编辑器,同时对Metal的支持也更加完善了。场景编辑器功能总结如下:
1、支持更多的3D文件格式:DAE,OBJ,Alembic, STL和PLY文件格式。
2、新的原生文件格式,使用NSKeyedArchiver来存取
3、Shader修改器和环境光遮蔽(Ambient Occlusoni)
4、天空盒(Skybox)和几何修改器
6、支持声音节点
7、支持Model I/O
除了这7点以外,还有诸如compute shader、relfective cub map等功能。新的SceneKit可以根据设备类型自动匹配是否使用OpenGL或Metal作为渲染后端,同时它支持SpriteKit的场景切换,制作SceneKit场景切换效果更容易了。
7、SpriteKit新特性
1、资源分类(Asset catalog)支持,开发者可以更精确地控制不同设备使用的资源分辨率,最重要的是,玩家在下载游戏到设备里面时,只会下载与其设备分辨率匹配的资源。
2、按需加载资源,通过给不同的资源设备Tag,可以指定某些场景和关卡只加载特定Tag的资源。
3、XCode快速预览:支持在Playgound里面使用Swift编写一些测试代码,然后快速预览效果。不需要额外的编译,立马就可以看到API的使用效果,这对于测试一些API和验证一些想法非常有帮助。
4、2D时间轴动作编辑器:这个应该算是SpriteKit的大杀器了,它是一个功能完善的2D动作编辑器,可以支持实时预览动作效果,并且同时支持2D和3D。
5、数据驱动:SKReferenceNode可以让可重用的游戏组件数据化,让玩家可以用更少的代码来完成游戏开发。
6、Metal渲染支持。
7、相机节点(SKCameraNode):更容易创建滚动游戏。
四、App瘦身
这项功能可以让iOS设备在很多安装应用、更新应用以及运行应用等多种场景中仅下载需要的代码而不是所有的资源,这样iOS应用占用的空间就会减少很多,从而节省出更多的剩余存储空间。
App Thinning功能中其实有三个独立的机制:
1、App Slicing- 在节省应用所需资源中发挥着最重要的作用。很多应用需要在不同尺寸的设备上运行,针对这些不同的设备,它们内含不同的独立资源,而大部分是你的设备不需要的。有了App Slices,开发者就可以根据设备添加资源标签,当用户从iTunes下载应用时,它将仅仅下载当前设备需要的资源。
2、ODR -(on-demand resources按需应变资源)是iOS减少应用资源消耗的另外一种方法。比如多级游戏,用户需要的通常都是他们当前的级数以及下一级。ODR意味着用户可以下载他们需要的几级游戏。随着你的级数不断增加,应用再下载其他级数,并将用户成功过关的级数删掉。
3、Bitcode -使得开发者上传应用程序时不必提交预编译的二进制文件,只需要上传中间代码即可。而用户下载时,App Slicing可以根据用户需求,来判断你是需要32位还是64位。也就是说,在用户下载应用之前,App Store在自动编译应用程序。这样,即使开发者没有给他们的代码添加标签,应用也能够执行App Slicing的部分功能,仅下载设备需要的32或64位代码。
五、支持从右至左的语言(RTL)
iOS 9中支持从右至左的语言支持,可以很轻易地使一个用户界面进行翻转。包括:
1、现在所有的UIKit中的控件都支持对这种语言的显示与输入。只要在RTL上下文中即可实现翻转。
2、UIView定义了语法内容属性(semantic content attributes)来指定视图如何显示在一个RTL上下文中。
3、UIImage新增了方法imageFlippedForRightToLeftLayoutDirection,可以很方便的将图片翻转。
六、App传输加密(ATS)
App Transit Security,简称ATS,也就是我们所说的HTTP升级至HTTPS传输。iOS 9与OS X 10.11以后版本已经默认使用ATS,而苹果也要求我们尽快采用ATS。ATS的好处是加强数据安全(客户端与服务器之间的数据传输),防止信息泄露。关于HTTPS参阅TSL/SSL规范。如果我们的服务器端还来不及做相关升级,那么客户端可以暂时回滚至不安全的网络请求方式(依然使用HTTP),当然苹果不提倡长期这样做。具体的设置方法:在info.plist中添加:
七、App扩展
iOS 9中提供几种新的应用扩展:
1、网络扩展
1、使用Packet Tunnel Provider extension point来实现自定义VPN通道协议客户端。
2、使用App Proxy Provider extension point来实现一个透明网络代理协议客户端。
3、使用Filter Data Provider和Filter Control Provider extension points来实现动态的设备端网络内容过滤。
注:每个网络扩展,需要苹果公司许可。
2、Safari扩展
使用Shared Links extension point来让用户通过Safari的分享链接看到你的内容。
使用Content Blocking extension point提供一个屏蔽列表,让你的用户使用你的App浏览Web内容时屏蔽指定的内容
3、Spotlight扩展
使用indexing extension point对App内的数据进行索引。
使用Index Maintenance extension point实现在不重启App的情况下对App内的数据重新建立索引
4、Audio Unit extension point允许App提供类似于GarageBand,Logic等App提供的乐器演奏,音频特效,声音合成功能。
八、Contactsand Contacts UI
Contacts.framework和ContactsUI.framework这2个新的面向对象的库取代了之前的Address Book与Address Book UI frameworks来对通讯录进行相关操作。
九、WatchConnectivity
WatchConnectivity.framework提供iPhone和与之配对的Apple Watch之间进行双向的文件、数据传输。这套框架能够让配对的两个设备上同时运行的App进行即时通信,也可以进行后台通信。
十、钥匙串
iOS9中支持更多的项目保护选项和增加一项属于Secure Enclave的加密密钥。做了若干安全方面的改进:
1、keychain中敏感数据的物理存储位置已经迁到Secure Enclave(iOS设备上自5s开始增加的一个协处理器)中。
2、Keychain的访问属性kSecAttrAccessibleAlways将被弃用。
3、当使用TouchID来保护Keychain中的数据时,可以通过touchIDAuthenticationAllowableReuseDuration来指定TouchID验证的间隔,间隔期之内可以免验证读取Keychain数据
4、新增允许创建一个只需要Touch ID或者密码就能访问控制列表的约束。
5、新增当添加或者删除指纹时无效钥匙串项的TouchID约束。
6、为了从SecItem调用中分离认证调用,提供了一个认证的上下文。
7、使用kSecAttrTokenIDSecureEnclave属性可以在Secure Enclave中生成密钥并在内部使用该密钥。需要注意的是访问这些密钥会被所访问的控制列表约束。
8、支持以使用访问控制列表中的Application Password选项为钥匙串项加密的应用提供信息熵
十一、Swift加强
iOS9中Swift将包含在系统内,这意味着在iOS9中,安装Swift语言编写的应用并不需要更多的空间。
苹果为iOS、OS X和Linux平台推出了Swift编译器和标准库,并基于开源协议进行发布。
错误处理方面的变化,Apple从Cocoa传统的基于NSError错误处理方式变为了throw catch的异常处理机制。
新加了一些像是guard和defer这样的控制流关键字,这让Swift的书写更加简化,阅读起来更流畅。
加入了avaliable块,以前开发者需要自己去记忆API的可用性,并通过检查系统版本并进行对比来做这件事情。现在有了avaliable检测,编译器将会检查出那些可能出现版本不匹配的API调用,app开发的安全性得到了进一步的保障。
十二、系统框架改动
1、AVFoundation Framework
增加了新的AVSpeechSynthesisVoice API,它使开发者可以通过标识代替之前的语言标识来指定一个语音。也可以使用名称和质量属性来获取语音信息。
2、AVKitFramework
使用AVPictureInPictureController和AVPlayerViewController类,实现Picture in Picture功能。
3、CloudKitFramework
对于CloudKit应用程序,开发者可以使用CloudKit的Web Services或CloudKit JS,他是一个JavaScript库,为应用用户访问相同数据提供了网络接口。开发者必须要有一个已经创建好的数据库结构,才能使用网络接口来获取、创建、更新和删除这些记录、区域或者订阅。
4、FoundationFramework
包括以下增强功能:
1、用于按需加载一个NSBundle资源API。
2、Strings文件的上下文相关的可变宽度的字符串支持。
3、增加电源和散热管理的NSProcessInfo API
5、HealthKitFramework
包括以下增强功能:
1、对跟踪生殖健康和紫外线照射的等新领域的支持。
2、新增批量删除条目和跟踪删除条目功能。
6、LocalAuthentication Framework
包括以下增强功能:
1、可以获得一组当前登记的指纹标识,使应用程序能够根据指纹登记或者删除来执行相应的操作。
2、支持通过代码来取消用户提示。
3、支持评估钥匙串访问控制列表,并在钥匙串调用中使用的认证上下文。
4、支持可重复使用的触摸ID匹配。可以使用evaluateAccessControl:或者evaluatePolicy:localizedReason:reply:.获取前一个手机解锁的匹配。
7、MapKitFramework
MapKit框架对功能进行了一些补充,可以帮助您提供更丰富的用户体验。具体包括:
1、支持查询公交的预计到达时间和公交路线。
2、地图视图支持了3D天桥模式。
3、注释可以完全定制。
4、MapKit和CLGeocoder可以为搜索结果提供时区信息。
8、PassKitFramework
PassKit框架在Apple Pay中包括几个附加功能的增强。具体包括:
1、Apple Pay支持Discover cards、借记卡和信用卡。
2、发卡机构和支付网络可以直接在他们的应用程序中添加卡到Apple Pay中。
9、SafariServices Framework
包括以下增强功能:
1、SFSafariViewController可以用来显示你的应用程序中的网页内容。它和safari共享Cookie和其他网站数据,并有许多的Safari浏览器的强大功能,如Safari自动填充和Safari阅读器。与Safari浏览器本身相比,SFSafariViewController UI是一个单一的Web页面,有一个完成按钮可以使用户回到应用程序中。
2、如果您的应用程序显示的网页内容,但不自定义内容,可以考虑更换WKWebView或UIWebView为SFSafariViewController。
10、UIKitFramework
UIKit框架包括许多增强功能,如:
1、UIStackView类实现一组垂直或水平堆叠的视图。
2、新增UIView布局(如leadingAnchor和widthAnchor)NSLayoutAnchor和NSLayoutDimension。
3、新增UILayoutGuide类,帮助开发者对视图的一个区块进行布局。
4、新增UIApplicationDelegate的一个方法,该方法可以使开发者以非副本形式打开或者修改一个文档。要支持open-in-place功能,需要再应用程序也的Info.plist文件中增加LSSupportsOpeningDocumentsInPlace键并设置为YES。
5、使用UITextInputAssistantItem类来布局在快捷栏的按钮。
6、增强触摸事件,例如能够获取最后一次屏幕刷新时发生的触摸行为并作出触摸预测
7、增强的UIKit动力学,如用于非矩形碰撞边界检测等。
8、UIUserNotificationAction类中新增behavior属性,可以让开发者在用户通知中进行文本输入。
9、新增NSDataAsset类,使得更加方便获取定制设备的内存和图形处理能力。
10、所有标准的UIKit控件翻转,能够支持从右到左的语言。此外,导航,手势,Collection View和TableViewCell的布局也适当地翻转。
11、弃用API
Address Book和Address Book UI frameworks。取而代之的是Contacts和Contacts UI frameworks。
参考地址:https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW1