新特性
對(duì)于開發(fā)者來說,好消息是 iOS 10 中并沒有加入太多內(nèi)容。按照適配的需求,來年的 iOS 開發(fā)至少應(yīng)該可以從 iOS 8 甚至 iOS 9 開始,iOS 10 更專注的是對(duì)現(xiàn)有內(nèi)容的改進(jìn),以彌補(bǔ)之前迅速發(fā)展所留下的一些問題,這其實(shí)正是 Apple 當(dāng)下所亟需做的事情。SiriKit 在 iOS 10 里面開發(fā)者可以使用 。
下面具體列出iOS10開發(fā)中的一些新特性:
1.Siri SDK,這可能是 iOS 10 最重要的新 SDK之一。從此開發(fā)者可以使用原生API提供語(yǔ)音搜索、語(yǔ)音轉(zhuǎn)文字消息甚至更多常見語(yǔ)音功能。
2 Proactive Suggestions ?貌似是一個(gè)和 CoreSpotlight 有整合的使用建議的東西,大概就是Siri建議那種根據(jù)使用習(xí)慣推薦吧。
3 Message App Extension ? 在 iOS 10 里面開發(fā)者可以給 Message.app 提供兩種 App Extension,分別是可以提供一個(gè)表情包(沒錯(cuò),英文名就叫 Sticker Pack),和一個(gè)自定義的界面,用于表情搜索等,顯然這是一個(gè)讓表情 app 開發(fā)商們笑到哭的 API,我也做了幾個(gè)表情包發(fā)上去了。MessagesExtension
4 User Notifications 這個(gè) API 讓你可以處理本地或遠(yuǎn)程的用戶通知,并且可以基于某個(gè)條件,例如時(shí)間或者地理位置。這個(gè)異常強(qiáng)大,好像可以在通知里包含圖片和視頻了,貌似可以攔截并替換自己 app 發(fā)下來的 payload。
5 Speech Recognition? 見聞知意,語(yǔ)音識(shí)別 API,可以把音頻流實(shí)時(shí)的轉(zhuǎn)換為文本。雖說早期版本已經(jīng)有了TTS語(yǔ)音轉(zhuǎn)文字,但畢竟Siri語(yǔ)義識(shí)別的加入讓機(jī)器對(duì)自然語(yǔ)義的把握更精準(zhǔn),詳見Speech.framework
6 App Search Enhancements 對(duì) CoreSpotlight 的增強(qiáng),其中我比較感興趣的是 Visualization of validation results。
7 Widget Enhancements 為了配合 iOS 10 鎖屏下面 Widget 的體驗(yàn),蘋果提供了 widgetPrimaryVibrancyEffect 和 widgetSecondaryVibrancyEffect 用于定制化 Widget 的界面。
8 、CallKit? 非常重要的 API,繼2014年蘋果推出VoIP證書后,這次VoIP 接口的開放,以及一個(gè)全新的 App Extension,簡(jiǎn)直是VOIP的福音,可見蘋果對(duì)VOIP的重視。callkit框架 VoIP應(yīng)用程序集成與iPhone的用戶界面,給用戶一個(gè)很棒的體驗(yàn)。用這個(gè)框架來讓用戶查看和接聽電話的鎖屏和VoIP管理聯(lián)系人電話在手機(jī)APP的收藏夾和歷史記錄。callkit還介紹了應(yīng)用程序的擴(kuò)展,使呼叫阻塞和來電識(shí)別。您可以創(chuàng)建一個(gè)應(yīng)用程序擴(kuò)展,可以將一個(gè)電話號(hào)碼與一個(gè)名稱聯(lián)系起來,或者告訴系統(tǒng)當(dāng)一個(gè)號(hào)碼應(yīng)該被阻止?!皌hat enable call blocking and caller identification. You can create an app extension that can associate a phone number with a name or tell the system when a number should be blocked.” 大概是可以做電話黑名單功能了。按我的理解,也就是說你的網(wǎng)絡(luò)電話可以拓展到系統(tǒng)電話中,鎖屏?xí)r可以利用系統(tǒng)電話UI代為接聽而不必解鎖打開你的native App,再通過拓展關(guān)系把來電信息回調(diào)給你的native App。換句話說,今后的VoIP應(yīng)用可以像iPhone系統(tǒng)電話那樣享有很高的UI拓展權(quán)限,不同VoIP電話的通話記錄都可能在電話應(yīng)用里看到。
9、App Extensions? 其實(shí)上面也有提到,iOS 10最重要的開發(fā)特點(diǎn)就是允許第三方應(yīng)用對(duì)自帶基礎(chǔ)app的拓展關(guān)聯(lián), 全新 7 種 App Extension:
Call Directory(VoIP回調(diào))
Intents(接Siri、Apple map等服務(wù))
Intents ?UI(接Siri、Apple map等服務(wù)的自定義界面)
Messages(iMessage拓展)
Notification Content(內(nèi)容通知)
Notification ?Service (服務(wù)通知)
StickerPack(iMessage表情包)
10、 Custom Keyboard 對(duì)第三方鍵盤的改進(jìn) ?非常非常重要,第三方鍵盤一直都不能很方便的擁有長(zhǎng)按地球鍵的功能,現(xiàn)在有了。通過 handleInputModeListFromView:withEvent: 可以彈出系統(tǒng)鍵盤列表。同時(shí)使用 documentInputMode 可以檢測(cè)輸入上下文中的語(yǔ)言,你可以對(duì)輸入方式進(jìn)行一些類似于對(duì)齊方式的調(diào)整。
另外需要注意的是,和以往歷代iOS版本推出一樣,新陳代謝,有新SDK、新API的開放,也會(huì)有舊的API被遺棄,所以好好檢查你的項(xiàng)目,使用了被遺棄的API要盡快修改,以免不兼容!還有個(gè)要注意的問題 iOS10 對(duì)隱私權(quán)限的管理更為嚴(yán)格 ,比如訪問的攝像頭、麥克風(fēng)等硬件,都需要提前請(qǐng)求應(yīng)用權(quán)限、允許后才可以使用,或者現(xiàn)在要提前聲明,雖然以往要求不嚴(yán)格。
在iOS10和Xcode8中遇到的問題
1.iOS10 隱私權(quán)限問題 閃退 崩潰:
***This app has crashed because it attempted to access privacy-sensitive data without a usage description. ?The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

