macOS跨进程通信: XPC 创建实例

news2025/5/25 21:19:38

一:简介

XPCmacOS 里苹果官方比较推荐和安全的的进程间通信机制。
集成流程简单,但是比较绕。

  • 主要需要集成 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 的方式进行互相调用,解耦。

在这里插入图片描述

  • 下面demo app的数据流向

请添加图片描述

二:创建流程

  1. 创建主进程UI app
    在这里插入图片描述
  2. 配置ui app的名字为 XpcApp.
    在这里插入图片描述
  3. 按照步骤给 app 以添加target 的方式添加xpc 模块。
    在这里插入图片描述
  4. 创建Xpc server 的名字为: XpcServer,
    api 选择OC 接口的api,而不是C接口的版本
    最后一项内嵌到UI APP中,最终运行打包后,会在XpcApp.app/Contents/XPCServices/XpcServer.xpc路径里面找到它。
    在这里插入图片描述
  5. 最终的项目架构如下,
    XpcApp 包含两个文件夹,分别为 UI和xpcserver的文件夹,
    对应两个target。
    在这里插入图片描述

三:demo 运行

  1. 由于XpcServer里面官方已经给了demo 足够运行的代码,我们可以不用添加任何代码就可以运行。
    我们在XpcServer.m 里面添加个 log 作为调试输出就行。
    这里只加了一句log输出,会在server 收到 ui app 传递来的消息的时候打印,并将收到的两个数字相加后返回。
// 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));
}
  1. 配置UI App 文件。
    这里的代码调用方法可以参考XCode自动生成的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

  1. 在storyboard 中添加个button,绑定到上面的 - (IBAction)sendMsgClick:(id)sender方法中。
  2. 运行
    点击button 后,关注 app的控制台
    在这里插入图片描述
    xpc server 的控制台
    在这里插入图片描述
    两个进程都有打印消息,说明通讯成功。

四:备注

  1. demo中传递消息用的protocol里面的方法(performCalculationWithNumber: andNumber: withReply:)只是官方默认提供的,根据实际需要也可以添加其他方法,比如传递字符串,json等。
  2. 自己的xpc server 是内嵌到 app 包里的,默认只能有自己的app包的主程序进行调用,如果需要让其他app 进行通信调用,需要创建 launchd.plist 然后拷贝到系统路径下的.../LaunchDaemons文件夹。
    具体可以参考 man launchd.plist
  3. 两个进程都可以互相主动发消息的,只是demo没有添加对应的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1355743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql忘记密码的三种解决方案

1、修改密码的三种方式 mysql用户分为root用户(超级管理员,拥有所有权限)和普通用户,mysql服务器通过权限表来控制用户对数据库的访问,这些权限表存于root用户下的mysql数据库中。 在使用mysql数据库过程中,往往需要…

DevOps(6)

目录 26.如何在Linux下跨不同的虚拟桌面共享程序? 27.无名(空)目录代表什么? 29.什么是守护进程? 30.如何从一个桌面环境切换到另一个桌面环境,例如从KDE切换到Gnome? 26.如何在Linux下跨不同的虚拟桌面…

excel中找出重复项,并标红

一、查找重复值 二、清除格式 还是通过添加规则的路径,清除格式,直接通过格式刷,刷不掉。

服务器为什么大多用 Linux?

服务器为什么大多用 Linux? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!&#…

AntDB内存管理之内存上下文

1. 主题说明 AntDB的内存管理在开发时,使用了内存上下文机制来实现内存管理。本文就从AntDB的内存上下文机制出发,解析内存上下文的实现原理。AntDB的代码中,涉及到内存的处理时,经常会看到下面这样的代码。 图1:切换…

msyql迁移到人大金仓数据库

1,点击数据迁移工具 2,在浏览器上输入http://localhost:54523,默认账号和密码为kingbase,kingbase,进入之后,就是项目的页面 3,数据库管理 添加源数据库,点击确定就可以了,也可以测…

鸿蒙问题之本地模拟器无法识别

今天按例打开本地模拟器,发现DevEco Studio不能检测到我的本地模拟器了。 重启了DevEco Studio和模拟器多次都无果。果断删除模拟器 然后创建一个新的,就可以成功检测到了。这应该是idea的一个bug

反编译会遇到哪些难题

