点击打开app的时候,快捷指令的页面能不显示吗?

点击打开app的时候,快捷指令的页面能不显示吗?

你提到了一个非常核心且常见的需求,也是 iOS 自动化领域的一个“痛点”:在通过快捷指令打开 App 时,能否不显示快捷指令本身的页面(即“闪烁”)?

核心答案:

不行,在通过 shortcuts://run-workflow?name=... 这种 URL Scheme 方式调用快捷指令时,目前没有公开的 API 或方法可以阻止“快捷指令”App 自身界面的短暂显示。

这个“闪烁”或短暂跳转到快捷指令 App 的行为,是 iOS 系统有意为之的安全和用户体验设计。

为什么不能避免这个“闪烁”?

  1. 安全和用户感知:

    • iOS 旨在让用户清晰地感知到 App 间的跳转和操作执行。即使是自动化,也需要一定的“痕迹”。
    • 这防止了恶意 App 在后台默默地启动其他 App,或者在用户不知情的情况下执行敏感操作。
    • 通过显示快捷指令的界面,系统相当于在告诉用户:“你的操作正在通过快捷指令这个工具执行。”
  2. 沙盒和权限:

    • App 之间是沙盒隔离的,相互之间不能直接进行深度控制。
    • URL Scheme 是 App 间通信的一种受限方式。当一个 App (JSBox) 通过 Scheme (shortcuts://) 唤醒另一个 App (快捷指令) 时,系统会进行一个 App 切换的过程。这个过程涉及到进程的调度和界面的切换。
    • “快捷指令”App 获得了系统级的特殊权限,可以执行“打开 App”等操作,但它执行这些操作时也必须遵循系统UI切换的规范。
  3. 技术实现:

    • shortcuts:// Scheme 实际上是请求系统启动“快捷指令”这个 App,并向其传递一个指令名称。一旦“快捷指令”App 被唤醒并接收到这个指令,它就会在其内部执行相应的动作。这个启动和执行过程发生在“快捷指令”App 的上下文中,因此它的界面自然会短暂地显示出来。

替代方案或优化用户体验的思路:

虽然不能完全消除“闪烁”,但我们可以从其他角度来优化用户体验:

  1. 接受并解释“闪烁”:

    • 在 UI 提示中明确告知用户会有这个“闪烁”现象,让用户理解这是正常行为。你的代码中已经包含了 $l10n("SHORTCUT_USAGE_HINT") 提示,这是非常好的做法。
  2. 优化快捷指令本身:

    • 确保你的快捷指令只包含最少的动作(例如,只包含“打开 App”),这样跳转过程会尽可能快。避免在快捷指令中添加不必要的延迟或复杂逻辑。
  3. 考虑 Universal Links (通用链接) 作为替代(如果 App 支持):

    • 如果目标 App (IMA) 注册了 Universal Links (通用链接),并且你的 JSBox 脚本可以直接调用这些 https:// 开头的通用链接,那么这种方式不会有快捷指令的“闪烁”。通用链接会直接从一个 App (或浏览器) 跳转到另一个 App,体验更流畅。
    • 缺点: 缺点是,你需要知道 App 注册了哪些通用链接路径,而且不是所有 App 都支持。我们之前的测试表明 IMA App 没有容易猜测的通用链接。
  4. 在 iOS 14+ 尝试“自动运行快捷指令”(部分场景):

    • 在 iOS 14 及以上,可以创建“自动化”快捷指令(Automations),例如,当特定条件满足时(如时间、位置、某个 App 启动),自动运行一个指令。这些自动化指令可以在后台运行,可能不会显示界面。但这是基于系统触发的,而不是由 JSBox 主动调用。
    • 与 JSBox 整合的局限性: 这种方式通常不能由 JSBox 直接触发某个特定的自动化指令,而是依赖 iOS 系统自身的自动化规则。

总结:

对于你目前的需求,通过 shortcuts:// Scheme 调用快捷指令来打开 App 时,短暂的“闪烁”是无法避免的系统行为。 最好的做法是接受并向用户解释这个行为,同时确保你的快捷指令本身尽可能简洁,以提供最快的跳转体验。