从Autofill Credential Provider扩展打开主应用报EXC_BAD_ACCESS错误如何解决?
崩溃根源
Autofill凭证提供器扩展属于苹果明确限制使用extensionContext.open(_:completionHandler:)的扩展类型,直接调用该API会触发系统ExtensionKit内部的野指针访问,也就是你遇到的EXC_BAD_ACCESS (code=1, address=0x10)报错,和URL Scheme配置、URL生成逻辑无关。
正确打开主应用方案
- 首先调整主应用URL Scheme配置,使用具有辨识度的唯一Scheme,避免和其他应用冲突,比如将Scheme设置为
myautofillapp,完整打开链接为myautofillapp://,不要使用无辨识度的open作为Scheme。 - 不要通过
extensionContext调用打开方法,改用UIApplication的打开API,代码实现如下:
func openMainApp() { // 替换为你自己配置的Scheme链接 guard let mainAppUrl = URL(string: "myautofillapp://") else { print("无效的主应用链接") return } // 适配扩展场景调用打开方法 UIApplication.shared.open(mainAppUrl, options: [:]) { isSuccess in debugPrint("打开主应用结果:\(isSuccess)") } }
如果直接调用UIApplication.shared无响应,可以改用遍历响应者链的方式获取UIApplication实例:
func openMainApp() { guard let mainAppUrl = URL(string: "myautofillapp://") else { return } var nextResponder: UIResponder? = self while let responder = nextResponder { if let app = responder as? UIApplication { app.open(mainAppUrl) break } nextResponder = responder.next } }
注意事项
- 调用打开逻辑必须在用户主动触发的交互回调中执行,比如按钮点击、列表项选中回调,禁止在
viewDidLoad、异步网络回调等非用户主动触发的场景调用,会被系统拦截。 - URL Scheme必须遵循标准格式,补全
://后缀,不要使用open:、open这类不完整格式。 - 不需要使用
NSURL类型,直接使用Swift原生URL即可,避免不必要的桥接操作。 - 确保测试时主应用已经安装在当前设备上,否则打开操作不会有响应。
内容的提问来源于stack exchange,提问作者metamonkey
相关产品推荐
相关产品推荐

