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

如何在iOS容器App中检测键盘扩展的Allow Full Access权限状态?

在容器App中判断iOS键盘扩展的完全访问权限

iOS没有原生API让容器App直接查询键盘扩展的完全访问权限,但可以通过App Groups共享存储 + 扩展主动上报状态的方式实现,这也是业内常用的方案,Wordtune应该也是用的类似思路。

具体步骤如下:

  1. 配置App Groups

    • 打开Xcode,在容器App和键盘扩展的Signing & Capabilities中添加同一个App Group(比如group.com.yourcompany.yourapp.keyboard),确保两者都启用了这个组。
  2. 键盘扩展侧上报权限状态
    在键盘扩展的核心逻辑里(比如InputViewController的viewDidLoad,或者定期检查的方法中),利用系统提供的hasFullAccess属性判断权限,然后把结果写入共享的UserDefaults:

    // 键盘扩展代码示例
    override func viewDidLoad() {
        super.viewDidLoad()
        updateFullAccessStatusToContainer()
    }
    
    // 可在权限变化时调用(比如监听相关通知)
    func updateFullAccessStatusToContainer() {
        guard let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp.keyboard") else { return }
        sharedDefaults.set(hasFullAccess, forKey: "KeyboardHasFullAccess")
        // iOS 10+可不用synchronize,但为了兼容或立即同步可保留
        sharedDefaults.synchronize()
    }
    
  3. 容器App读取并监听状态
    容器App通过同一个App Group的UserDefaults读取扩展上报的状态,同时可以监听存储变化来实时更新:

    // 容器App代码示例
    class SomeViewController: UIViewController {
        let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp.keyboard")!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 初始读取状态
            checkKeyboardFullAccess()
            // 监听状态变化
            NotificationCenter.default.addObserver(self, selector: #selector(checkKeyboardFullAccess), name: UserDefaults.didChangeNotification, object: sharedDefaults)
        }
    
        @objc func checkKeyboardFullAccess() {
            let hasFullAccess = sharedDefaults.bool(forKey: "KeyboardHasFullAccess")
            // 这里处理UI更新或业务逻辑,比如显示提示引导用户开启权限
            print("键盘完全访问权限状态:\(hasFullAccess)")
        }
    
        deinit {
            NotificationCenter.default.removeObserver(self)
        }
    }
    

注意事项

  • 扩展只有在被用户激活使用时才会执行代码,所以如果用户从未打开过你的键盘,容器App可能拿到的是默认的false状态,这时候可以引导用户前往键盘设置界面激活一次。
  • 首次安装时,共享存储里可能没有对应key,容器App可以默认将状态设为false,直到扩展上报正确的值。
  • 确保App Groups的配置正确,Bundle Identifier和Group ID都要匹配,否则共享存储会无法访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:31:03