从运行在模拟器中的iOS应用程序访问OSX API进行调试

从运行在模拟器中的iOS应用程序访问OSX API进行调试,ios,linker,ios-simulator,objective-c-runtime,Ios,Linker,Ios Simulator,Objective C Runtime,出于调试目的,我正在寻找一种iOS应用程序(其源代码我可以访问)可以与单独的OSX应用程序通信的方法,例如通过套接字 由于在模拟器中运行的iOS应用程序在Mac上本机运行,因此通过使用专门设计的iOS模拟器框架通过OSX框架路由I/O,我必须有一种方法可以通过我自己的代码实现这一点 简单地将标准OSX框架添加到项目中并在iOS应用程序中使用它们是行不通的: 如果我尝试加载一个已经作为iOS框架存在的OSX框架,那么iOS框架将始终是首选,这意味着如果一个框架功能只在OSX上可用,而在iOS中不可

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

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

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

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

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

换言之:


另外,我的iOS代码如何访问OSX特定的LIB?

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

出于调试目的,我正在寻找一种方法,使iOS应用程序(其 我可以访问的源代码)可以与单独的OSX应用程序通信, e、 g.通过插座

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

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

[…]由于名称空间的原因,链接器将很难将内容分开 碰撞[…]

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

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/UIKit.framework
[…]构建上述内容会导致链接器错误[…]

这是因为链接器被指示只查看不存在AppKit的iPhoneSimulator SDK(使用链接器标志,如
-isysroot

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

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


在模拟器中,事件处理在“iOS simulator.app”过程中完成(这是一个Mac OS应用程序)。要从模拟器流程中了解这些事件,您可能需要使用。

Nikolai,这是很多有见地的信息,谢谢!我尝试访问NSApplication的原因是为了查看是否可以访问模拟器的运行时环境,以便找到它的iOS屏幕视图,这样我就可以访问它,而不必在iOS运行时环境中放置覆盖视图(以避免因iOS环境中添加视图而产生的副作用)。目前,我已经通过调用SysBeep()简化了我的尝试,但仍然有问题,因为即使使用dlopen,我也无法加载Carbon框架。还在看…你运气好吗?