NSMachBootstrapServer已经被弃用,如何使用NSXPCConnection注册Mach服务?

4

我需要编写一个Mach服务,使得我的应用程序和系统插件都可以与之通信。我使用NSMachPort API创建一个新的端口,然后将其注册到NSMachBootstrapServer中:

- (void) run
{
    NSMachPort *serverPort = (NSMachPort *)[NSMachPort port];
    [serverPort setDelegate:self];
    [serverPort scheduleInRunLoop:NSRunLoop.currentRunLoop forMode:NSDefaultRunLoopMode];
    [NSMachBootstrapServer.sharedInstance registerPort:serverPort name:@"com.example.MyApp"];

    [NSRunLoop.currentRunLoop run];
}

Clang抱怨NSMachBootstrapServer已被弃用:

warning: 'NSMachBootstrapServer' is deprecated: first deprecated in macOS 10.13 - Use NSXPCConnection instead

如何使用NSXPCConnection来替代NSMachBootstrapServer的功能,在编写非XPC mach服务时?

1个回答

3

确实如此: NSMachBootstrapServer 类及其大多数伴随类在 macOS 10.13 High Sierra 中已被弃用

在 macOS 10.14 Mojave 及更高版本中,您必须使用 NSXPCConnection API,该API是 Foundation 模块的一部分。它在头文件 NSXPCConnection.h 中有描述。目前它由四个主要类组成:

下面是 XPC 连接过程的演示图:

enter image description here

正如图片所示,您需要实现一个监听器。

下面是一个带有监听器的 Swift 代码片段示例:

let listener = NSXPCListener(machServiceName: "Name-of-Sample.Helper")
listener.delegate = delegate
listener.resume()
RunLoop.current.run()

以下是带有监听器的Objective-C代码片段示例:

self.listener = [[NSXPCListener alloc] initWithMachServiceName:@"Name-of-Sample.Helper"];
self.listener.delegate = self;
[self.listener resume];
[[NSRunLoop currentRunLoop] run];

如果您查看此帖子,您将了解如何正确实现所有必要的XPC连接对象。
并且...
如果您查看此帖子,您还将了解如何与Mach服务一起使用它(这里有GitHub链接)。

这是为一个应用程序和服务吗?我想制作一个窗口化的应用程序,与另一个窗口化的应用程序进行通信。我该怎么做?如果需要,让我知道是否应该提出单独的问题。 - Just a coder
是的。请提出一个单独的问题。 - Andy Jazz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接