XCode11报错:"open(_:options:completionHandler:)在应用扩展中不可用"的解决方案咨询
解决iMessage应用扩展中
open(_:options:completionHandler:)不可用的问题 我在发布以iMessage应用扩展为主(占99%)的Touchgram v1.0后,尝试升级到Xcode11时,遇到了一个棘手的错误提示:
"open(_:options:completionHandler:) is unavailable in application extensions"
哪怕是在iMessage应用里尝试打开网页URL的简单场景,都会触发这个错误,当时用的示例代码是这样的:
let openSel = #selector(UIApplication.open(_:options:completionHandler:)) while (responder != nil){ if responder?.responds(to: openSel ) == true { // cannot package up multiple args to openSel // so we explicitly call it on the iMessage application instance // found by iterating up the chain (responder as? UIApplication)?.open(url, completionHandler:handler) return } responder = responder!.next }
2020年更新:问题解决方案
经过研究,我找到了可行的规避方案,下面详细说下实现原理和修复方式:
规避方案核心原理
应用扩展本身运行在宿主应用(这里是Messages应用)的沙箱内,苹果对扩展的权限做了严格限制,直接调用UIApplication的open方法属于被禁止的操作,Xcode11的权限检查进一步收紧了这个限制,所以原来通过遍历响应链找UIApplication实例的方式彻底失效了。
修复后的具体实现
我们可以根据需求分两种场景处理:
- 打开网页URL:直接在iMessage扩展内使用
WKWebView加载网页,将WKWebView添加到扩展的视图层级中,这样既符合扩展的权限要求,又能让用户在扩展内完成网页浏览; - 跳转外部应用URL:使用苹果官方允许的
NSExtensionContext的openURL方法,通过extensionContext?.open(url, completionHandler: handler)调用,替代原来的UIApplication.open逻辑。
之前的示例代码已经按照这个方案完成修复,既规避了UIApplication.open的限制,也完美实现了在iMessage扩展内打开网页的需求。
内容的提问来源于stack exchange,提问作者Andy Dent
相关产品推荐
相关产品推荐

