問題タブ [nsxpcconnection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 32 ビットと 64 ビットの cocoa アプリケーション間でのデータの受け渡し
64 ビットに移植できない 32 ビットのレンダリング ライブラリを使用する必要がある 64 ビットの cocoa プロジェクトがあります。
32 ビットでコンパイルされ、ライブラリのインターフェイスを提供するレンダリング サービスと、64 ビットでコンパイルされ、レンダリング サービスにアクセスするメイン プロジェクトに分けることにしました。
プロセス間通信を行うための最良の方法は何だろうと思っています。高速通信と簡単な API を提供するソリューションを探しています。
現在、XPC (特に NSXPCConnection) が推奨されるソリューションのようです。ただし、32 ビット アプリケーション用に実装されているかどうかはわかりません。
さらに、かなり大量のデータ (最大 ~5MB) を渡す必要があるため、XPC のパフォーマンスと速度が心配です。この状況で共有メモリのマッピングは可能ですか、または推奨されますか? xpcと連携できますか?
objective-c - 状態を含む XPC サービスをどのように作成する必要がありますか?
私は NSXPC* ドキュメントを読みました。このドキュメントでは、提供されたサービスを可能な限りステートレスにするようアドバイスしています。サービスと呼び出し元のアプリはお互いをシングルトンと見なし、一度に実行されるサービスのインスタンスは 1 つだけなので、少なくとも私が読んだドキュメントと例にとっては良い考えです。これは、メソッドが本質的に非メンバー関数であることを意味します (C++ 用語を使用するため)。
なぜこれを回避したいのですか?ネットワーク コードを XPC に入れたい。XPC は複数のウィンドウを持つ GUI アプリで動作するため、複数の同時接続をサポートする必要があります。少なくとも直接的には、シングルトンでは機能しません。
ネットワーク API は C ベースで、主な状態型は custom へのポインターstruct
です。では、似たようなことをしてみませんか:
- 作成関数に値型などを返すようにし
NSUUID
ます。(プロセス間でポインターを渡すことは、悪い考えです。) - サービスで、と API C ポインターの間の
NSDictionary
(またはstd::map
その他の) マッピングを作成します。NSUUID
- さまざまなサービス API が を受け取り
UUID
、ネットワーク API を使用するために C ポインターに変換します。
余談:トークンはランダムであるため、XPC サービスがクラッシュした場合、XPC の再起動後にメイン アプリにトークンが使用できなくなります。代わりに、URL (再起動するすべての情報が含まれる) を使用する必要があるかもしれません。しかし、2 つの接続がたまたま同じサーバーに接続されている場合、競合が発生する可能性があります。たぶん、URL/UUID ペアであるトークンとアイデアを組み合わせることができます。(UUID 値は、サービスによって返されるものから、メイン アプリによって提供されるものに移動します。)
これは、ステートフル XPC を実装する良い方法でしょうか?
macos - NSXPCListener を使用して通常のタスクを実行するヘルパー アプリ
私のヘルパー エージェント アプリは、起動後に常に 1 つのアクティビティを実行する必要がありますが、XPC を介してメイン アプリと通信する必要もあります。
ただし、リスナーのセットアップには特定のメイン関数が必要であり、それがアプリを引き継ぎます (標準の AppDelegate NSApplication アプローチを省略します)。
両方を持つ方法は?NSRunLoop と NSXPCListener アプリを使用したバックグラウンド アプリ?
objective-c - XPCService がアプリから起動しない
で簡単なサンプル アプリを試してXPCServices
います。以下の手順に従っています。
ステップ 1:サンプル プロジェクトを作成し、XPCServices
名前付きでターゲットを追加HelperProcess
しました。ターゲットが作成されると、XCode は以下のファイルを自動的に生成します。
- HelperProcessProtocol.h
- HelperProcess.h
- HelperProcess.m
- main.m
ステップ 2:のmain.m
実装内にログ ステートメントを追加しました。ServiceDelegate
ステップ 3:以下AppDelegate
のコードを追加applicationDidFinishLaunching:
問題は -
アプリを起動すると、listener:shouldAcceptNewConnection: に追加されたログが表示されず、Activity Monitor にヘルパー プロセスが表示されません:(
コードは次のとおりです。
注: XCode 6.0でこれを試しています
動作させるために必要な追加のセットアップはありますか? 提案してください。
- アップデート -
Appleからこのサンプルを参照しようとしました: AppSandboxLoginItemXPCDemo
XCode 6 で実行しようとすると、「署名 ID が見つかりません」というエラー メッセージが表示されました。Mac 開発者アカウントを登録していないため、iDecide と iDecideHelper のビルド設定で、「コード署名 ID」を「コード署名しない」に変更しました。
ターゲットごとに警告が表示されました。
今回ビルドをコンパイルしたところ、期待どおりに動作しました。
ここで、ReadMe.txt ファイルで指定された手順に従おうとしました。具体的には、サンプル アプリで次の手順を実行しました。
ステップ 1:更新 - メイン アプリ ターゲット -> [機能] タブ
- 「アプリサンドボックス」をオンにしました
- 「アプリ グループ」をオンにしました
- アプリ グループ「XYZ」を追加しました
ステップ 2:更新 - ヘルパー ターゲット -> [機能] タブ
- 「アプリサンドボックス」をオンにしました
- 「発信接続 (クライアント)」を有効にしました
- 「アプリ グループ」をオンにしました
- アプリ グループ「XYZ」を追加しました
ステップ 3:更新 - ヘルパー ターゲット -> [全般] タブ -> [バンドル識別子] に「XYZ」プレフィックスを追加しました。
コンソールでアプリを実行すると、次のメッセージが表示されました。
listener:shouldAcceptNewConnection:
アプリは意図した機能を実行せず、デリゲートに追加されたログ メッセージを表示しませんでした。
私は無知です。不足しているものがあれば教えてください。Mac 開発者アカウントを登録せずに、XPC サービス サンプル アプリを動作させることはできますか?
objective-c - NSWorkspace runningApplications が XPC マッハ サービスを返さない
実行中のアプリケーションとエージェントを返しますが、実行中の XPC mach サービスが表示されません (ただし、実行中であり、アクティビティ モニター プロセスで表示されます)。
アクティビティモニターでPIDを調べても
私は res nil を取得しますが、他のプロセスではこれはうまく機能します
objective-c - NSOpenPanelを開くとプラグインcom.getdropbox.dropbox.garconの取得が中断される
NSOpenPanel を開いてアプリケーションがクラッシュすると、コンソールに次のメッセージが表示されます。
そして、デバッガーでは、スレッド 6 で次のような警告が表示されます。
私はNSOpenPannelを開くすべてを試しまし[openPanel runModal]
た[openPanel beginSheetModalForWindow:...
txt ファイルを開くためだけに NSOpenPanel を使用します
このメッセージの表示を停止し、アプリケーションがクラッシュしないようにするにはどうすればよいですか?
アプリはサンドボックス化されておらず、コード署名されていません。Apple 開発者アカウントを持っていないため、Debug-build でのみ試しています。Mac OS X のバージョンは 10.10 で、ドロップボックスのバージョンは 3.0.3 です。