标签: ios-keyboard-extension

Google的自定义iOS键盘Gboard如何以编程方式解散最前端的应用程序?

谷歌的自定义iOS应用程序Gboard具有一项有趣的功能,无法使用iOS SDK中的公共API实现(从iOS 10开始). 我想确切地知道Google如何完成以编程方式弹出Gboard中App Switching堆栈中的一个应用程序的任务.

自定义iOS键盘有两个主要组件:容器应用程序和键盘应用程序扩展.键盘应用程序扩展程序在单独的操作系统进程中运行,只要用户在手机上需要文本输入的任何应用程序中,该进程就会启动.

这些是使用Gboard可以遵循的近似步骤,以查看以编程方式返回到以前的应用程序的效果:

  1. 用户在iPhone上启动Apple Messages应用程序并点击文本字段以开始输入文本.
  2. Gboard键盘扩展程序已启动,用户可以看到Gboard自定义键盘(当他们仍在Apple Messages应用程序中时).
  3. 用户点击Gboard键盘扩展内的麦克风键进行语音到文本输入.
  4. Gboard使用自定义URL方案来启动Gboard容器应用程序.Gboard键盘和Apple消息应用程序在App堆栈中向下推送一层,而Gboard容器应用程序现在是App堆栈中最前面的应用程序.Gboard容器应用程序使用麦克风收听用户的语音并将其转换为放置在屏幕上的文本.
  5. 当用户对他们在屏幕上看到的文本输入感到满意时,用户点击"完成"按钮.
  6. 这就是魔术发生的地方......当文本输入屏幕被取消时,Gboard容器应用程序也会自动被解雇.Gboard容器应用程序消失并被Apple Messages应用程序取代(有时Gboard键盘扩展程序仍处于活动状态,有时会重新启动,有时需要通过点击文本字段手动重新启动.).Google如何实现这一目标?
  7. 最后,用户在文本输入字段中看到刚刚翻译的文本自动插入.据推测,谷歌通过在Gboard容器应用和键盘扩展之间共享数据来实现这一目标.

我假设Google使用私有API,通过使用Objective-C运行时内省探索状态栏的视图层次结构,并以某种方式合成tap事件或调用公开的目标/操作.我已经很好地探索了这个,并且能够在状态栏中找到有趣的UIView子类,比如UIStatusBarBreadcrumbItemView,它包含一个UISystemNavigationAction数组.我正在继续探索这些类,希望我能找到一些复制用户交互的方法.

我知道使用私有API是一种很好的方式来让您的应用程序提交从App Store中被拒绝 - 这不是我想在答案中解决的问题.我主要想找到关于Google如何完成以编程方式弹出Gboard中应用程序切换堆栈中的一个应用程序的具体任务的具体答案.

ios ios-keyboard-extension

39
推荐指数
2
解决办法
2031
查看次数

从容器应用程序*iOS 8.3*开始,如何检查"允许完全访问"

在iOS 8.3之前,检查是否已授予键盘扩展"允许完全访问权限"的方法是通过容器应用程序中的以下代码:

- (BOOL)isOpenAccessGranted{
   return [UIPasteboard generalPasteboard];
}
Run Code Online (Sandbox Code Playgroud)

但是,正如对这个流行的SO答案线程的评论所指出的那样,自iOS 8.3以来,即使未授予完全访问权限,应用程序也可以从共享组容器中读取,因此上述代码始终返回true.但是,仅在启用"允许完全访问"时才授予写入权限.

我已经尝试列出了所有基于苹果公司pasteboards的文档UIPasteboard,但它并没有界定哪些是可访问的.对此有任何见解非常感谢.

objective-c ios ios8 ios-keyboard-extension ios8-extension

32
推荐指数
1
解决办法
1530
查看次数

在iOS 8键盘扩展中实现键盘键弹出动画

我想问一下当拿着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)

ios ios8 ios-keyboard-extension

16
推荐指数
1
解决办法
1811
查看次数

防止文本字段中的自定义键盘

