如何判断键盘扩展(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执行方法注入日志代码:
执行成功后即可在Safari的开发者控制台看到对应输出。self.textDocumentProxy.evaluateJavaScript("console.log('键盘扩展已成功唤起')") { _, error in guard error == nil else { print("日志注入失败") return } }
内容的提问来源于stack exchange,提问作者alex ananchenko
相关产品推荐
相关产品推荐

