文章轉(zhuǎn)載:https://onevcat.com/2017/06/ios-11-sdk
(作者的文章寫得非常好,深入簡(jiǎn)出,非常棒)
年紀(jì)大了過了能熬夜看 WWDC 的時(shí)代了,但是還是在小小寶的哭鬧和媽媽大人換尿布的催促中起了個(gè)大早水醋。于是算趁著“熱乎”把 WWDC 2017 的 Keynote 看完了蹬竖。和往年差不多林艘,雖然 WWDC 是一個(gè)開發(fā)者會(huì)議灰伟,但是 Keynote 并不是專門針對(duì)我們開發(fā)者的呆奕,它還承擔(dān)了公司狀況說明峰尝,新品發(fā)布等功能偏窝。作為技術(shù)人員,可能接下來(lái)的 session 會(huì)更有意義武学。要用一句話來(lái)評(píng)價(jià)今年 Keynote 所展現(xiàn)出來(lái)的內(nèi)容的話祭往,就是小步革新。大的技術(shù)方面可以說只有 ARKit 可堪研究火窒,但是我們還是看到了類似跨 app 拖拽硼补,新的 Files 應(yīng)用這樣進(jìn)一步突破 iOS 原有桎梏的更新 (iMessage 轉(zhuǎn)賬什么的就不提了,我大天朝威武熏矿,移動(dòng)支付領(lǐng)域領(lǐng)先世界至少三年)已骇。iOS 11离钝,特別是配合新的硬件,相信會(huì)給用戶帶來(lái)不錯(cuò)的體驗(yàn)褪储。
作為 iOS 開發(fā)者卵渴,和往年一樣,我整理了一下在可能需要關(guān)注的地方鲤竹。
新增框架
新加入 SDK 的大的框架有兩個(gè)浪读,分別是負(fù)責(zé)簡(jiǎn)化和集成機(jī)器學(xué)習(xí)的 Core ML 和用來(lái)創(chuàng)建增強(qiáng)現(xiàn)實(shí) (AR) 應(yīng)用的 ARKit。
Core ML
自從 AlphaGo 出現(xiàn)以來(lái)辛藻,深度學(xué)習(xí)毫無(wú)疑問成了行業(yè)熱點(diǎn)碘橘。而 Google 也在去年就轉(zhuǎn)變 Mobile-first 到 AI-first 的戰(zhàn)略≈。可以說一線的互聯(lián)網(wǎng)企業(yè)幾乎都在押寶 AI痘拆,目前看來(lái)機(jī)器學(xué)習(xí),特別是深度學(xué)習(xí)是最有希望的一條道路氮墨。
如果你不是很熟悉機(jī)器學(xué)習(xí)的話田弥,我想我可以在這里“僭越”地做一些簡(jiǎn)介呛每。你可以先把機(jī)器學(xué)習(xí)的模型看作一個(gè)黑盒函數(shù)仓技,你給定一些輸入 (可能是一段文字焕梅,或者一張圖片)青灼,這個(gè)函數(shù)會(huì)給出特定的輸出 (比如這段文字中的人名地名涕癣,或者圖片中出現(xiàn)的商店名牌等)仗岸。一開始這個(gè)模型可能非常粗糙耿焊,完全不能給出正確的結(jié)果诚镰,但是你可以使用大量已有的數(shù)據(jù)和正確的結(jié)果奕坟,來(lái)對(duì)模型進(jìn)行訓(xùn)練,甚至改進(jìn)清笨。在所使用的模型足夠優(yōu)化月杉,以及訓(xùn)練量足夠大的情況下,這個(gè)黑盒模型將不僅對(duì)訓(xùn)練數(shù)據(jù)有較高的準(zhǔn)確率抠艾,也往往能對(duì)未知的實(shí)際輸入給出正確的返回苛萎。這樣的模型就是一個(gè)訓(xùn)練好的可以實(shí)際使用的模型。
對(duì)機(jī)器學(xué)習(xí)模型的訓(xùn)練是一項(xiàng)很重的工作检号,Core ML所扮演的角色更多的是將已經(jīng)訓(xùn)練好的模型轉(zhuǎn)換為 iOS 可以理解的形式腌歉,并且將新的數(shù)據(jù)“喂給”模型,獲取輸出齐苛。抽象問題和創(chuàng)建模型雖然并不難翘盖,但是對(duì)模型的改進(jìn)和訓(xùn)練可以說是值得研究一輩子的事情,這篇文章的讀者可能也不太會(huì)對(duì)此感冒凹蜂。好在 Apple 提供了一系列的工具用來(lái)將各類機(jī)器學(xué)習(xí)模型轉(zhuǎn)換為 Core ML 可以理解的形式馍驯。籍此阁危,你就可以輕松地在你的 iOS app 里使用前人訓(xùn)練出的模型。這在以前可能會(huì)需要你自己去尋找模型汰瘫,然后寫一些 C++ 的代碼來(lái)跨平臺(tái)調(diào)用狂打,而且難以利用 iOS 設(shè)備的 GPU 性能和 Metal (除非你自己寫一些 shader 來(lái)進(jìn)行矩陣運(yùn)算)。Core ML 將使用模型的門檻降低了很多吟吝。
Core ML 在背后驅(qū)動(dòng)了 iOS 的視覺識(shí)別的Vision框架和 Foundation 中的語(yǔ)義分析相關(guān) API菱父。普通開發(fā)者可以從這些高層的 API 中直接獲益,比如人臉圖片或者文字識(shí)別等剑逃。這部分內(nèi)容在以前版本的 SDK 中也存在浙宜,不過在 iOS 11 SDK 中它們被集中到了新的框架中,并將一些更具體和底層的控制開放出來(lái)蛹磺。比如你可以使用 Vision 中的高層接口粟瞬,但是同時(shí)指定底層所使用的模型。這給 iOS 的計(jì)算機(jī)視覺帶來(lái)了新的可能萤捆。
Google 或者 Samsung 在 Android AI 上的努力裙品,大多是在自帶的應(yīng)用中集成服務(wù)。相比起來(lái)俗或,Apple 基于對(duì)自己生態(tài)和硬件的控制市怎,將更多的選擇權(quán)交給了第三方開發(fā)者。
ARKit
Keynote 上的 AR 的演示可以說是唯一的亮點(diǎn)了辛慰。iOS SDK 11 中 Apple 給開發(fā)者区匠,特別是 AR 相關(guān)的開發(fā)者帶來(lái)了一個(gè)很棒的禮物,那就是ARKit帅腌。AR 可以說并非什么新技術(shù)驰弄,像是 Pokémon Go 這樣的游戲也驗(yàn)證了 AR 在游戲上的潛力。不過除了 IP 和新鮮感之外速客,個(gè)人認(rèn)為 Pokémon Go 并沒有資格代表 AR 技術(shù)的潛力∑莞荩現(xiàn)場(chǎng)的演示像我們展示了一種可能,粗略看來(lái)溺职,ARKit 利用單鏡頭和陀螺儀岔擂,在對(duì)平面的識(shí)別和虛擬物體的穩(wěn)定上做得相當(dāng)出色。幾乎可以肯定浪耘,那么不做最早智亮,只做最好的 Apple 似乎在這一刻回到了舞臺(tái)上
ARKit 極大降低了普通開發(fā)者玩 AR 的門檻,也是 Apple 現(xiàn)階段用來(lái)抗衡 VR 的選項(xiàng)点待±龋可以暢想一下更多類似 Pokémon Go 的 AR 游戲 (結(jié)合實(shí)境的虛擬寵物什么的大概是最容易想到的) 能在 ARKit 和 SceneKit 的幫助下面世,甚至在 iPad Pro 現(xiàn)有技能上做像是 AR 電影這樣能全方位展示的多媒體可能也不再是單純的夢(mèng)想癞埠。
而與之相應(yīng)的状原,是一套并不很復(fù)雜的 API聋呢。涉及的 View 幾乎是作為 SceneKit 的延伸,再加上在真實(shí)世界的定為也已經(jīng)由系統(tǒng)幫助處理颠区,開發(fā)者需要做的大抵就是將虛擬物體放在屏幕的合適位置削锰,并讓物體之間互動(dòng)。而利用 Core ML 來(lái)對(duì)相機(jī)內(nèi)的實(shí)際物體進(jìn)行識(shí)別和交互毕莱,可以說也讓各類特效的相機(jī)或者攝影 app 充滿了想像空間器贩。
Xcode
編輯器和編譯器
速度就是生命,而開發(fā)者的生命都浪費(fèi)在了等待編譯上朋截。Swift 自問世以來(lái)就備受好評(píng)蛹稍,但是緩慢的編譯速度,時(shí)有時(shí)無(wú)的語(yǔ)法提示部服,無(wú)法進(jìn)行重構(gòu)等工具鏈上的欠缺成為了最重要的黑點(diǎn)唆姐。Xcode 9 中編輯器進(jìn)行了重寫,支持了對(duì) Swift 代碼的重構(gòu) (雖然還很基礎(chǔ))廓八,將 VCS 提到了更重要的位置奉芦,并添加了 GitHub 集成,可以進(jìn)行同局域網(wǎng)的無(wú)線部署和調(diào)試剧蹂。
新的編譯系統(tǒng)是使用 Swift 重寫的声功,在進(jìn)行了一些對(duì)比以后,編譯速度確實(shí)有了不小的提升宠叼。雖然不知道是不是由于換成了 Swift 4减噪,不過正在做的公司項(xiàng)目的總編譯時(shí)間從原來(lái)的三分半縮短到了兩分鐘半左右,可以說相當(dāng)明顯了车吹。
Xcode 9 中的索引系統(tǒng)也使用了新的引擎,據(jù)稱在大型項(xiàng)目中搜索最高可以達(dá)到 50 倍的速度醋闭。不過可能由于筆者所參加的項(xiàng)目不夠大窄驹,這一點(diǎn)體會(huì)不太明顯。項(xiàng)目里的 Swift 代碼依然面臨失色的情況证逻。這可能是索引系統(tǒng)和編譯系統(tǒng)沒有能很好協(xié)同造成的乐埠,畢竟還是 beta 版本的軟件,也許應(yīng)該多給 Xcode 團(tuán)隊(duì)一些時(shí)間 (雖然可能到最后也就這樣了)囚企。
由于 Swift 4 編譯器也提供了 Swift 3 的兼容 (在 Build Setting 中設(shè)置 Swift 版本即可)丈咐,所以如果沒有什么意外的話,我可能會(huì)在之后的日常開發(fā)中使用 Xcode 9 beta龙宏,然后在打包和發(fā)布時(shí)再切回 Xcode 8 了棵逊。畢竟每次完整編譯節(jié)省一分半鐘的時(shí)間,還是一件很誘人的事情银酗。
這次的 beta 版本質(zhì)量出人意料地好辆影,也許是因?yàn)檫@一兩年來(lái)都是小幅革新式的改良徒像,讓 Apple 的軟件團(tuán)隊(duì)有相對(duì)充足的時(shí)間進(jìn)行開發(fā)的結(jié)果?總之蛙讥,Xcode 9 beta 現(xiàn)在已經(jīng)能很好地工作了锯蛀。
Named Color
這是個(gè)人很喜歡的一個(gè)變化。現(xiàn)在你可以在 xcassets 里添加顏色次慢,然后在代碼或者 IB 中引用這個(gè)顏色了旁涤。大概是這樣的:
像是使用 IB 來(lái)構(gòu)建 UI 的時(shí)候,一個(gè)很頭疼的事情就是設(shè)計(jì)師表示我們要不換個(gè)主題色迫像。你很可能需要到處尋找這個(gè)顏色進(jìn)行替換劈愚。但是現(xiàn)在你只需要在 xcassets 里改一下,就能反應(yīng)到 IB 中的所有地方了侵蒙。
其他值得注意的變更
剩下的都是些小變化了造虎,簡(jiǎn)單瀏覽了下,把我覺得值得一提的列舉出來(lái)纷闺,并附上參考的鏈接算凿。
拖拽- 很標(biāo)準(zhǔn)的一套 iOS API,不出意外地犁功,iOS 系統(tǒng)幫助我們處理了絕大部分工作氓轰,開發(fā)者幾乎只需要處理結(jié)果。UITextView和UITextField原生支持拖拽浸卦,UICollectionView和UITableView的拖拽有一系列專用的 delegate 來(lái)表明拖拽的發(fā)生和結(jié)束署鸡。而你也可以對(duì)任意UIView子類定義拖拽行為。和 mac 上的拖拽不同限嫌,iOS 的拖拽充分尊重了多點(diǎn)觸控的屏幕靴庆,所以可能你需要對(duì)一次多個(gè)的拖拽行為做些特別處理。
新的 Navigation title 設(shè)計(jì) - iOS 11 的大多數(shù)系統(tǒng) app 都采用了新的設(shè)計(jì)怒医,放大了導(dǎo)航欄的標(biāo)題字體炉抒。如果你想采用這項(xiàng)設(shè)計(jì)的話也非常簡(jiǎn)單,設(shè)置 navigation bar 的prefersLargeTitles即可稚叹。
FileProvider 和 FileProviderUI- 提供一套類似 Files app 的界面焰薄,讓你可以獲取用戶設(shè)備上或者云端的文件。相信會(huì)成為以后文檔相關(guān)類 app 的標(biāo)配扒袖。
不再支持 32 位 app - 雖然在 beta 1 中依然可以運(yùn)行 32 位 app塞茅,但是 Apple 明確指出了將在后續(xù)的 iOS 11 beta 中取消支持。所以如果你想讓自己的程序運(yùn)行在 iOS 11 的設(shè)備上季率,進(jìn)行 64 位的重新編譯是必須步驟野瘦。
DeviceCheck- 每天要用廣告 ID 追蹤用戶的開發(fā)者現(xiàn)在有了更好地選擇 (當(dāng)然前提是用來(lái)做正經(jīng)事兒)。DeviceCheck 允許你通過你的服務(wù)器與 Apple 服務(wù)器通訊飒泻,并為單個(gè)設(shè)備設(shè)置兩個(gè) bit 的數(shù)據(jù)缅刽。簡(jiǎn)單說啊掏,你在設(shè)備上用 DeviceCheck API 生成一個(gè) token,然后將這個(gè) token 發(fā)給自己的服務(wù)器衰猛,再由自己的服務(wù)器與 Apple 的 API 進(jìn)行通訊迟蜜,來(lái)更新或者查詢?cè)撛O(shè)備的值。這兩個(gè) bit 的數(shù)據(jù)用來(lái)追蹤用戶比如是否已經(jīng)領(lǐng)取獎(jiǎng)勵(lì)這類信息啡省。
PDFKit- 這是一個(gè)在 macOS 上已經(jīng)長(zhǎng)期存在的框架娜睛,但卻在 iOS 上姍姍來(lái)遲。你可以使用這個(gè)框架顯示和操作 pdf 文件卦睹。
IdentityLookup- 可以自己開發(fā)一個(gè) app extension 來(lái)攔截系統(tǒng) SMS 和 MMS 的信息畦戒。系統(tǒng)的信息 app 在接到未知的人的短信時(shí),會(huì)詢問所有開啟的過濾擴(kuò)展结序,如果擴(kuò)展表示該消息應(yīng)當(dāng)被攔截障斋,那么這則信息將不會(huì)傳遞給你。擴(kuò)展有機(jī)會(huì)訪問到事先指定的 server 來(lái)進(jìn)行判斷 (所以說你可以光明正大地獲取用戶短信內(nèi)容了徐鹤,不過當(dāng)然考慮到隱私垃环,這些訪問都是匿名加密的,Apple 也禁止這類擴(kuò)展在 container 里進(jìn)行寫入)返敬。
Core NFC- 在 iPhone 7 和 iPhone 7 Plus 上提供基礎(chǔ)的近場(chǎng)通訊讀取功能遂庄。看起來(lái)很 promising劲赠,只要你有合適的 NFC 標(biāo)簽涛目,手機(jī)就可以進(jìn)行讀取。但是考慮到無(wú)法后臺(tái)常駐凛澎,實(shí)用性就打了折扣霹肝。不過筆者不是很熟這塊,也許能有更合適的場(chǎng)景也未可知塑煎。
Auto Fill- 從 iCloud Keychain 中獲取密碼沫换,然后自動(dòng)填充的功能現(xiàn)在開放給第三方開發(fā)者了。UITextInputTraits 的textContentType中添加了username和password轧叽,對(duì)適合的 text view 或者 text field 的 content type 進(jìn)行配置,并填寫 Info.plist 的相關(guān)內(nèi)容刊棕,就可以在要求輸入用戶名密碼時(shí)獲取鍵盤上方的自動(dòng)填充炭晒,幫助用戶快速登錄。