使用 URL 方案的 iOS 应用间通信

Posted

技术标签:

【中文标题】使用 URL 方案的 iOS 应用间通信【英文标题】:iOS Inter App communication using URL Schemes 【发布时间】:2014-09-03 08:18:56 【问题描述】:

我在同一设备上安装了 2 个 iPhone 应用,应用 A 和应用 B。应用 A 没有任何远程服务器连接。应用 A 必须调用应用 B 进行远程服务器通信。应用程序 B 将调用服务器并将响应返回给应用程序 A。我想使用“Apple URL 方案”进行此应用程序间通信。问题是当应用 A 调用应用 B 时,应用 A 将进入后台,而应用 B 将进入前台。但我希望这种交流在没有用户通知的情况下发生。应用 A 应始终位于用户的前台。

所以解决方案可以是这样的。 app A 调用 app b 进行服务器调用。应用 A 将进入后台模式,应用 B 将进入前台。应用程序 A 中的方法将检测后台模式并将其带回前台。同样,应用程序 B 中的方法将检测前台模式并在几分之一秒内将其带回后台。因此,当应用程序切换时,用户只会看到一些闪烁的屏幕。应用 B 将在后台执行任务并将结果返回给应用 A。

我想知道这是否可以在 ios 中处理?非常感谢任何建议。

【问题讨论】:

如果用户卸载您的某个应用会发生什么情况?我无法想象为什么你想要两个应用程序...避免更新app A?如果您明确您的想法,也许我们可以解决根本问题。 @donmarkusi 这是客户的要求。设备中可能有来自同一供应商的多个应用程序。但是只有一个应用程序可以访问远程服务器。设备中的其他应用需要与此应用进行通信以实现远程服务器连接。 @SinuVarghese 我也在尝试实现相同的过程。你能在哪里完成这个要求?谢谢! 【参考方案1】:

您可以尝试类似的方法。我在这里进行推理,不确定步骤 #5-6 是否真的有效,但我认为值得一试

应用 A 通过 URL 方案调用应用 B:openUrl: @"appB://startsomething" 应用 B 变为活动状态,用户将看到该开关 App B 启动网络通信并立即将控制权发送回 App A:openUrl: @"appA://resume 应用 A 变为活动状态,用户将再次看到该开关(因此,本质上,应用 A 将切换到应用 B 并返回 同时,App B 正在处理网络请求,完成后它再次使用 openUrl 向 App A 发送信息:openUrl: @"appA://data=GOT_DATA" 应用 A 已经处于活动状态,但它应该会收到此调用并解析出数据

【讨论】:

通过应用间通信发送数据是否有大小限制? 是否可以让App B不带任何UI,让用户一直看到App A? 没有。你不能有一个没有 UI 的应用程序 @sha 当 App A 再次激活时,是否会改变应用之前的状态? @dariru 这取决于您将如何实现在 appA 中使用 URL 打开的处理程序。你可以为所欲为。【参考方案2】:

可以部分处理。

a 可以使用 b 进行服务器调用

但 b 必须留在前台才能将 url 调用回 a

【讨论】:

当应用 A 进入后台时,它必须自动反弹回前台模式。是否可以在几分之一秒内完成,这样用户就看不到应用 B 正在运行? 是的,它不会自动发生。我想以编程方式处理它。为什么 b 在后台时不能调用 a。 因为在后台意味着它不能做某些事情。 在这种情况下,iOS 中是否还有其他可用的应用间通信解决方案? 没有用户交互什么都没有/至少不公开 ;) 私下里当然有 XPC 但对我们来说..no【参考方案3】:

如果修复了问题中的范围(如 URL Scheme),那么您将受到范围的限制。但如果一个人释放自己,可能会问或继续问,例如 - 应用程序扩展稍后会帮助这个问题。

【讨论】:

以上是关于使用 URL 方案的 iOS 应用间通信的主要内容,如果未能解决你的问题,请参考以下文章

iOS进程间通信之CFMessagePort

应用在 iOS 中启动时是不是存在应用间通信?

iOS 线程间的通信 (GCD)

gRPC-微服务间通信实践

使用和不使用 .net 的进程间通信

架构设计:系统间通信(32)——其他消息中间件及场景应用(下2)