关于在 iOS Extension 里使用「不安全的 API」

iOS 的 Extension 相当于一个权限受限的 App,很多 API 是无法使用的。如果你在 Extension 里用了这类 API、或者用了使用了这类 API 的库,那么就会得到这样的警告:

iOS Extension not safe API

如果你在这个 Extension 里主动调用了相关 API,那么你一定要正视这个警告,并且把相关 API 的调用移除(比如和 UIApplication 相关的),毕竟它们会不工作。

但是如果你像我一样,在 Extension 里链接了第三方库、并且只使用了这个第三方库的少部分可以确认可以在 Extension 里工作正常的功能,那么,这个警告也只是警告而已,并不会造成你的 Extension 工作不正常。

举个例子,我在奇点里面用了 OAuthSwift 来操作「同步 Twitter」相关功能。OAuthSwift 这个库主要分两个功能:授权+调用 API,「授权」这部分 API 由于要调用 UIApplication,所以是无法在 Extension 里使用的,但是如果你已经在主 App 里完成了授权,只用到「调用 API」这部分功能的话,那么在 Extension 里用 OAuthSwift 也是没问题的。

于是上图所述的警告,基本上可以无视它。

但是作为一个强迫症,看一个警告肯定是不爽的,于是可以在 Extension 的 Build Settings 里,找到 Require Only App-Extension-Safe API,并且设置成 No,那么你就会看不到这个警告了。

iOS Extension not safe API

这算是一个曲线救国的方式。在这里总结一下我所认为一个优秀的第三方 iOS 库应该是什么样子的:

  • 如果开发的是通用库(即可以用在 App 里,也可以用在 Extension 里),一定要在 Xcode 的 Target Settings 里勾上 Allow app extension API only。

iOS Extension not safe API 3

  • 如果开发的不是通用库,也建议勾上这个选项,然后在开发过程中,适当地分离出 App 可以用的库和 App+Extension 可以用的库,分发的时候,就可以分发 Base 库 + App 库了:就像 Foundation 和 UI 库的关系一样。以让开发者可以更灵活、选择性地使用这个库提供的功能。

前面提到的 OAuthSwift 这个库,显然也考虑到了在 Extension 里使用的情况,因为它在 GitHub 上有一个这样的说明《Work with application extension》,不过比较遗憾,它没有从库功能的分离上去解决这个问题。所以还是会有 Warning。

欢迎使用图拉鼎和他的团队开发的作品

One Switch - 多功能开关工具

常驻 macOS 菜单栏的开关工具,可以快速开关 AirPods、睡眠模式、切换黑暗模式等。

No Comment

Leave a Comment