2014-04-21 1 views
4

SandboxedFetch 샘플 코드와 함께 Daemons and Service Guide - Creating XPC Services 자습서를 성공적으로 따라 갔으며 새로운 NSXPCConnection 클래스를 사용하는 작동중인 클라이언트/서비스 설정이 있습니다.MacOS XPC 서비스를 자체 종료하는 올바른 방법은 무엇입니까?

서비스 응용 프로그램이 끝나면 서비스 응용 프로그램을 올바르게 종료하는 방법이 아직 완전히 명확하지 않은 것입니다. 나는 많은 경우에 서비스가 살아남을 것으로 예상되지만 유스 케이스에서 유의할 점은 서비스가 메인 애플리케이션에서 달리 수행하지 않는 일부 처리에만 사용된다는 점입니다. 처리가 끝나면 서비스 응용 프로그램을 계속 사용할 이유가 없습니다. 클라이언트가 나중에 다른 서비스를 필요로하면, 새로운 서비스를 다시 만들 수 있습니다.

서비스가이 NSApplication, 내가하려고했던, 비 nibbed, 경량 applicationWillTerminate 내부에서 invalidate를 호출하여 스스로 종료 할 것입니다,하지만이 EXC_BAD_ACCESS 예외 거의 모든 시간을 트리거입니다. 서비스 [NSXPCListener serviceListener]에서 invalidate을 호출하면 안정적인 충돌이 약간 발생하지만 여전히 충돌합니다.

NSXPCConnection에서 클라이언트 응용 프로그램 내에서 invalidate을 호출하면 거의 항상 EXC_BAD_ACCESS 예외가 생성됩니다.

XPC 서비스를 완전히 종료 한 다음 서비스 응용 프로그램을 종료하는 것이 올바른 순서인지 궁금합니다. 이상적으로는 서비스가 클라이언트에 대한 마지막 XPC 호출을 한 후에 자체 종료됩니다.

첨부 된 작은 스택 샷은 예외 스택 트레이스의 모습입니다. (예, 서비스에로드되는 웹보기입니다. 웹보기가로드가 완료되면, 나는-종료 자체에 대한 서비스를 원하는)

enter image description here

+0

XPC 서비스를 시작 에이전트로 모델링 했습니까? 정규 XPC 서비스는 필요할 때 자동으로'launchd '를 사용하여 시작하고 중지해야합니다. – ctietze

+0

내가 사용하고 있던 XPC 서비스는 NSXPCConnection을 사용하여 시작된 인앱 XPC 서비스였습니다. 나는 궁극적으로 그 서비스조차도 명시 적으로 종결되는 것을 의미하지 않는다는 것을 깨달았다. 시스템은 유휴 상태 일 때 필요에 따라 종료합니다. – kennyc

+0

그래서 일생 일대의 관리에 대해 걱정하기를 멈췄으니 이제는 효과가 있습니까? – ctietze

답변

0

내 첫 반응은 당신이 종료 귀찮게하지해야한다는 것입니다. 메모리 부족이 발생하고 서비스가 유휴 상태이면 launchd가 서비스를 중지합니다. 아마 당신의 서비스가 다시 시작하는 데 시간이 걸릴 것이기 때문에 출구는 아마 누구에게도 가장 관심이 없습니다. 종료하지 마십시오. 시도가 실패하는 이유를 파악할 필요가 없습니다.

하지만 어떤 이유로 종료 결정을 내린 경우 너무 열심히 시도하지 마십시오. 청소 (버퍼 플러시, 네트워크 연결을 정상적으로 종료하여 서버가 문제가되지 않도록)를 수행하고 종료를 호출하기 만하면됩니다. NSApplication을 사용하는 것처럼 보일지라도, 서비스는 사용자가 신경 쓰는 어떤 의미에서도 응용 프로그램이 아니며 이와 관련하여 행동할만한 이유가 없습니다. 호스트 응용 프로그램은 어쨌든 귀하의 서비스 충돌에 대처할 수 있어야합니다. 따라서 고의로 종료하는 것은 고의로 종료됩니다.

그런데 XPC 서비스에서 NSApplication을 사용하는 것은 아마도 최선의 방법은 아닙니다. 왜냐하면 지원한다고 선언 할 수있는 지원 방법이 없기 때문입니다. 이것은이 단락이 충돌에 대한 적절한 분석으로 해석되어서는 안되지만, 왜 잘 작동하지 않는지 설명하는 데 도움이 될 수 있습니다. :-)

관련 문제