谷歌的自定义iOS应用程序Gboard具有一项有趣的功能,无法使用iOS SDK中的公共API实现(从iOS 10开始). 我想确切地知道Google如何完成以编程方式弹出Gboard中App Switching堆栈中的一个应用程序的任务.
自定义iOS键盘有两个主要组件:容器应用程序和键盘应用程序扩展.键盘应用程序扩展程序在单独的操作系统进程中运行,只要用户在手机上需要文本输入的任何应用程序中,该进程就会启动.
这些是使用Gboard可以遵循的近似步骤,以查看以编程方式返回到以前的应用程序的效果:
我假设Google使用私有API,通过使用Objective-C运行时内省探索状态栏的视图层次结构,并以某种方式合成tap事件或调用公开的目标/操作.我已经很好地探索了这个,并且能够在状态栏中找到有趣的UIView子类,比如UIStatusBarBreadcrumbItemView,它包含一个UISystemNavigationAction数组.我正在继续探索这些类,希望我能找到一些复制用户交互的方法.
我知道使用私有API是一种很好的方式来让您的应用程序提交从App Store中被拒绝 - 这不是我想在答案中解决的问题.我主要想找到关于Google如何完成以编程方式弹出Gboard中应用程序切换堆栈中的一个应用程序的具体任务的具体答案.
在iOS 8.3之前,检查是否已授予键盘扩展"允许完全访问权限"的方法是通过容器应用程序中的以下代码:
- (BOOL)isOpenAccessGranted{
return [UIPasteboard generalPasteboard];
}
Run Code Online (Sandbox Code Playgroud)
但是,正如对这个流行的SO答案线程的评论所指出的那样,自iOS 8.3以来,即使未授予完全访问权限,应用程序也可以从共享组容器中读取,因此上述代码始终返回true.但是,仅在启用"允许完全访问"时才授予写入权限.
我已经尝试列出了所有基于苹果公司pasteboards的文档上UIPasteboard,但它并没有界定哪些是可访问的.对此有任何见解非常感谢.
我想问一下当拿着iOS 8键盘扩展键盘键时如何实现pop动画.我知道如何在每个键上分配长按手势,但不知道如何设置键的动画以呈现该特定键中的其他字符.
编辑:我在这里看到了这个类似的问题,但区别在于他能够制作流行动画.
编辑2:我在这里看到了另一个类似的问题,但与标准键盘上的默认外观相比,它们的外观有所不同.
编辑3:点击键盘键时,我能够实现我想要的行为.我只需要知道如何正确绘制扩展的关键视图.附图片供参考.第一个是我们迄今取得的成就.我想知道如何绘制那个字母F键,然后将其翻译成UIView后来.
编辑4:我能够创建关键的弹出视图,但不能创建我想要的类似于标准键盘键弹出的所需形状或图层.这里供参考:
编辑5:我尝试了PaintCode的演示版本,它生成了下面的代码.这是drawRect我的自定义视图中的方法.我的键宽通常为26.0,高度为39.0.我也在使用Objective-C btw.
UIBezierPath* bezierPath = UIBezierPath.bezierPath;
[bezierPath moveToPoint: CGPointMake(26, 5.12)];
[bezierPath addLineToPoint: CGPointMake(26, 18.03)];
[bezierPath addCurveToPoint: CGPointMake(23.05, 22.41) controlPoint1: CGPointMake(26, 19.88) controlPoint2: CGPointMake(24.82, 21.51)];
[bezierPath addCurveToPoint: CGPointMake(19.62, 25.27) controlPoint1: CGPointMake(22.05, 23.24) controlPoint2: CGPointMake(20.79, 24.3)];
[bezierPath addCurveToPoint: CGPointMake(19.62, 39.95) controlPoint1: CGPointMake(19.62, 30.82) controlPoint2: CGPointMake(19.62, 39.95)];
[bezierPath addCurveToPoint: CGPointMake(17.17, 42) controlPoint1: CGPointMake(19.62, 41.08) controlPoint2: CGPointMake(18.52, 42)];
[bezierPath addLineToPoint: CGPointMake(8.83, 42)];
[bezierPath addCurveToPoint: CGPointMake(6.38, …Run Code Online (Sandbox Code Playgroud) 我正在尝试自定义键盘如何影响我的应用.我在iPhone 6上安装了Swype.
我发现在我的一些视图中,我在文本字段上设置了自定义inputView属性,Swype键盘覆盖并呈现而不是我的选择器.这完全打破了我的UI,不能被允许.
有没有办法明确告诉iOS 8只使用我设置的inputView?
这可能是一个错误吗?允许第三方覆盖我的输入规范是不是完全没有预期的行为?
我有一个存储在App Group容器中的sqlite数据库,以便注册自定义快捷方式.
我可以从应用程序读取/写入,但不能从键盘扩展名读取/写入.似乎数据库处于扩展的只读模式.
我正在使用以下代码来访问它:
let appGroupDirectoryPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(appGroupId)
let dataBaseURL = appGroupDirectoryPath!.URLByAppendingPathComponent("database.sqlite")
Run Code Online (Sandbox Code Playgroud)
是否有一种解决方法可以从扩展键盘写入数据库,还是完全不可能?
数据库可以从模拟器写入,但不能与真实设备一起写入.我想这是因为MacOS X和iOS上的权限管理方式不同.
在我的iOS键盘应用程序中,我目前有一个文本建议栏,就像默认的iOS 8键盘的建议栏.每当用户执行清除文本字段的操作时(例如,当某人在iMessage或Whatsapp上点击" 发送 " 时),我想清除建议栏上的所有文本.
因为点击"发送" 不是击键,我想知道在清除文本字段时是否有从键盘检测的方法.
我试过检测空文本""或新行"\n",但到目前为止这还没有奏效.
编辑:我知道这可以通过第三方iOS键盘,如这里所见(这是来自Themeboard)
在点击发送之前,请注意建议栏中的文字.

点击"发送"后立即.建议栏已清除.

我想用键盘扩展,因为这些应用程序编写一些自定义的字体的文本(1,2,3,4)在做什么.我知道如何在文档代理中插入普通字符串.
[self.textDocumentProxy insertText:mystring];
Run Code Online (Sandbox Code Playgroud)
我试图NSAttributedString使用上述方法插入,但我看不到任何方式插入NSAttributedString文档代理.
有人可以指导什么是解决这个问题的最佳方法?任何建议将不胜感激.
我想在我的自定义键盘扩展程序中检测哪个应用程序正在使用我的扩展程序.我们可以检测键盘扩展中有关使用我的扩展程序的应用程序的任何信息.我不认为这是可能的.如果任何机构有这方面的知识,请分享它.
谢谢
我在自定义键盘上添加了textfield(keyboardTextField)和UISwitch.我可以在Switch value my code的基础上为(keyboardTextField)设置焦点ON或OFF.
- (void)switchToggled:(id)sender
{
UISwitch *mySwitch = (UISwitch *)sender;
if ([mySwitch isOn])
{
[keyboardTextField becomeFirstResponder];
}
else
{
[keyboardTextField resignFirstResponder];
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当我的自定义键盘在我的设备的每个应用程序中启动它时,第一次发生了什么事情,但是在将Switch值更改为On然后OFF并且现在我的自定义后,我无法选择主应用程序的输入视图.键盘无法在我的设备的任何应用程序中写任何东西.
keyboard-events becomefirstresponder ios8 custom-keyboard ios-keyboard-extension
我正在尝试实现一个键盘扩展,它可以显示键,具体取决于用户在设备的设置中选择的语言.
在Edit Scheme中,我已经为Container app和extension 正确设置了应用程序语言和应用程序区域,如下所示:
但我的键盘仍然以英文(en-US)版本打开.
在info.plist中,我已经为PrimaryLanguage添加了mul:
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>IsASCIICapable</key>
<false/>
<key>PrefersRightToLeft</key>
<false/>
<key>PrimaryLanguage</key>
<string>mul</string>
<key>RequestsOpenAccess</key>
<false/>
</dict>
Run Code Online (Sandbox Code Playgroud)
而且,我有本地化的密钥名称.
我使用以下命令记录app正在解释的语言:
var lang : String = NSLocale.preferredLanguages()[0] as! String
NSLog(lang)
Run Code Online (Sandbox Code Playgroud)
容器应用确实检测到正确的语言为ur.但键盘扩展总是拿起en-US.我正在使用xcode 6.4并在模拟器iOS 8.4上进行测试.
我可能错过了一个非常小的点.任何建议都是受欢迎的.谢谢.