获取外部 [UIApplication sharedApplication]?

Posted

技术标签:

【中文标题】获取外部 [UIApplication sharedApplication]?【英文标题】:Get extern [UIApplication sharedApplication]? 【发布时间】:2012-03-01 12:49:17 【问题描述】:

我目前正在为 iPad 应用程序开发“设备内”(不是模拟器)监控系统。系统应该能够执行以下操作:

-用户输入模拟:模拟用户输入:点击、拖动、键盘。

-信息回忆:输入后获取文本值和结果。

此信息稍后会报告给事件管理服务器。通过使用来自 KIF 软件https://github.com/square/KIF 的一些代码和一些自行开发的代码,我已经在一个应用程序中处理了这两点。我使用 UIView 对象的 accessName 属性来获取它们的指针并将人工事件发送到 [[UIApplication sharedApplication] sendEvent:] 方法。

事情是这样的:我需要将这些事件从我所在的 app#1 发送到 app#2。 (为了保持监控的独立性,也不能在 app#2 中嵌入所有代码)我使用 [[UIApplication sharedApplication] openURL:] 方法打开 app#2。 https://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedAppTricks/AdvancedAppTricks.html#//apple_ref/doc/uid/TP40007072-CH7-SW18

问题是,我无法将事件从 app#1 发送到 app#2,因为我似乎无法在 app#1 代码中获取指向 app#2 的 [UIApplication sharedApplication] 对象的指针。

进程之间的共享内存通信会很好,但根据我发现的信息,URL 消息传递方案似乎是 iOS 中应用程序(或进程)之间的唯一通信。 iOS 中也不存在 NSConnection 类。我还阅读了一些关于 Mach 端口和 POSIX 文件描述符的信息,但它们看起来相当复杂,我不知道它们是否能提供帮助。

我什至尝试将 app#2 [UIApplication sharedApplication] 实例的指针值作为字符串参数发送到 URL 消息中,然后将字符串转换回 app#1 中的指针,但得到了 EXC_BAD_ACCESS。我想指针地址在两个进程中并不相同。也许每个过程都有自己的“偏移量”? 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先我要澄清的是,如果没有私有 API,您想要做的事情是不可能的。 每个应用程序都被沙盒化,您无法(直接)访问其他应用程序。我觉得你的问题很大。

在 iOS 中运行的每个应用程序就像一个小型、独立的生态系统,当用户按下“主页”按钮时结束(除非您声明了一些后台服务,如 VOIP、本地化或音频播放器)。关闭应用程序后,您仍然可以运行的唯一内容是一个不应超过 10 分钟的进程。这是为了防止过度使用后台任务,即使在这里,其他应用也无法访问该应用。

我认为唯一的方法是搜索私有 API,希望其他人已经找到了在 2 个应用之间(直接)创建数据流的方法。

【讨论】:

是的,如果没有私有 API,这是不可能的。实际上,KIF 本身确实使用私有 API 来伪造点击事件。这不是问题,因为此代码或应用不会提交到应用商店。它仅用于监视和监视目的。我尝试了后台方法(当 app#1 在后台并且 app#2 处于活动状态时调用 [UIApplication sharedApplication]),但它返回了 app#1 的 UIApplication 实例。您认为其中一个 API 已经存在吗?是使用 Mach 端口或 POSIX 文件描述符还是分布式对象完成的?感谢您的帮助。 是的,我确信您可以从另一个应用程序访问一个应用程序。 this post 可能是开始使用私有 API 并找到访问其他应用程序内存的方法的好地方。

以上是关于获取外部 [UIApplication sharedApplication]?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法为`UIApplication.shared`添加`if(iOSApplicationExtension)`条件

使用 UIApplication.shared.open 连续调用多个 URL - 仅先打开

Swift/iOS13 - UIApplication.shared.delegate.window?.rootViewController?.present() 来自自定义类

如何使用 UIApplication.shared.open 在 iOS 上选择性地打开其他应用程序

swift `UIApplication.shared.isNetworkActivityIndi​​catorVisible`管理クラス(延迟非対応)

在 iOS 扩展和应用程序之间使用 UIApplication.shared 共享 CocoaPod