赞
踩
XPC
是 macOS
里苹果官方比较推荐和安全的的进程间通信机制。
集成流程简单,但是比较绕。
主要需要集成 XPC Server
这个模块,这个模块最终会被 apple
的根进程 launchd
管理和以独立进程的方法唤起和关闭, 我们主app 进程并不需要管理这个进程的生命周期。
特点:主要做权限分离和错误隔离使用,使用独立进程的方法,可以避免独立进程crash
影响到主进程, 而且独立进程可以和主进程赋予不同的权限,比如是否沙盒,是否有网络权限等。
find /System/Library/Frameworks -name \*.xpc
命令可以查看系统使用的xpc服务。
下面一张官方图,说明了对应的关系。
UI App
作为 client
端,只要去监听对应的XPC 服务, launchd
就会拉起对应的 XPC Server
XPC Server
作为 服务端,提供xpc服务,并接受client的消息。
两者之间通过protocol
的方式进行互相调用,解耦。
XpcServer
,XpcApp.app/Contents/XPCServices/XpcServer.xpc
路径里面找到它。XpcServer.m
里面添加个 log 作为调试输出就行。// This implements the example protocol. Replace the body of this class with the implementation of this service's protocol.
- (void)performCalculationWithNumber:(NSNumber *)firstNumber andNumber:(NSNumber *)secondNumber withReply:(void (^)(NSNumber *))reply {
NSInteger result = firstNumber.integerValue + secondNumber.integerValue;
NSLog(@"server 收到 UI Clicent App的两个数字: %@, %@", firstNumber, secondNumber);
reply(@(result));
}
XpcServerProtocol.h
文件里面的注释,里面说明了怎么在Client 端发送消息。ViewController.m
中,替换成如下代码:#import "ViewController.h" #import "XpcServerProtocol.h" #import "XpcServer.h" @interface ViewController () @property (nonatomic, strong) NSXPCConnection *xpcConnect; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.xpcConnect = [[NSXPCConnection alloc] initWithServiceName:@"com.jimbo.xpc.XpcServer"]; NSXPCInterface *interface = [NSXPCInterface interfaceWithProtocol:@protocol(XpcServerProtocol)]; self.xpcConnect.remoteObjectInterface = interface; [self.xpcConnect resume]; } - (IBAction)sendMsgClick:(id)sender { NSLog(@"ui app 发送数字 231, 119"); [[self.xpcConnect remoteObjectProxy] performCalculationWithNumber:@231 andNumber:@119 withReply:^(NSNumber *reply) { // We have received a response. NSLog(@"ui 收到了 xpc server 返回的数字: %@", reply); }]; } - (void)dealloc { [self.xpcConnect invalidate]; } @end
- (IBAction)sendMsgClick:(id)sender
方法中。(performCalculationWithNumber: andNumber: withReply:)
只是官方默认提供的,根据实际需要也可以添加其他方法,比如传递字符串,json等。launchd.plist
然后拷贝到系统路径下的.../LaunchDaemons
文件夹。man launchd.plist
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。