NSXPCConnection
的interruptionHandler
块的文档状态:
在远程进程退出或崩溃时调用的中断处理程序。
但是,守护程序和服务编程指南指出:
XPC服务由launchd管理,launchd根据需要启动它们,在它们崩溃时重新启动它们,并在它们空闲时终止它们(通过发送SIGKILL)。这对于使用服务的应用程序是透明的,除非服务在处理需要响应的消息时崩溃。在这种情况下,应用程序可以看到它的XPC连接已经失效,直到launchd 重新启动服务
如果XPC进程因空闲而被终止,我的interruptionHandler
中会得到回调吗?还是只有当应用程序在处理消息时崩溃时,我才会得到回调?我这么问是因为这个测试用例似乎不可能模拟。不幸的是,XPC服务生命周期是一个非常黑的盒子。
是的,如果launchd停止空闲服务,将调用中断处理程序。
这可以通过利用launchd对内存压力的自然反应来模拟:停止所有空闲的launchd启动的服务来帮助缓解问题。
模拟的内存压力警告级别应该足够了,以下是您的操作方法:
sudo memory_pressure -S -l warn
对于关键:
sudo memory_pressure -S -l critical
在测试XPC服务时,经常会忽略此条件。但是,建议将XPC服务设计为无状态的,因此在大多数情况下,您的服务是否已停止,并可以在下次发送消息时通过launchd重新启动,这应该无关紧要。理想情况下,当你最后一次使用它时,你会使连接无效
如果存在正在进行的XPC事务(读取:正在处理消息和/或尚未调用回复块),Launchd将不会停止具有上述条件的XPC服务。