一、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的可用性,并通過檢查系統版本并進行對比來做這件事情?,F在有了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