iOS被忽視的Extension開發

估計現在有過iOS App Extension開發經驗的朋友還不太多。說來慚愧,我也是最近以Extension的方式寫過Xcode的一個插件之后,才把Extension相關的知識點梳理了一遍,技術和想法上都有些新的收獲。順便寫篇文章介紹推廣下App Extension開發。

何謂App Extension?

iOS生態圈向來以其封閉性聞名,封閉一方面提高了第三方應用的質量,另一方面也使得系統原生App的使用頻率變得更高。

比如照片,分享,iMessenger,日歷,天氣等。這些系統App都有一定的用戶基數,如果這些App完全有Apple自己來開發維護,一則精力有限,二則被人詬病其封閉性。對此Apple采取的策略是通過Extension的方式逐步開放和完善這些系統原生層面的功能點。

這些和系統貼近的App或者功能點,通過Extension Point的方式向第三方開發者開發了一些API。這些API可以讓開發者獲取到部分的用戶場景信息,或者說Context,用戶可以選擇第三方的Extension來進一步的實現拓展的功能目標。

以上是抽象的描述,具體到技術層面來說呢,就是系統會新開一個進程來運行你的Extension,Extension通過原生的API來做輸入和輸出,一旦Extension提供的任務完成,進程也被結束。整個流程的設計依然很符合Apple Style。

Extension的意義?

每年開發者大會,Apple發布新的OS版本時,敏感的移動互聯網公司或者獨立開發者會格外的關注有哪些新的API公布出來。毫不夸張的說,有時候一個API入口甚至就是一個新的產品起點。

同樣Extension作為Apple現在的一大重點方向,也同樣值得開發者格外的注意。Extension和獨立App的不同之處,在于Extension所依附的App已經有了不少原始用戶,而且有比較完善的功能場景支持了,Extension只需著眼于某一個細節功能點即可。

當年iOS 8公布Keyboard Extension之前,大家怎么使用搜狗輸入法還有印象嗎?跳到搜狗的App完成輸入再回到原來的App做粘貼,整個體驗有多酸爽就不用多說了。現在呢,搜狗輸入法體驗已經可以取代原生鍵盤了。

最近隨著錘子大火的訊飛輸入法,如今還面臨著當年搜狗的困境,無法在當前App完成語音轉文字的輸入,需要跳出去再跳回來。不過我想,語音的權限在Keyboard Extension當中放開也是早晚的事情,訊飛需要的是耐心。

除了Keyboard Extension之外,還有其他不少Extension Point,這些接入點能帶來怎么樣的新功能體驗,完全取決于開發者的想象力,現在開放的Extension有:

以上每一個Extension Point都開放了哪些API,值得每個開發者和產品經理一一詳細閱讀,里面很有可能隱藏著尚未被開發或者充分利用的功能需求點。

Extension需要大膽的腦洞

腦洞是新產品,新Feature的思想之源。腦洞是可以大膽的,但求證是必要謹慎的。

EasyCode的腦洞

之前開發Xcode插件EasyCode的時候,先是預置了一些固定的快捷鍵匹配,后來一想如果可以讓用戶自己配置快捷鍵豈不是更方便,但Xcode目前的Extension開放的API實在是少的可憐,后來一番腦洞和順藤摸瓜,查到了Extension的完整文檔,發現Extension是可以和Container App之間進行數據共享的。也就是說我可以開發一個獨立App來編輯快捷鍵匹配,之后Extension讀取同一份數據即可,確定了思路,一天下來就完成了全部的代碼。共享的方式有多種,我目前采用的是最為方便的NSUserDefault。

進一步腦洞

可以讀取外部文件之后,感覺一下子新打開了一扇門,是不是可以做更多功能呢?

目前由于Xcode 8新的安全機制,導致之前很多極為好用的插件都無法使用,必須通過安全降級退回之前的版本,顯然這對不少用戶來說并不可行,尤其是經歷過XcodeGhost事件之后。

Xcode 8的Extension一大限制是在于無法訪問完整的工程目錄文件,之前不少好用的插件都是基于完整的項目數據分析基礎之上。但是還是可以通過Extension和宿主App的數據共享來完成文件的讀取,只不過需要通過宿主App去手動的設置工程的目錄,雖然繁瑣了一些,畢竟可以讀取到完整數據了。有了這部分的數據,就可以在此之上,實現之前類似頭文件導入,Image文件名建議,自動生成方法體等使用功能了,后面有時間了,再考慮是否在EasyCode當中實現上述功能,值得調研的腦洞。

鍵盤拓展

最近想到一個小點子,原本想基于Keyboard Extension做一個實用的小工具,剛寫了一些代碼就遇到了瓶頸。原本以為Keyboard Extension可以獲取到完整的用戶輸入然后再做分析,看了API之后,才發現我低估了Apple限制開發者的能力。

@protocol UIKeyInput <UITextInputTraits>#if [email protected](nonatomic, readonly) BOOL hasText;#else- (BOOL)hasText;#endif- (void)insertText:(NSString *)text;- (void)deleteBackward;@end

上面這段protocol就是Apple給開發者開放的API,基本上有用的就是插入和刪除,還可以通過以下兩個property獲取到輸入框當前行的內容:

@property (nullable, nonatomic, readonly) NSString *documentContextBeforeInput;@property (nullable, nonatomic, readonly) NSString *documentContextAfterInput;

注意是當前行,不是全部內容,我可以理解Apple從隱私的角度去設計這個限制,但用戶都選擇使用Custom Keyboard去鍵入內容了,難道還會介意內容被開發者獲取嗎?我想不明白其中的邏輯。

所以一時興起的idea不得不暫時中止,這就是我上面所說的小心求證,你想當然的認為Extension應該有什么,Apple想當然的限制你訪問什么。

我還查閱了幾個Extension文檔,邊看邊腦洞,有不少小點子。

比如現在Mac和iOS之間通過airdrop傳遞圖片的步驟稍微繁瑣了點,如果通過Extension的方式說不定可以簡化幾步,當然啦,這也需要進一步的求證。總之,我相信App Extension當中還是藏有不少寶藏的。

結束語

對于App Extension我還是持積極樂觀的態度,畢竟未來的空間會更大,雖然Apple會小心謹慎的逐步開放Extension Point,我們開發者也可以且行且珍惜,說不定iOS 11,12…到iOS 100的時候會有什么新接口值得一試呢。

來源:MrPeakTech-微信公眾號

上一篇: 應屆生應聘iOS崗位的面試建議

下一篇: iOS 10.3即將登場,期盼已久的「黑暗模式」真的要來了?

分享到: 更多
mg4355电子游戏线路检测 幸运pc28预测神测网 快3彩票稳赚不赔绝招 江西11选5怎么玩 欢乐麻将二人雀神过胡 欢乐捕鱼技巧打法 秒速时时票官网网址 二分彩技巧稳赚保本玩法 金博棋牌下载 即时比分篮球 3d复式怎么中奖规则 幸运飞艇官方苹果下载 球探体育比分苹果 江西新时时怎么玩的 900注大底计划软件 麻将下载