出于调试目的,我正在寻找一种 iOS 应用程序(我可以访问其源代码)可以与单独的 OSX 应用程序通信的方式,例如通过套接字。
由于在模拟器中运行的 iOS 应用程序在 Mac 上本地运行,通过使用专门设计的 iOS 模拟器框架,通过 OSX 框架路由 I/O,我必须有一种方法可以用我自己的代码实现这一点。
简单地将标准 OSX 框架添加到项目中并在 iOS 应用程序中使用它们是行不通的:
如果我尝试加载已经作为 iOS 框架存在的 OSX 框架,iOS 框架将始终是首选,这意味着如果框架功能仅在 OSX 上可用但在 iOS 中不可用,我无法使用它。如果框架还不存在,比如 Carbon.framework,那么我可以让链接器尝试加载它。例如,如果我尝试访问作为 Carbon.framework 的一部分的 SysBeep(),则链接器会在它想要解析指向已作为 iOS 加载的其他库的外部符号时失败并显示错误消息-only 库。
我也尝试使用 dlopen() 加载 OSX 特定框架,但同样失败。
换句话说:
我的 iOS 代码如何另外访问特定于 OSX 的库?
这一次有很多问题。让我们一步一步来:
For debugging purposes I am looking for a way that a iOS app (whose source code I have access to) can communicate with a separate OSX app, e.g. via sockets.
绝对可以在模拟器中运行的 iOS 应用程序进程中使用 OS X 工具。使用普通套接字将非常简单,因为 BSD 库在 iOS 和 Mac OS 中是相同的。您可以简单地编译您的 C 代码,它会透明地使用底层操作系统。
如果你想使用像 NSURLConnection
这样的 Objective-C API,你也可以这样做。在模拟器中,您的应用程序使用 Mac OS 版本的 Foundation 和 Core Foundation。在大多数情况下,您不会认识到这一点,因为 API 非常相似。
[...] the linker will have trouble keeping things apart due to name space collisions [...]
目前还不清楚您在这里尝试实现什么目标。正如我所解释的,模拟器进程直接使用适当的 Mac OS 较低级别的框架。链接到 AppKit 等更高级别的框架是没有意义的,因为该应用程序不使用 Cocoa 桌面组件。这就是为什么没有 NSApplication
符号并且应用程序没有实例化一个的原因。相反,它使用模拟器特制 UIKit 框架中的 UIApplication
类,该框架位于
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/UIKit.framework
[...] Building the above then leads to a linker error [...]
这是因为链接器被指示仅查看不存在 AppKit 的 iPhoneSimulator SDK(使用链接器标志,如 -isysroot
)。
但是在这一点上,可能值得问问自己为什么要首先链接到 AppKit。您可以在没有 AppKit 的情况下设置进程间通信。
Oh, and to prove that it must be possible somehow, take a look at RubyMotion [...]
在模拟器中,事件处理是在“iOS-Simulator.app”进程(这是一个 Mac OS 应用程序)中完成的。要从您的模拟器进程中获取这些事件,您可能可以使用 Quartz Event Services .
关于ios - 从模拟器中运行的 iOS 应用程序访问 OSX API 以进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13141222/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |