菜鸟教程小白 发表于 2022-12-13 17:26:34

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


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

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

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

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

<p>我也尝试使用 dlopen() 加载 OSX 特定框架,但同样失败。</p>

<p>换句话说:</p>

<p>我的 iOS 代码如何另外访问特定于 OSX 的库?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这一次有很多问题。让我们一步一步来:</p>

<blockquote>
<p>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.</p>
</blockquote>

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

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

<blockquote>
<p>[...] the linker will have trouble keeping things apart due to name space
collisions [...]</p>
</blockquote>

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

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

<blockquote>
<p>[...] Building the above then leads to a linker error [...]</p>
</blockquote>

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

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

<blockquote>
<p>Oh, and to prove that it must be possible somehow, take a look at RubyMotion [...]</p>
</blockquote>

<p>在模拟器中,事件处理是在“iOS-Simulator.app”进程(这是一个 Mac OS 应用程序)中完成的。要从您的模拟器进程中获取这些事件,您可能可以使用 <a href="https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/doc/uid/TP40003550-CH201-TPXREF101" rel="noreferrer noopener nofollow">Quartz Event Services</a> .</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 从模拟器中运行的 iOS 应用程序访问 OSX API 以进行调试,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/13141222/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/13141222/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 从模拟器中运行的 iOS 应用程序访问 OSX API 以进行调试