You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:05:41