在自定义 iOS 键盘中检测应用程序

8
如何检测我的自定义键盘在哪个应用程序中使用,并显示不同的按钮? 例如,在Twitter中,我将@添加到我发布到输入字段中的字符串中,在Reddit中则是/r/。

2
就像Schemetrical所说的那样,你无法确定你正在使用哪个应用程序(至少,你不应该能够这样做,可能在此发布的任何答案都将被认为是漏洞,并由苹果修复),但你可以知道自己正在使用类似Twitter的文本字段,并做出适当的响应,这可能比知道应用程序更好,因为有内置的API可用于从任何应用程序发布到Twitter。 - Ben Pious
@BenPious 感谢你的启发!我很感激任何关于“Twitter风格文本框”的线索。 - Igor Barinov
2
在API中,您可以访问实现此协议的对象(我忘记了是哪个):https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextInputTraits_Protocol/ - Ben Pious
UIKeyboardTypeDefault, UIKeyboardTypeASCIICapable, UIKeyboardTypeNumbersAndPunctuation, UIKeyboardTypeURL, UIKeyboardTypeNumberPad, UIKeyboardTypePhonePad, UIKeyboardTypeNamePhonePad, UIKeyboardTypeEmailAddress, UIKeyboardTypeDecimalPad, UIKeyboardTypeTwitter, UIKeyboardTypeWebSearch, UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable - Igor Barinov
@BenPious,你怎么知道这是否违反了开发者指南? - Igor Barinov
@BenPious 我在 Instagram、Slack 和其他应用中有类似 Twitter 风格的文本字段。 - Igor Barinov
2个回答

10

通过以下代码,可以获取您在使用自定义键盘的应用程序的捆绑标识符。

Swift

    let hostBundleID = self.parentViewController!.valueForKey("_hostBundleID")
    let currentHostBundleID = String(hostBundleID)
    print(currentHostBundleID);

通过捆绑标识符,您可以轻松找到应用程序名称。


苹果允许这样做吗?也就是说,这会导致应用程序扩展被拒绝吗? - Will Von Ullrich
3
我的一个应用程序已经被苹果批准,具有相同的实现方式。因此,希望它在你的情况下也能起作用。 - Sunil Targe
有没有API可以通过Bundle ID获取应用程序的详细信息? - Vikram Chaudhary
2
很不幸,在iOS 16中,这已经停止工作了。 - Daniel Saidi

3

编辑:见上文。情况已改变。

这是不可能的。扩展程序运行于沙盒中,仅从API获取信息,无法访问其他内容。键盘只能接收文本上下文更改和激活/取消调用。检测应用程序的能力超出了扩展程序沙盒之外,因此是不可能的。


这是不正确的。可以通过上面@halfer的答案来识别主机的应用程序包。 - Grant Oganyan
@GrantOganyan 这可能已经过时了,我会删除。 - Schemetrical
看起来我不能。希望人们能够阅读上面的内容。 - Schemetrical

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接