背景
需要在点击Extension的时候跳转到主App,数据传递这块暂时不考虑,只考虑如果拉起主App。
说到底我们还是需要使用UIApplication的openURL:方法来打开主App,但是这个API限制在Extension中使用
解决
更新2022.11.29
@Rockbean 指点,其实不用这么麻烦也可以跳转到App,系统自带有open方法。
self.extensionContext?.open(URL)
我还没有验证这个用法,不过应该是可以的,我都忘了为啥当时没有用这个现成的方法,可能是没有看到。
以下用法不推荐使用
Extension是否需要界面
我最开始做的是Action Extension,创建它的时候有两种类型,有界面、无界面两种。到底选哪种创建呢?还需要进一步分析。
那么我们的思路就只有一个,就是用Runtime来调用openURL:。
那首先就需要找到UIApplication对象,同样的在Extension里面同样被禁止直接使用。
既然不能直接使用,那我们就通过响应者链条找到UIApplication对象,拿到对象perform openURL就可以了。那为了能在响应者链条中找到UIApplication对象,肯定需要选择有界面的类型创建了。
如何找到UIApplication
func openApp(url: URL) {
var responder = self as UIResponder?
while (responder != nil && !(responder is UIApplication)) {
responder = responder?.next
}
if responder != nil {
let selectorOpenURL = sel_registerName("openURL:")
if responder!.responds(to: selectorOpenURL) {
responder?.perform(selectorOpenURL, with: url)
}
}
}
到这里其实已经解决了打开App的问题了,传递数据只需要用App Group就可以了。