You need to enable JavaScript to run this app. 如何判断键盘扩展(keyboard extension)当前在哪个应用中被唤起使用?
优惠活动
大模型
产品
解决方案
定价
更多

如何判断键盘扩展(keyboard extension)当前在哪个应用中被唤起使用?

键盘扩展获取当前宿主应用的实现方法

iOS/iPadOS 平台

苹果没有提供公开API直接获取键盘扩展的宿主App信息,你可以使用以下两种方案:

  • 变通判断方案(可上架)
    在键盘的viewDidAppear生命周期中,读取UITextDocumentProxy的输入特征,结合系统粘贴板的属性间接判断宿主:
    • 检测输入框的keyboardType属性,如果是UIKeyboardTypeURL且同时开启了域名自动填充规则,大概率为Safari的地址栏输入场景
    • 不同App会对通用粘贴板设置专属标识,可通过UIPasteboard.general的自定义字段辅助判定宿主身份
  • 私有API方案(不可上架,仅适合自用/测试场景)
    可以通过runtime读取UIInputViewController的私有属性_hostBundleID直接获取宿主的Bundle ID,代码示例:
    // Swift 示例,需添加异常捕获避免版本兼容崩溃
    if let hostBundleID = self.value(forKey: "_hostBundleID") as? String {
        print("当前宿主Bundle ID:\(hostBundleID)")
        // Safari的Bundle ID为com.apple.mobilesafari,匹配即可判定为Safari场景
    }
    

安卓平台

安卓系统提供了公开API获取宿主信息,你可以在输入法服务的onStartInput回调中直接读取:

// Java 示例
String hostPackageName = getCurrentInputEditorInfo().packageName;

匹配到Safari安卓版的包名com.apple.android.mobilesafari即可判定对应场景。

输出内容到Safari控制台的实现

确认当前宿主为Safari后,你可以通过注入JavaScript的方式写入控制台日志:

  • 首先要给键盘扩展开启完全访问权限(iOS端需在Info.plist中将RequestsOpenAccess设为YES)
  • 调用textDocumentProxy的JS执行方法注入日志代码:
    self.textDocumentProxy.evaluateJavaScript("console.log('键盘扩展已成功唤起')") { _, error in
        guard error == nil else {
            print("日志注入失败")
            return
        }
    }
    
    执行成功后即可在Safari的开发者控制台看到对应输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:03:02