macOS.XPC

XPC 是 macOS 里经常用到的进程间通信机制。本文不关注 XPC 的内部机制,而是一篇教你如何上手 XPC 的文章。

  1. 创建 macOS 工程 'FRTestXPC',选择 Cocoa App Template。

  2. 在工程 'FRTestXPC' 里点击增加 Target,在弹出框搜索 XPC, 选择搜索结果中的 XPC Service,然后命名 Target 为 'FRTestXPC_Helper' 并将 target 对应的 info.plist 文件中 bundle id 修改为 'com.frank.xpchelper'

  3. 选择 'FRTestXPC' Target -> Build Phases 然后新增 CopyFiles 项目,将刚刚的 FRTestXPC_Helper.xpc 加进去,注意 Destination 必须要选择 XPC Services。否则后续主程序和 XPC 会无法建立连接。

  4. 回过头来看工程目录里 FRTestXPC_Helper -> main.m 文件,这里 main 函数是 XPC 程序的入口函数。可以看到 Xcode 已经帮助生成很多 demo code。我们已经不需要做太多。

  5. 在主程序的窗口里增加一个 button,在点击方法里实现如下代码

    • NSXPCConnection *con = [[NSXPCConnection alloc] initWithServiceName:@"com.frank.xpchelper"];
      NSXPCInterface *remoteInterface = [NSXPCInterface interfaceWithProtocol:@protocol(FRTestXPC_HelperProtocol)];
      con.remoteObjectInterface = remoteInterface;
      [[con remoteObjectProxy]  upperCaseString:@"hello" withReply:^(NSString *reply) {
         NSLog(@"reply = %@",reply);
          }];
      [con resume];
      
  6. 启动程序,点击 button,观察终端输出为 HELLO

一些说明

  1. Tips :作为 demo 可以删除掉 Project 里的各种 Test Target 和 Test 文件,保持工程清爽直观。
  2. 我用的是 Xcode9.1版本,创建好的 XPC 中的代码完全为 Xcode 自动生成的,(void)upperCaseString:(NSString *)aString withReply:(void (^)(NSString *))reply;这个协议也是 Xcode 生成的,所以看上面代码不要太突兀,你自己试试就知道了。
  3. 初始化主程序 NSXPCConnection 的时候必须写正确 XPC 的 service name.

一些 QA

Q: 什么场景下会用到 XPC? 具体到项目中说一下。

A: 我觉得用到 XPC 的地方主要还是希望让别的进程分担自己的任务,同时又能够及时的和主进程进行通信。(比如一些网络处理的服务)

  • #Offcial Note# Apple WWDC 的讲解也是这么说的 So if you just have some background piece of work that needs to happen every so often, you can use XPC to talk to it, initiate it, and get it running.

​ 其次是考虑一些其他因素,比如

  • 增加程序稳定性(XPC Service crash 但主程序不 crash).
  • XPC 服务处理一些不够安全的东西,这时候我们不提供 XPC 任何权限,比如网络访问,文件访问等,但是主程序还是保留所有的权限。
    • #Fan's Note# 相当于让小弟干活儿,但是不给小弟太多权利,干的了就干,干不了就别干…..
  • 很重要一点:是这是 App Store 允许的多进程的方式。

Q: XPC 服务有界面吗?

A: 一般都是后台进程。没见过有人用 XPC 搭建界面的。

Q: 系统是怎么通过以下这些 API 方法找到 XPC 服务的 ?

  • NSXPCInterface *myCookieInterface = [NSXPCInterfaceinterfaceWithProtocol:@protocol(XPC_HelperProtocol)];
    NSXPCConnection *myConnection = [[NSXPCConnection alloc]  initWithServiceName:@"com.frank.xpchelper"];
    

A: 当 app 启动的时候,系统自动注册 app 中可见的 XPC 服务,当 app 与某个 XPC 服务建立连接,然后向他发送包含事件服务的消息。

​ When the app is launched, the system automatically registers each XPC service it finds into the namespace visible to the app. An app establishes a connection with one of its XPC services and sends it messages containing events that the service then handles

一个 Demo

以上的 demo 是最简单的,一般 XPC 用来做后台下载处理比较合适,所以写了一个比上面代码复杂一点点(不过还是很简单)的 demo 放到 github 上,这个 demo 是 XPC 双向同步的。即 XPC Service 可以不依赖于代理方法的回调而是直接给 Client app 发送消息。

NSXPCConnection 是最主要的 API,其余的 API 比如 NSXPCInterface,都是依附于 Connection。构建双向通信的 XPC Demo 在 ClientApp 和 XPC 里有一些代码非常相似。即互相暴露接口,互相暴露交接的对象。Demo 也提供了一些非常实用的构建 XPC 时用的 API。

Demo 地址: https://github.com/fanxiushan/Demo.XPCTestDemo

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容