2014-03-28 3 views
3

서브 프로세스를 생성하는 응용 프로그램이 있습니다. 이러한 하위 프로세스에는 동일한 응용 프로그램 번들에있는 XPCServices가 필요합니다. 이 my.app/Contents/MacOS/my하위 프로세스가 도크에서 튀는 것을 방지하려면 어떻게해야합니까?

내 XPC 서비스가

하위 프로세스가 my.app/Contents/Resources/mysubprocess에있는 my.app/Contents/XPCServices/com.my.service.xpc에 앉아, 그리고 응용 프로그램이 시작되고에서

내 주요 응용 프로그램이 실행 파일을 가지고, 내 서브 프로세스는 XPC에 연결할 수 없습니다 서비스 (왜 안 되니?)하지만 Dock에는 나타나지 않습니다.

반면에 하위 프로세스가 my.app/Contents/MacOS/mysubprocess이면 하위 프로세스가 내 XPC 서비스에 성공적으로 연결됩니다 (주 응용 프로그램은이 XPC 서비스에서 아무 것도 필요 없습니다). 하위 프로세스가 갑자기 독에 자체 수신 거부 아이콘을 가져옵니다. OS X은 무언가가 *.app/Contents/MacOS/*에서 시작되면이를 감지하여 응용 프로그램으로 간주합니다.

분명히 그렇게하면 서브 프로세스가 XPC 서비스에 연결할 수 있지만 서브 프로세스는 숨겨져 있고 Dock에는 나타나지 않습니다. 내가 LSUIElement 및 LSBackgroundOnly 내 사용자 기본값으로 등록 시도했는데 트릭을하지 않았다. 내가 LSUIElement 사용자 기본값으로 작성하는 경우, 내 응용 프로그램은 바람직하지 않은 주 메뉴를 얻을하지 않습니다 (하지만 LSUIElement의 경우에는 NO이 절대적으로 올바른 동작 임).

기본적으로 두 가지 질문이 있습니다. 서브 프로세스 바이너리를 my.app/Contents/MacOS/ 외부로 이동할 때 XPCServices를 찾을 수 없습니다. 하위 프로세스가 my.app/Contents/Resources/ 인 경우 서비스에 대한 상대적 경로가 동일하게 유지되므로 다소 이상하게 보입니다. 또한 내 하위 프로세스를 디버깅하는 동안 [NSBundle mainBundle]을 확인했으며 올바른 경로를 가지고 있는데 심지어 Resources 폴더에 있었던 경우에도 마찬가지입니다. 어떻게하면 XPC 서비스를 찾아야하는지 내 하위 프로세스에 알릴 수있는 방법이 있습니까?

다른 접근법은 Dock에서 수신 거부의 하위 프로세스를 방지 할 수 있다는 것입니다. 내 주요 응용 프로그램에는 아이콘과 메뉴가 필요합니다. 그렇다면 서브 프로세스가 my.app/Contents/MacOS/ 폴더에 있더라도 Dock 아이콘을 실행하지 않도록 런타임에 지정하는 방법이 있습니까?

애플 개발자 문서에 따르면 당신에게

답변

2

감사, 당신이 개발자가 My.app/Contents/XPC Services에서 앱의 번들에 있어야 쓸 수있는 XPC 서비스를 제공합니다. 앱은 거기에있는 XPC 서비스에만 연결할 수 있으며 해당 XPC 서비스는 해당 번들이있는 앱에서 연결할 수 있습니다.

(Apple에서 제공하는 시스템 프레임 워크의 XPC 서비스는 조금 다르게 작동합니다. /System/Library/PrivateFrameworks/WebKit2.framework에는 WebKit2 프레임 워크를 사용하는 모든 프로세스에서 사용하는 XPC 서비스가 포함되어 있지만 프레임 워크는 응용 프로그램 자체가 아니라 해당 XPC 서비스에 연결됩니다.

서브 프로세스의 바이너리가 My.app/Contents/MacOS/이 아닌 경우 XPC 서비스. 확실하지는 않지만, MacOS에있는 임의의 바이너리에서 XPC 서비스에 연결할 수 있다는 것은 거의 버그처럼 들린다. 하지만 XPC 서비스는 코드 서명이 정상이고 MacOS 디렉토리에 임의의 바이너리를 배치하면 해당 코드 서명이 손상 될 수 있기 때문에 이것이 아니라고 생각합니다.

도크 아이콘 : 어떻게 하위 프로세스를 생성합니까? NSTask 사용하기? 일반 앱 자체가 XPC 서비스를 사용합니까?그렇지 않은 경우 하위 프로세스가 앱 자체가 아닌 이유가 있습니까? 그렇게하면 XPC 서비스가 서브 프로세스 '/Contents/XPC Services 디렉토리 안에있을 수 있으며 모든 것이 정상적으로 작동합니다.

편집 : 마음에 떠오르는 또 다른 해결책 : XPC를 사용하지 말고 Distributed Objects을 통해 하위 프로세스와 대화하는 별도의 프로세스. 특수 폴더 구조가 필요 없기 때문에 원하는 모든 보조 바이너리를 배치 할 수 있으므로 Dock 아이콘 수신 거부 문제를 피할 수 있습니다.

+0

분산 객체가 트릭을 수행했습니다. 고맙습니다. –

관련 문제