2

デバッグの目的で、iOSアプリ(ソースコードにアクセスできる)が別のOSXアプリ(ソケットなど)と通信できる方法を探しています。

シミュレーターで実行されるiOSアプリはMacでネイティブに実行されるため、OSXフレームワークを介してI / Oをルーティングする特別に設計されたiOSシミュレーターフレームワークを使用することで、自分のコードでもそれを実現できる方法が必要です。

プロジェクトに標準のOSXフレームワークを追加し、iOSアプリ内からそれらを使用するだけでは機能しません。

すでにiOSフレームワークとして存在するOSXフレームワークを読み込もうとすると、iOSフレームワークが常に優先されます。つまり、フレームワーク機能がOSXでのみ使用可能であり、iOSでは使用できない場合はアクセスできません。Carbon.frameworkのようにフレームワークがまだ存在しない場合は、リンカーにロードを試行させることができます。たとえば、Carbon.frameworkの一部であるSysBeep()にアクセスしようとすると、iOSとして既にロードされている他のライブラリを指す外部シンボルを解決しようとすると、リンカーはエラーメッセージで失敗します。 -libのみ。

dlopen()を使用してOSX固有のフレームワークをロードしようとしましたが、同じように失敗します。

言い換えると:

iOSコードでOSX固有のライブラリに追加でアクセスするにはどうすればよいですか?

4

1 に答える 1

3

それは一度にたくさんの質問です。ステップバイステップで行きましょう:

デバッグの目的で、iOSアプリ(ソースコードにアクセスできる)が別のOSXアプリ(ソケットなど)と通信できる方法を探しています。

シミュレーターで実行されているiOSアプリプロセス内からOSX機能を使用することは間違いなく可能です。BSDライブラリはiOSとMacOSの両方で同一であるため、プレーンソケットの使用は非常に簡単です。Cコードをコンパイルするだけで、基盤となるOSを透過的に使用できます。

このようにObjective-CAPIを使用したい場合は、NSURLConnectionこれも実行できます。シミュレーターでは、アプリはMacOSバージョンのFoundationとCoreFoundationを使用します。ほとんどの場合、APIは非常に似ているため、これを認識できません。

[...]名前空間の衝突により、リンカは物事を区別するのに問題があります[...]

ここで何を達成しようとしているのかは明確ではありません。説明したように、シミュレータプロセスは適切なMacOSの下位レベルのフレームワークを直接使用します。アプリはCocoaデスクトップコンポーネントを使用しないため、AppKitのような高レベルのフレームワークにリンクすることは意味がありません。そのため、シンボルはなく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アプリケーション)で行われます。シミュレータプロセス内からこれらのイベントを取得するには、QuartzEventServicesを使用できます

于 2012-10-30T15:08:21.007 に答える