iOS中Extension开发是什么?
从事iOS开发的童鞋,估计现在有过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
#if UIKIT_DEFINE_AS_PROPERTIES@property(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的时候会有什么新接口值得一试呢。
文章来源:MrPeak技术分享