反编译是把已编译的程序代码还原成源代码的过程,是软件逆向工程中重要的一环。反编译可以帮助开发者快速理解和修改已有的程序,也可以帮助安全专家发现程序中的漏洞。但是反编译也存在许多挑战和难题。下面简单的从几个方面了解一下反编译会遇到的难题。…

【Nodejs】基于Promise异步处理的博客demo代码实现

目录 package.json www.js db.js app.js routes/blog.js controllers/blog.js mysql.js responseModel.js 无开发,不安全。 这个demo项目实现了用Promise异步处理http的GET和POST请求,通过mysql的api实现了博客增删改查功能,但因没有…

VR云游开启智慧旅游新纪元,打造“云旅游”新模式

元旦假期,全国文化和旅游市场平稳有序,家人和亲友的出游趋势稳步增加,演唱会、音乐节、跨年等活动的叠加让元旦出游更加吸引游客。在冰雪旅游热度持续攀升的时候,许多年轻群体已经开始使用VR云游进行智慧景区旅游,身临…

作业--day41

利用模板类完成顺序表 #include <iostream>using namespace std;//模板类 template <typename T> class SeqTab{T arr[20];int maxsize; public:SeqTab():maxsize(0){}void Insert(T a);void Search(T a);void Delete(int index);void Show(); };//尾插 template …

bullet3 三种碰撞检测及实现

Bullet 物理引擎是一个专业的开放源码的碰撞检测&#xff0c;刚体和柔体动力学库。Bullet 物理引擎目标是实时和交互使用在游戏&#xff0c;电影和机器人的视觉效果。自由zlib授权的商业使用库。 bullet3的三种碰撞检测 以下三种方式都是可以达到碰撞检测的效果&#xff1a; …

新能源汽车@2023/24:卷价格、拼智能与生态战

【潮汐商业评论/原创】 2023年末尾&#xff0c;受到大众广泛热议的小米汽车发布会“姗姗来迟”&#xff0c;也为“乱战”中的2023新能源汽车市场画上了一个句号。 然而&#xff0c;在雷军整整三个小时看似平和的演讲与技术讲解中&#xff0c;实则在电机、智驾、智舱等核心技术…

多元线性回归案例--客户价值模型

文章目录 step 1&#xff1a;读取数据step 2&#xff1a;搭建模型step 3&#xff1a;构造回归方程step 4&#xff1a;评估模型 利用多元线性回归模型可以根据多个因素来预测客户价值&#xff0c;当模型搭建完成后&#xff0c;便可对不同价值的客户采用不同的业务策略。 这里以信…

C#高级语法 Attribute特性详解和类型,方法,变量附加特性讲解

文章目录 前言相关资料Attribute特性个人原理理解特性的声明与使用类型特性运行结果&#xff1a; 找到类的Attribute属性方法特性和变量特性代码封装测试类TestService1TestService2TestService3 测试代码运行结果 对封装的代码进行优化封装代码测试代码运行结果&#xff08;和…

雾天条件下 SLS 融合网络的三维目标检测

论文地址&#xff1a;3D Object Detection with SLS-Fusion Network in Foggy Weather Conditions 论文代码&#xff1a;https://github.com/maiminh1996/SLS-Fusion 论文摘要 摄像头或激光雷达&#xff08;光检测和测距&#xff09;等传感器的作用对于自动驾驶汽车的环境意识…

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…

在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c库&#xff0c;为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装&#xff0c;不料博主才边缘好自己的paddle2.6&#xff0c;paddle官方已经发布了cuda12.0的paddle2.6框架。…

嵌入式MCU:如何安装codeWarrior 和Jlink

先安装codeWarrior 15.0版本,这个官网上没有这个版本要去blazar的这个网站上下载: Blazar-α系统电路图纸(MOOC课程对应)(Updating)-Blazar开源硬件与MOOC codeWarrior 安装不要安装在中文路径里面 安装完了codeWarrior 再安装Jlink 然后再装Jlink 这个也是从上面的…

Android 内容生成pdf文件

1.引入itext7 implementation com.itextpdf:itext7-core:7.1.13上面比较大&#xff0c;可以直接下载需要集成的jar包 implementation files(libs\\layout-7.1.13.jar) implementation files(libs\\kernel-7.1.13.jar) implementation files(libs\\io-7.1.13.jar) implementatio…