NSContactsUsageDescriptioncontactsDesciption
NSMicrophoneUsageDescriptionmicrophoneDesciption
NSPhotoLibraryUsageDescriptionphotoLibraryDesciption
其中這個(gè)string值可以隨意寫:(只要是在給用戶彈窗授權(quán)是描述使用目的的)
2.需要注意的是Xcode也是向前兼容的,在Xcode8上打開項(xiàng)目要小心,尤其是對(duì)于xib工程,在變動(dòng)后可不要隨意點(diǎn)保存,否則當(dāng)你回頭用Xcode7打開時(shí)時(shí)發(fā)現(xiàn)報(bào)錯(cuò)了,Xcode8 更新保存的xib 配置文件在xcode7上有些是識(shí)別不了的!
3.在Xcode8、iOS10SDK上新建iOS工程你將看到Message Application和Sticker Pack Application,后者是為iMessage表情包專門準(zhǔn)備的,但是不需要代碼。
4.Xcode8上調(diào)試工程啥也沒干就打印一堆爛七八糟的東西,我這處女座看著不爽,具體也沒細(xì)研究,目前的粗暴解決辦法是去edit scheme的RUN Debug下的Arguments 里的環(huán)境變量(environment variables)下,添加設(shè)置Name:OS_ACTIVITY_MODE ? ?--> Value: disable
5.使用Xcode8的同學(xué)應(yīng)該發(fā)現(xiàn)以往習(xí)慣command+/來快捷注釋代碼 的功能失效了!這個(gè)是因?yàn)樘O果提升xcode安全,默認(rèn)把一些權(quán)限關(guān)閉了,比如默認(rèn)把插件屏蔽了。解決方法命令運(yùn)行: ?sudo /usr/libexec/xpccachectl ?有些須重啟Mac或Xcode后生效
6.有部分同學(xué)反映說在iOS10下 tabbar不見了,不過我尚未沒有見過這這種情況,可能我從2014年后基本所有的項(xiàng)目都用了storyboard和xib吧。建議確認(rèn)規(guī)范一下初始化代碼,或者在Xcode8下重構(gòu)一下這部分代碼或者使用storyboard。 據(jù)我所知,iOS10下UITabBarController并無(wú)新變化,只是iOS10 UITabBarItem多了個(gè)badgeColor和BadgeTextAttributes屬性設(shè)置。
7.VoIP網(wǎng)絡(luò)電話應(yīng)用要引起重視了,沒有使用VoIP推送的網(wǎng)絡(luò)電話應(yīng)用后臺(tái)時(shí)iOS10 下已經(jīng)明確警告??:Legacy VoIP background mode is deprecated and no longer supported.趕緊使用PushKit吧,比傳統(tǒng)的APNS推送更能保證即時(shí)性和省電了。
生態(tài)整合與 Extension 開發(fā)
在 iOS 10 里 Apple 延續(xù)了前幾年的策略,那就是進(jìn)行平臺(tái)整合。全世界現(xiàn)在沒有另外一家廠商在掌握了包括桌面,移動(dòng)到穿戴的一系列硬件設(shè)備的同時(shí),還掌控了相應(yīng)的從操作系統(tǒng),到應(yīng)用軟件,再到軟件商店這樣一套完整的布局。Apple 顯然也非常明白這個(gè)優(yōu)勢(shì)意味著什么。所以近年來 Apple 一直強(qiáng)調(diào)平臺(tái)整合,如果你的應(yīng)用能夠同時(shí)在 iOS,watchOS 以及 macOS 上工作的話,毫無(wú)疑問將會(huì)更容易吸引用戶以及 Apple 的喜愛。
另外一點(diǎn)則是各個(gè)應(yīng)用之間的整合和交互。不難發(fā)現(xiàn),隨著近年來 extension 開發(fā)的興起,Apple 逐漸在從 app 是“用戶體驗(yàn)的核心”這個(gè)理念中轉(zhuǎn)移,變?yōu)橛脩魬?yīng)該也可以在通知中心,桌面掛件或者手表這樣的地方完成必要交互。而應(yīng)用之間的交互在以前可以說是 iOS 系統(tǒng)的禁區(qū),但是去年隨著 Workflow 的成功,Apple 對(duì)于應(yīng)用之間的交互有助于用戶生產(chǎn)力的提升有了清晰的認(rèn)識(shí)。今年 SDK 中幾個(gè)重大更新其實(shí)都是圍繞這個(gè)主題來進(jìn)行的。
iOS 10 中,Apple 為我們添加了茫茫多 extension 的新模板,以至于在同事之間開玩笑都是我們馬上就要丟掉 iOS app 開發(fā)者的工作,而轉(zhuǎn)變?yōu)?iOS extension 開發(fā)者這樣了。新加入的擴(kuò)展的種類和數(shù)量都足以說明使用應(yīng)用擴(kuò)展以及進(jìn)行擴(kuò)展開發(fā)在今后 iOS 開發(fā)中的重要地位。如果你對(duì)擴(kuò)展開發(fā)還一無(wú)所知,可以先看看這篇入門文章,里面簡(jiǎn)單介紹了關(guān)于擴(kuò)展的基本概念,不同開發(fā) target 之間代碼共享的方式,以及通用的擴(kuò)展開發(fā)方法等。
SiriKit
Siri API 的開放自然是 iOS 10 SDK 中最激動(dòng)人心也是亮眼的特性。SiriKit 為我們提供一全套從語(yǔ)音識(shí)別到代碼處理,最后向用戶展示結(jié)果的流程。Apple 加入了一套全新的框架 Intents.framework 來表示 Siri 獲取并解析的結(jié)果。你的應(yīng)用需要提供一些關(guān)鍵字表明可以接受相關(guān)輸入,而 Siri 擴(kuò)展只需要監(jiān)聽系統(tǒng)識(shí)別的用戶意圖 (intent),作出合適的響應(yīng),修改以及實(shí)際操作,最后通過 IntentsUI.framework 提供反饋。整個(gè)過程非常清晰明了,但是這也意味著開發(fā)者所能擁有的自由度有限。
在 iOS 10 中,我們只能用 SiriKit 來做六類事情,分別是:
語(yǔ)音和視頻通話
發(fā)送消息
發(fā)送或接收付款
搜索照片
約車
管理健身
如果你的應(yīng)用恰好正在處理這些領(lǐng)域的問題的話,添加 Intents Extension 的支持會(huì)是很棒的選擇。它將提高用戶使用你的應(yīng)用的可能性,也能讓用戶在其他像是地圖這樣的系統(tǒng)級(jí)應(yīng)用中使用你的服務(wù)。
User Notifications
通知中心向來是 iOS 上的兵家必爭(zhēng)之地。如何提供適時(shí)有效的通知,往往決定了用戶活躍和留存的可能性。在 iOS 10 上,Apple 對(duì)通知進(jìn)行了加強(qiáng)和革新?,F(xiàn)在,為了更好地處理和管理通知,和本地及推送通知相關(guān)的 API 被封裝到了全新的框架 UserNotifications.framework 中。在 iOS 10 中,開發(fā)者的服務(wù)器有機(jī)會(huì)在本地或者遠(yuǎn)程通知發(fā)送給用戶之前再進(jìn)行修改。
另外,在之前加入了 notification action 以及 text input 的基礎(chǔ)上,iOS 10 又新增了為通知添加音頻,圖片,甚至視頻的功能?,F(xiàn)在,你的通知不僅僅是提醒用戶回到應(yīng)用的入口,更成為了一個(gè)展示應(yīng)用內(nèi)容,向用戶傳遞多媒體信息的窗口。
User Notifications 筆記 - 活久見的重構(gòu) - iOS 10 UserNotifications 框架解析
iMessage Apps
Message 應(yīng)用大概是 Apple 在宣傳 iOS 10 時(shí)著力最多的部分了。雖然新的貼紙包,自動(dòng)轉(zhuǎn)換顏文字,發(fā)送全屏效果等功能都很酷炫,但是對(duì)于程序開發(fā)者來說,可能還是對(duì) iMessage Apps 更感興趣。Xcode 8 中,Apple 在 iOS Application 模板中添加了一類新的項(xiàng)目類型,Messages Application。同時(shí),模擬器甚至還開發(fā)了新的雙人對(duì)話模式,以供開發(fā)者調(diào)試這類 app。
雖然名義上是獨(dú)立 app,但實(shí)際上工作的依然是一個(gè) extension。在該擴(kuò)展中,Messages.framework 將承擔(dān)與系統(tǒng)的 message 界面交互的主要職責(zé)。你通過提供一個(gè)自定義的 View Controller,來獲取用戶在使用你的 message app 時(shí)進(jìn)行對(duì)話的上下文,以及發(fā)送接收等操作,并做出合適的響應(yīng)。這個(gè)擴(kuò)展在用來進(jìn)行直接在 Message 應(yīng)用中一些自定義共享會(huì)很好玩。但是鑒于 Apple 暫時(shí)沒有打算將 Message.app 跨平臺(tái)的原因,可能也注定了這只會(huì)是一種補(bǔ)充,而無(wú)法成為主流。
IDE 和工具改進(jìn)
除了整合平臺(tái)戰(zhàn)略思想下的一些 SDK 改變,今年和 iOS 開發(fā)者相關(guān)的更多的是開發(fā)工具的進(jìn)步和革新了。
Xcode 8
Xcode 8 展現(xiàn)出了很多有意思的新特性,比如更強(qiáng)大的 View Debugging,可以幫助我們追查內(nèi)存引用問題的 Memory Debugging 等。這些工具十分強(qiáng)大,也將幫助我們?cè)陂_發(fā)過程中及早發(fā)現(xiàn)問題,而不要將它們帶入在最終產(chǎn)品中去。
在 app 簽名方面,Apple 終于意識(shí)到了他們?cè)?Xcode 7 中所犯得錯(cuò)誤。我想可能不止一個(gè)人被證書和描述文件出問題時(shí)的 "Fix Issue" 按鈕坑過。這個(gè)按鈕不僅不會(huì)修正問題,反而會(huì)直接注銷現(xiàn)有的開發(fā)者證書,然后“自作主張”地重新申請(qǐng)。大多數(shù)情況下,這讓事情變得更加糟糕。特別是對(duì)于新加入的開發(fā)者,他們并不理解 Apple 的證書系統(tǒng),錯(cuò)誤的操作和處置,往往讓開發(fā)環(huán)境變得不可挽回。Xcode 8 中,同一個(gè)開發(fā)者帳號(hào)現(xiàn)在允許多個(gè)開發(fā)證書,而完全重做的 app 簽名系統(tǒng)也足夠好用,并且避免了誤操作的可能性。在兼顧自動(dòng)配置的基礎(chǔ)上,也為大型項(xiàng)目和復(fù)雜的 CI 環(huán)境提供了足夠靈活的配置空間,這絕對(duì)值得點(diǎn)贊。
另外 Xcode 終于提供了進(jìn)行代碼編輯器擴(kuò)展的能力?,F(xiàn)在開發(fā)者可以創(chuàng)建 XCSourceEditorExtension 來對(duì) Xcode 的功能進(jìn)行擴(kuò)展了,在沒有文檔幫助和官方支持的情況下摸索著為 Xcode 制作插件的歷史也即將結(jié)束。
Swift 3
Swift 開源已經(jīng)過去半年時(shí)間。在 Swift 2.2 中我們已經(jīng)看到了開源的社區(qū)力量對(duì)語(yǔ)言產(chǎn)生的深刻影響,而在 Swift 3 中這一影響的效果將更加明顯。
最大的變化在于 Foundation 框架的重新導(dǎo)入,可能過一段時(shí)間再回頭看的話,這將標(biāo)志著 Swift 與 Objective-C 徹底分家。Foundation 框架中的 API 現(xiàn)在以更符合 Swift 的方式被導(dǎo)入到語(yǔ)言中。大體來說,這些變化包括去除 NS 前綴,將絕大部分 class 轉(zhuǎn)換為 struct (雖然底層還是 copy-on-write 的引用實(shí)現(xiàn),可以參看 ReferenceConvertible 協(xié)議的內(nèi)容),去掉 API 中重復(fù)的語(yǔ)義等。如果在當(dāng)前你還能看出 Swift 和 Objective-C 在使用 Foundation 或者說開發(fā) app 時(shí)同根同源的話,Swift 3 正式發(fā)布后可能情況會(huì)大不相同。
由于引用類型向值類型的轉(zhuǎn)換,也將導(dǎo)致我們?cè)谑褂?Swift 開發(fā)時(shí)的思考方式發(fā)生變化。以往的 Foundation 框架中類型的可變性是由不可變類型和它的可變類型版本 (比如 NSData 和 NSMutableData) 來進(jìn)行區(qū)分的。而在 Swift 3 中,一般來說將只有作為結(jié)構(gòu)體的不可變類型 (比如 Data),對(duì)于這類結(jié)構(gòu)體的改變,將會(huì)是更安全的基于寫時(shí)復(fù)制的行為,而不再是原來可變對(duì)象那樣的危險(xiǎn)的內(nèi)存操作。這在很多時(shí)候除了保證數(shù)據(jù)共享時(shí)的安全性以外,內(nèi)部的引用特性也保證了調(diào)用速度。實(shí)際上,因?yàn)闇p少了不必要的復(fù)制 (比如根據(jù)一個(gè)不可變對(duì)象創(chuàng)建相應(yīng)的可變對(duì)象),實(shí)際上通過 Swift 3 的 API 使用 Foundation 的速度將比原來更快!
關(guān)于 Swift 3 的更多內(nèi)容,我會(huì)在我的《Swifter - 100 個(gè) Swift 必備 tips》一書中通過補(bǔ)充章節(jié)的方式進(jìn)行說明。同時(shí),該書現(xiàn)有的 Swift 2 相關(guān)的描述和示例也會(huì)按照 Swift 3 的語(yǔ)法規(guī)范和特性進(jìn)行更新,以適應(yīng)最新版本。您可以訪問 swifter.tips 獲取這本書的更多相關(guān)內(nèi)容。
Apple 生態(tài)和其他
另外影響比較重大消息是,在 iOS 9 引入的 ATS 將在來年更加嚴(yán)格。2017 年起,新提交的 app 將不再被允許進(jìn)行 http 的訪問,所有的 app 內(nèi)的網(wǎng)絡(luò)請(qǐng)求必須加密,通過 https 完成。所以如果你家 app 的服務(wù)器或者某些訪問頁(yè)面還是 http 的話,需要盡早過度到 https。
另外,watchOS 3 和 tvOS 也有一些新的內(nèi)容。其中最重要的當(dāng)屬 watchOS 中可以使用 SceneKit 和 SpriteKit。雖然這兩個(gè)框架本意是做游戲,但是 watch 的小屏幕和低性能可能并不足以支撐我們?cè)谶@樣一個(gè)受限平臺(tái)很好的作品。但是這兩個(gè)框架可以為交互乏味的 watchOS 提供很好的動(dòng)畫效果的補(bǔ)充,可能會(huì)是它們?cè)?watchOS 上更合適的用途。