NSXPCConnection 调试 interruption/invalidation
NSXPCConnection debugging interruption/invalidation
我在 XCode 9,OSX 不是 iOS,Objective-C。
我有一个 XPC 服务可以与其他应用程序通信。
XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章 - 我仍然需要一些帮助。
// NSXPC Connection stored as ivar
self.bridgeagent = [[NSXPCConnection alloc] initWithServiceName:@"com.myid.myapp.bridgeagent"];
self.bridgeagent.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProtocol)];
self.bridgeagent.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProxyProtocol)];
self.bridgeagent.exportedObject = self;
[self.bridgeagent setInvalidationHandler:^{
NSLog(@"Bridgeagent invalidation handler!");
}];
[self.bridgeagent setInterruptionHandler:^{
NSLog(@"Bridgeagent interruption handler!");
}];
[self.bridgeagent resume];
服务是这样调用的:
// openFile method is listed in corresponding protocol
[[self.bridgeagent remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
NSLog(@"bridgeagent.openFile errorHandler: %@",error);
}] openFile:parameters withReply:^(NSDictionary *returnParameters) { // do something with result }];
通话正常,服务正常工作。但是 - 既然该服务有效,我想深入研究使其更加稳定(即使我现在没有遇到任何问题)。
谁能给我解释一下
- 中断和失效的区别(一个或另一个发生时不要理解)
- 如果有处理这两种情况的最佳实践
- 如何强制这两种情况(用于调试)
感谢您的帮助
问题 1 的答案:
[self.xpcConnection setInterruptionHandler:^{
// Connection interrupted. Backend (service) may have crashed.
// connection used to work but suddenly terminated
}];
[self.xpcConnection setInvalidationHandler:^{
// No one is listening. Is the backend running?
// connection cannot be established
}];
问题 3 的答案:
中断:使后端在事务中间退出(就在发送回复之前)
失效:根本不启动后端(服务)
问题 2 的答案:
我听说万一 "interruption" 您应该尝试重新建立连接。当您的服务是一个启动代理时,这会很有用,它会在崩溃时由 launchd 重新启动。
实际上,在我的程序中,我不会对这些情况采取行动,而只是向命令行发出警告消息。我的前端是一个 cli 程序。
或者,您可以将此警告记录在日志文件中,例如使用 syslog。参见 'man 3 syslog'。在我的应用程序中,我使用自己的日志文件和可配置的详细信息和系统日志。
亲切的问候,
罗伯特
我在 XCode 9,OSX 不是 iOS,Objective-C。
我有一个 XPC 服务可以与其他应用程序通信。 XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章 - 我仍然需要一些帮助。
// NSXPC Connection stored as ivar
self.bridgeagent = [[NSXPCConnection alloc] initWithServiceName:@"com.myid.myapp.bridgeagent"];
self.bridgeagent.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProtocol)];
self.bridgeagent.exportedInterface = [NSXPCInterface interfaceWithProtocol:@protocol(bridgeagentProxyProtocol)];
self.bridgeagent.exportedObject = self;
[self.bridgeagent setInvalidationHandler:^{
NSLog(@"Bridgeagent invalidation handler!");
}];
[self.bridgeagent setInterruptionHandler:^{
NSLog(@"Bridgeagent interruption handler!");
}];
[self.bridgeagent resume];
服务是这样调用的:
// openFile method is listed in corresponding protocol
[[self.bridgeagent remoteObjectProxyWithErrorHandler:^(NSError * _Nonnull error) {
NSLog(@"bridgeagent.openFile errorHandler: %@",error);
}] openFile:parameters withReply:^(NSDictionary *returnParameters) { // do something with result }];
通话正常,服务正常工作。但是 - 既然该服务有效,我想深入研究使其更加稳定(即使我现在没有遇到任何问题)。
谁能给我解释一下
- 中断和失效的区别(一个或另一个发生时不要理解)
- 如果有处理这两种情况的最佳实践
- 如何强制这两种情况(用于调试)
感谢您的帮助
问题 1 的答案:
[self.xpcConnection setInterruptionHandler:^{
// Connection interrupted. Backend (service) may have crashed.
// connection used to work but suddenly terminated
}];
[self.xpcConnection setInvalidationHandler:^{
// No one is listening. Is the backend running?
// connection cannot be established
}];
问题 3 的答案:
中断:使后端在事务中间退出(就在发送回复之前)
失效:根本不启动后端(服务)
问题 2 的答案:
我听说万一 "interruption" 您应该尝试重新建立连接。当您的服务是一个启动代理时,这会很有用,它会在崩溃时由 launchd 重新启动。
实际上,在我的程序中,我不会对这些情况采取行动,而只是向命令行发出警告消息。我的前端是一个 cli 程序。 或者,您可以将此警告记录在日志文件中,例如使用 syslog。参见 'man 3 syslog'。在我的应用程序中,我使用自己的日志文件和可配置的详细信息和系统日志。
亲切的问候,
罗伯特