2

出于调试目的,我正在寻找一种 iOS 应用程序(我可以访问其源代码)可以与单独的 OSX 应用程序通信的方式,例如通过套接字。

由于在模拟器中运行的 iOS 应用程序在 Mac 上本地运行,通过使用专门设计的 iOS 模拟器框架,通过 OSX 框架路由 I/O,我必须有一种方法可以用我自己的代码实现这一点。

简单地将标准 OSX 框架添加到项目中并在 iOS 应用程序中使用它们是行不通的:

如果我尝试加载已经作为 iOS 框架存在的 OSX 框架,iOS 框架将始终是首选,这意味着如果框架功能仅在 OSX 上可用但在 iOS 中不可用,我将无法使用它。如果框架还不存在,比如 Carbon.framework,那么我可以让链接器尝试加载它。例如,如果我尝试访问作为 Carbon.framework 的一部分的 SysBeep(),则链接器会在它想要解析指向已作为 iOS 加载的其他库的外部符号时失败并显示错误消息- 只有库。

我还尝试使用 dlopen() 加载 OSX 特定框架,但同样失败。

换句话说:

我的 iOS 代码如何另外访问特定于 OSX 的库?

4

1 回答 1

3

这一次有很多问题。让我们一步一步来:

出于调试目的,我正在寻找一种 iOS 应用程序(我可以访问其源代码)可以与单独的 OSX 应用程序通信的方式,例如通过套接字。

绝对可以在模拟器中运行的 iOS 应用程序进程中使用 OS X 工具。使用普通套接字将非常简单,因为 BSD 库在 iOS 和 Mac OS 中是相同的。您可以简单地编译您的 C 代码,它会透明地使用底层操作系统。

如果你想使用 Objective-C API,NSURLConnection你也可以这样做。在模拟器中,您的应用程序使用 Mac OS 版本的 Foundation 和 Core Foundation。在大多数情况下,您不会意识到这一点,因为 API 非常相似。

[...] 由于名称空间冲突,链接器将难以将事物分开 [...]

目前还不清楚你在这里尝试实现什么。正如我所解释的,模拟器进程直接使用适当的 Mac OS 较低级别的框架。链接到 AppKit 等更高级别的框架是没有意义的,因为该应用程序不使用 Cocoa 桌面组件。这就是为什么没有NSApplication符号并且应用程序没有实例化符号的原因。相反,它使用UIApplication模拟器特制 UIKit 框架中的类,位于

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/UIKit.framework

[...] 构建上述内容会导致链接器错误 [...]

这是因为链接器被指示仅查看不存在 AppKit 的 iPhoneSimulator SDK(使用链接器标志,如-isysroot <path-to-SDK>)。

但在这一点上,可能值得问自己为什么要首先链接到 AppKit。您可以在没有 AppKit 的情况下设置进程间通信。

哦,为了证明它一定是可能的,看看 RubyMotion [...]

在模拟器中,事件处理是在“iOS-Simulator.app”进程(这是一个 Mac OS 应用程序)中完成的。要从您的模拟器进程中获取这些事件,您可能可以使用Quartz Event Services

于 2012-10-30T15:08:21.007 回答