iPad端关闭AutoFill Extension致宿主应用无响应的问题求助
iPad真机AutoFill Extension点击模态外部后宿主应用无响应的解决方案
问题概述
仅在iPad真机上出现该Bug(模拟器无法复现),Dashlane应用也存在相同问题。复现步骤:
- 在iOS设置→密码→密码自动填充中启用目标应用的AutoFill功能
- 打开LinkedIn或Netflix等宿主应用
- 打开AutoFill App Extension(请勿使用QuickType提示)
- 点击AutoFill模态视图外部关闭视图(请勿使用取消按钮)
- 宿主应用随即变得无响应
根因:AutoFill视图关闭后,系统仍认为控制权在Extension而非宿主应用,需调用extensionContext的completeExtensionConfigurationRequest()或cancelRequest(withError:)方法,通知系统交还控制权。
核心需求
监听点击AutoFill模态框外部的事件,触发上述修复方法。
解决方案
方法1:利用UIPopoverPresentationController代理
AutoFill Extension的模态视图以popover形式展示,可通过popover代理直接捕获外部点击关闭事件:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) self.popoverPresentationController?.delegate = self } extension YourExtensionViewController: UIPopoverPresentationControllerDelegate { func popoverPresentationControllerDidDismissPopover(_ popoverPresentationController: UIPopoverPresentationController) { // 调用取消方法,通知系统交还控制权 cancel(nil) } }
方法2:在视图消失时触发修复逻辑
通过重写视图生命周期方法,区分主动取消和外部关闭场景,触发修复:
- 添加标志位区分场景:
private var isCancelledByUser = false
- 修改取消方法并设置标志位:
@objc private func cancel(_ sender: AnyObject?) { isCancelledByUser = true self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code: ASExtensionError.userCanceled.rawValue)) }
- 重写视图消失方法:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 非主动取消场景下,调用修复方法 if !isCancelledByUser { cancel(nil) } }
注意事项
- 两种方法均可触发
extensionContext的取消/完成逻辑,确保系统将控制权交还宿主应用; - 优先选择方法1,popover代理可精准捕获外部关闭事件,逻辑更直接;
- 需在iPad真机上验证效果,模拟器无法复现该Bug。
内容的提问来源于stack exchange,提问作者Richard Topchii
相关产品推荐
相关产品推荐

