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

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:在视图消失时触发修复逻辑

通过重写视图生命周期方法,区分主动取消和外部关闭场景,触发修复:

  1. 添加标志位区分场景:
private var isCancelledByUser = false
  1. 修改取消方法并设置标志位:
@objc private func cancel(_ sender: AnyObject?) {
    isCancelledByUser = true
    self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code: ASExtensionError.userCanceled.rawValue))
}
  1. 重写视图消失方法:
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // 非主动取消场景下,调用修复方法
    if !isCancelledByUser {
        cancel(nil)
    }
}

注意事项

  • 两种方法均可触发extensionContext的取消/完成逻辑,确保系统将控制权交还宿主应用;
  • 优先选择方法1,popover代理可精准捕获外部关闭事件,逻辑更直接;
  • 需在iPad真机上验证效果,模拟器无法复现该Bug。

内容的提问来源于stack exchange,提问作者Richard Topchii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:30:46