【发布时间】:2026-02-23 14:35:01
【问题描述】:
Google 的自定义 iOS 应用 Gboard 有一个有趣的功能,使用 iOS SDK 中的公共 API 无法实现(从 iOS 10 开始)。 我想知道 Google 如何以编程方式在 Gboard 的 App Switching 堆栈中弹回一个应用程序。
自定义 iOS 键盘有两个主要组件:容器应用和键盘应用扩展。键盘应用程序扩展在单独的操作系统进程中运行,只要用户在手机上需要文本输入的任何应用程序中,该进程就会启动。
这些是使用 Gboard 可以遵循的大致步骤,以查看以编程方式返回到上一个应用程序的效果:
- 用户在其 iPhone 上启动 Apple Messages 应用程序并点击文本字段以开始输入文本。
- Gboard 键盘扩展程序启动,用户会看到 Gboard 自定义键盘(当他们仍在 Apple Messages 应用程序中时)。
- 用户点击 Gboard 键盘扩展内的麦克风键进行语音转文本输入。
- Gboard 使用custom url scheme 启动 Gboard 容器应用。 Gboard 键盘和 Apple 消息应用程序在应用程序堆栈中被下推一层,Gboard 容器应用程序现在是应用程序堆栈中最前面的应用程序。 Gboard 容器应用使用麦克风收听用户的语音并将其转换为放置在屏幕上的文本。
- 当用户对他们在屏幕上看到的文本输入感到满意时,点击“完成”按钮。
- 这就是奇迹发生的地方……当文本输入屏幕被关闭时,Gboard 容器应用程序也会自动关闭。 Gboard 容器应用程序消失并被 Apple Messages 应用程序取代(有时 Gboard 键盘扩展过程仍然存在,有时会重新启动,有时需要通过在文本字段内点击手动重新启动。)。 Google 如何做到这一点?
- 最后,用户会看到刚刚翻译的文本自动插入到文本输入字段中。据推测,Google 在 Gboard 容器应用和键盘扩展之间通过sharing data 实现了这一点。
我假设 Google 通过使用 Objective-C 运行时内省探索状态栏的视图层次结构并以某种方式合成点击事件或调用公开的目标/动作来使用私有 API。我对此进行了一些探索,并且能够在状态栏中找到有趣的 UIView 子类,例如包含UISystemNavigationActions 数组的UIStatusBarBreadcrumbItemView。我将继续探索这些类,希望能找到一些复制用户交互的方法。
我了解使用私有 API 是让您的应用提交被 App Store 拒绝的好方法 - 这不是我希望在答案中解决的问题。我主要在寻找有关 Google 如何以编程方式在 Gboard 的 App Switching 堆栈中弹回一个应用程序这一任务的具体答案。
【问题讨论】:
-
任何应用程序都会发生这种情况吗?在系统消息应用程序的情况下,这很容易 - 有一个启动它的计划:developer.apple.com/library/content/featuredarticles/…。如果这也适用于其他应用程序(尤其是不太受欢迎的应用程序),那确实很好奇。
-
@Losiowaty 这似乎发生在任何任意应用程序中。
-
关于第4步,我无法打开容器/主机应用程序,你是怎么做到的?谢谢
标签: ios ios-keyboard-extension