我正在尝试自定义键盘如何影响我的应用.我在iPhone 6上安装了Swype.

我发现在我的一些视图中,我在文本字段上设置了自定义inputView属性,Swype键盘覆盖并呈现而不是我的选择器.这完全打破了我的UI,不能被允许.

有没有办法明确告诉iOS 8只使用我设置的inputView?

这可能是一个错误吗?允许第三方覆盖我的输入规范是不是完全没有预期的行为?

iphone inputview ios8 ios-keyboard-extension ios8-extension

13
推荐指数
3
解决办法
2824
查看次数

从扩展名写入存储在App Group容器中的数据库

我有一个存储在App Group容器中的sqlite数据库,以便注册自定义快捷方式.

我可以从应用程序读取/写入,但不能从键盘扩展名读取/写入.似乎数据库处于扩展的只读模式.

我正在使用以下代码来访问它:

let appGroupDirectoryPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(appGroupId)
let dataBaseURL = appGroupDirectoryPath!.URLByAppendingPathComponent("database.sqlite")
Run Code Online (Sandbox Code Playgroud)

是否有一种解决方法可以从扩展键盘写入数据库,还是完全不可能?

数据库可以从模拟器写入,但不能与真实设备一起写入.我想这是因为MacOS X和iOS上的权限管理方式不同.

sqlite ios ios-app-group ios-keyboard-extension

12
推荐指数
1
解决办法
648
查看次数

如何通过在iMessage中点击"发送"等操作从iOS键盘扩展中检测到文本字段被清除?

在我的iOS键盘应用程序中,我目前有一个文本建议栏,就像默认的iOS 8键盘的建议栏.每当用户执行清除文本字段的操作时(例如,当某人在iMessage或Whatsapp上点击" 发送 " 时),我想清除建议栏上的所有文本.

因为点击"发送" 不是击键,我想知道在清除文本字段时是否有从键盘检测的方法.

我试过检测空文本""或新行"\n",但到目前为止这还没有奏效.

编辑:我知道这可以通过第三方iOS键盘,如这里所见(这是来自Themeboard)

在点击发送之前,请注意建议栏中的文字.
在发送之前

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

objective-c ios ios8 ios-keyboard-extension ios8-extension

11
推荐指数
1
解决办法
1344
查看次数

如何使用自定义键盘扩展插入NSAttributedString?

我想用键盘扩展,因为这些应用程序编写一些自定义的字体的文本(1,2,3,4)在做什么.我知道如何在文档代理中插入普通字符串.

    [self.textDocumentProxy insertText:mystring];
Run Code Online (Sandbox Code Playgroud)

我试图NSAttributedString使用上述方法插入,但我看不到任何方式插入NSAttributedString文档代理.

有人可以指导什么是解决这个问题的最佳方法?任何建议将不胜感激.

nsattributedstring custom-font ios ios-keyboard-extension

10
推荐指数
1
解决办法
1145
查看次数

我们可以检测哪个ios应用程序正在使用我的自定义键盘

我想在我的自定义键盘扩展程序中检测哪个应用程序正在使用我的扩展程序.我们可以检测键盘扩展中有关使用我的扩展程序的应用程序的任何信息.我​​不认为这是可能的.如果任何机构有这方面的知识,请分享它.

谢谢

iphone xcode ios ios-keyboard-extension

9
推荐指数
1
解决办法
686
查看次数

如何在键盘应用程序扩展中处理UITextField

我在自定义键盘上添加了textfield(keyboardTextField)和UISwitch.我可以在Switch value my code的基础上为(keyboardTextField)设置焦点ONOFF.

- (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

8
推荐指数
1
解决办法
681
查看次数

无法本地化自定义键盘iOS

我正在尝试实现一个键盘扩展,它可以显示键,具体取决于用户在设备的设置中选择的语言.

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上进行测试.

我可能错过了一个非常小的点.任何建议都是受欢迎的.谢谢.

ios ios8 ios-keyboard-extension

8
推荐指数
1
解决办法
618
查看次数