問題タブ [xpc]
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.
ios - NSManagedObjectContext executeFetchRequest:error: 例外をスローします: OS_xpc_error
iOS アプリで異常なエラーが発生しています。
私のアプリは、Core Data に挿入される大量の JSON オブジェクトをダウンロードします。ダウンロードごとに次の手順を実行します。
- ネットワーク接続を開き、JSON オブジェクトを取得します
- メインの NSManagedObject が 1 つ作成されます
- 0 から約 20 までの任意の数の追加の NSManagedObjects が作成されます
- 場合によっては、既存の NAManagedObjects のフェッチ要求を実行して既存の一致するオブジェクトを見つけ、関係を作成するか、見つからない場合は新しいオブジェクトを作成します。
関連するコード スニペットをsong
次に示します。 は NSManagedObject サブクラスのインスタンスであり、Category
は別の NSManagedObject サブクラスです。
これは正常に機能しますが、数百回のダウンロードと挿入の後、アプリがクラッシュします。成功したダウンロードの数は、一見ランダムに変化します。
例外の原因となっNSArray *fetchResults = [_moc executeFetchRequest:fetchRequest error:&error];
ている行は次のとおりで、ログ出力は次の行です。
このエラーを Google で検索しようとしても無駄でした。(真剣に-エラーを検索したことがなく、結果がゼロになりました:)
他の誰かが同様のエラーを経験し、正しい方向に向けることができますか? ここでの検索をどこから始めればよいか、完全に途方に暮れています。
tcpserver - NSXPCConnection でのソケットの使用
NSXPCConnection でソケットを使用すると問題が発生します。
基本的に、メイン プロセスと実行中のヘルパー プロセスがあり、NSXPCConnection を介して確立されます。そのヘルパー プロセスは、サーバーとして機能し、外部接続を受信する特定のポート (111 など) をリッスンする必要があります。
ヘルパー プロセスは、Apple が提供するTCPServer
ヘルパー クラス (ラッパー アラウンド) を使用してリッスン ソケットを開きます。CFSocket
ここにあるコード:
https://code.google.com/p/iphone-remotepad/source/browse/trunk/RemotePad/TCPServer.h?r=238
でソケットが正常に開かれました- (BOOL)start:(NSError **)error
。
外部クライアントは 111 ポートで確立できます。(を介して端末でテストしますtelnet localhost 111
)。
ただし、ヘルパー プロセスは TCPServer コールバックを受け取りませんTCPServerAcceptCallBack
。
ヘルパー プロセスでcom.apple.security.network.client
資格が有効になっています。
また、ヘルパー プロセスの代わりにメイン アプリで TCPServer を実行し、ポート 111 でサーバーをセットアップし、ポート 111 に接続しようとすると、コールバックが発生します。
ヘルパー プロセスがソケット コールバックを受信しない理由について何か考えはありますか? XPC 関連の問題?
cocoa - サンドボックス アプリで複数のロード可能なバンドルを処理する XPC サービス
サードパーティ製のプラグインを受け入れるサンドボックス アプリがあり、複数のプラグインを同時に接続できます。XPC サービスを使用して、これらのバンドル用に別のセキュリティ レイヤーを作成したいと考えています。念のため、そのうちの 1 つがクラッシュした場合に備えて、このサービスなしで他のレイヤーを引き続き使用したいと考えています。
を使用してNSXPCConnection
いますが、問題は、このことの複数のインスタンスを同時に作成できないことです。すべてのインスタンスが互いに混乱します。1 つのサービス インスタンスですべてのバンドルを処理する必要はありません。また、別のサービス名を使用して同じことを行うためだけに、プロジェクト内に多数のサービスの重複を作成したくありません。
これを行う別の方法があるかもしれませんが、適切な方法があるかもしれません。助けてください
macos - SMLoginItemSetEnabled は、サンドボックス化された UI ヘルパーの起動にサイレント モードで失敗することがある
サンドボックス化されたアプリがあり、いくつかの UI を表示するヘルパーが含まれています (フルスクリーン ウィンドウとして表示されますが、ステータス アイテムなどでもかまいません)。
これは機能します...ほとんどの場合。しかし、そうでない場合もあります。ヘルパーの起動に黙って失敗するだけです。
ヘルパーには UI があるのでSMLoginItemSetEnabled
、それを読み込んでから、ヘルパーNSXPCConnection
と通信します。しかしSMLoginItemSetEnabled
、まだ YES を返しているのに起動に失敗することがあります。
これは、マシンのどこかにあるアプリの古いビルドが原因のようです。ログインメカニズムを混乱させるようです。古いアプリを削除すると修正されますが、ユーザーがこれを行うことを合理的に期待することはできません (古いバージョンを残しておきたい人もいます)。
の結果をアプリ バンドル内のヘルパーの URL と比較することでこの状況を検出でき-[NSWorkspace URLForApplicationWithBundleIdentifier:]
ますが、他のアプリを削除するようにユーザーに依頼することは、あまり洗練された解決策ではありません。
SMLoginItemSetEnabled
ディスク上の他の場所にあるランダムなものではなく、現在のアプリバンドルのログイン項目を常に使用する方法はありますか?
または、最近の OS リリースで、UI を使用するヘルパーのより洗練されたメカニズムをサポートするために何か変更がありましたか?
このトピックに関する他の多くの質問をここや他の場所で読んだことがあります。
cocoa - com.apple.xpc.launchd.oneshot
XCTestCase
テストでは、オブジェクトを作成してNSTask
run に設定しましたprintenv
。そして、終わった後、と を使ってNSTask
走りました。両方からの出力は、1 つの環境変数を除いて同じでした。printenv
fork
execv
タスク:XPC_SERVICE_NAME=com.apple.xpc.launchd.oneshot.0x10000004.Xcode
execv:XPC_SERVICE_NAME=0
とはcom.apple.xpc.launchd.oneshot
?
macos - アプリ拡張機能のセキュリティ スコープ ブックマーク
アプリケーション ディレクトリの外部にあるユーザーが選択したフォルダーに関する情報を表示する TodayWidget アプリ拡張機能を作成しています。
私のメイン アプリケーションでは、NSOpenPanel 経由で powerbox を使用してフォルダーを選択できます。その後、セキュリティ スコープのブックマークを、TodayWidget からアクセスできるアプリ グループ コンテナーのユーザー デフォルトに保存できます。
TodayWidget はブックマーク データを読み取ることができますが、URLByResolvingBookmarkDataを呼び出すと、次のエラーが発生します。
The file couldn’t be opened because it isn’t in the correct format.
メイン アプリケーションと TodayWidget の両方に、以下の権限があります。
- com.apple.security.files.bookmarks.app-scope
- com.apple.security.files.user-selected.read-only
Apple のドキュメントによると、セキュリティ スコープのブックマークを作成したアプリケーションのみがそれを使用できます。これらは、組み込みアプリケーションが許可されていないことを意味していると思いますか?
私は XPC の使用を検討しましたが、XPC はセキュリティ スコープのブックマークも使用できず、通常のブックマークしか使用できないため、実際には問題の解決にはなりません。コンピュータが再起動されるとすぐに、XPC プロセスはディレクトリへのアクセスを失います。
本当に必要なのは、XPC プロセスがユーザー指定のディレクトリへの読み取りアクセスを取得する方法だけです。コンピューターを再起動するたびにメイン アプリケーションを再起動する必要がない方法はありますか?
core-data - XPC 接続はスレッド単位でどのように処理されますか?
XPC サービスと、ユーザーに表示される 2 つのアプリ (メニュー バー項目とメイン アプリ) があるとします。どちらも XPC サービスに接続します。
これらのアプリ コンポーネントの両方が「create Foo」メッセージを送信する場合、どのようにディスパッチされますか? 結局のところ単一のプロセスなので、それらは順番に到着するのでしょうか、それとも複数のキューが使用されるのでしょうか?
XPC サービスは Core Data を使用するため、グローバル キューを作成する必要があるか、または他の方法でスレッドの制限を確保する必要があるかどうかが心配です。