NSXPCConnection 调试中断/失效

Posted

技术标签:

【中文标题】NSXPCConnection 调试中断/失效【英文标题】:NSXPCConnection debugging interruption/invalidation 【发布时间】:2017-11-21 17:16:58 【问题描述】:

我使用的是 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】:

问题 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 的答案:

我听说万一“中断”,您应该尝试重新建立连接。当您的服务是一个启动代理时,这会很有用,它会被 launchd 重新启动以防崩溃。

实际上,在我的程序中,我不会对这些情况采取行动,而只是向命令行发出警告消息。我的前端是一个 cli 程序。 或者,您可以将此警告记录在日志文件中,例如使用 syslog。请参阅“人 3 系统日志”。在我的应用程序中,我使用自己的日志文件和可配置的详细程度和系统日志。

亲切的问候,

罗伯特

【讨论】:

以上是关于NSXPCConnection 调试中断/失效的主要内容,如果未能解决你的问题,请参考以下文章

当 launchd 终止进程时是不是调用 XPC 中断处理程序?

NSXPCConnection 或 XPCKit

将套接字与 NSXPCConnection 一起使用

混合 NSXPCConnection 和 xpc C API

使用 NSXPCConnection 时如何同步等待回复块

从 XPC 服务创建 NSXPCConnection