macOS.XPC

XPC 是 macOS 里經(jīng)常用到的進(jìn)程間通信機(jī)制眯杏。本文不關(guān)注 XPC 的內(nèi)部機(jī)制,而是一篇教你如何上手 XPC 的文章壳澳。

  1. 創(chuàng)建 macOS 工程 'FRTestXPC'岂贩,選擇 Cocoa App Template。

  2. 在工程 'FRTestXPC' 里點(diǎn)擊增加 Target巷波,在彈出框搜索 XPC, 選擇搜索結(jié)果中的 XPC Service萎津,然后命名 Target 為 'FRTestXPC_Helper' 并將 target 對(duì)應(yīng)的 info.plist 文件中 bundle id 修改為 'com.frank.xpchelper'

  3. 選擇 'FRTestXPC' Target -> Build Phases 然后新增 CopyFiles 項(xiàng)目,將剛剛的 FRTestXPC_Helper.xpc 加進(jìn)去抹镊,注意 Destination 必須要選擇 XPC Services锉屈。否則后續(xù)主程序和 XPC 會(huì)無法建立連接。

  4. 回過頭來看工程目錄里 FRTestXPC_Helper -> main.m 文件垮耳,這里 main 函數(shù)是 XPC 程序的入口函數(shù)颈渊。可以看到 Xcode 已經(jīng)幫助生成很多 demo code终佛。我們已經(jīng)不需要做太多俊嗽。

  5. 在主程序的窗口里增加一個(gè) button,在點(diǎn)擊方法里實(shí)現(xiàn)如下代碼

    • 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. 啟動(dòng)程序,點(diǎn)擊 button查蓉,觀察終端輸出為 HELLO

一些說明

  1. Tips :作為 demo 可以刪除掉 Project 里的各種 Test Target 和 Test 文件乌询,保持工程清爽直觀。
  2. 我用的是 Xcode9.1版本豌研,創(chuàng)建好的 XPC 中的代碼完全為 Xcode 自動(dòng)生成的妹田,(void)upperCaseString:(NSString *)aString withReply:(void (^)(NSString *))reply;這個(gè)協(xié)議也是 Xcode 生成的,所以看上面代碼不要太突兀鹃共,你自己試試就知道了鬼佣。
  3. 初始化主程序 NSXPCConnection 的時(shí)候必須寫正確 XPC 的 service name.

一些 QA

Q: 什么場(chǎng)景下會(huì)用到 XPC? 具體到項(xiàng)目中說一下。

A: 我覺得用到 XPC 的地方主要還是希望讓別的進(jìn)程分擔(dān)自己的任務(wù)霜浴,同時(shí)又能夠及時(shí)的和主進(jìn)程進(jìn)行通信晶衷。(比如一些網(wǎng)絡(luò)處理的服務(wù))

  • #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.

? 其次是考慮一些其他因素,比如

  • 增加程序穩(wěn)定性(XPC Service crash 但主程序不 crash).
  • XPC 服務(wù)處理一些不夠安全的東西阴孟,這時(shí)候我們不提供 XPC 任何權(quán)限晌纫,比如網(wǎng)絡(luò)訪問,文件訪問等永丝,但是主程序還是保留所有的權(quán)限锹漱。
    • #Fan's Note# 相當(dāng)于讓小弟干活兒,但是不給小弟太多權(quán)利慕嚷,干的了就干哥牍,干不了就別干…..
  • 很重要一點(diǎn):是這是 App Store 允許的多進(jìn)程的方式毕泌。

Q: XPC 服務(wù)有界面嗎?

A: 一般都是后臺(tái)進(jìn)程。沒見過有人用 XPC 搭建界面的嗅辣。

Q: 系統(tǒng)是怎么通過以下這些 API 方法找到 XPC 服務(wù)的 撼泛?

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

A: 當(dāng) app 啟動(dòng)的時(shí)候,系統(tǒng)自動(dòng)注冊(cè) app 中可見的 XPC 服務(wù)澡谭,當(dāng) app 與某個(gè) XPC 服務(wù)建立連接愿题,然后向他發(fā)送包含事件服務(wù)的消息。

? 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

一個(gè) Demo

以上的 demo 是最簡(jiǎn)單的译暂,一般 XPC 用來做后臺(tái)下載處理比較合適抠忘,所以寫了一個(gè)比上面代碼復(fù)雜一點(diǎn)點(diǎn)(不過還是很簡(jiǎn)單)的 demo 放到 github 上,這個(gè) demo 是 XPC 雙向同步的外永。即 XPC Service 可以不依賴于代理方法的回調(diào)而是直接給 Client app 發(fā)送消息崎脉。

NSXPCConnection 是最主要的 API,其余的 API 比如 NSXPCInterface伯顶,都是依附于 Connection囚灼。構(gòu)建雙向通信的 XPC Demo 在 ClientApp 和 XPC 里有一些代碼非常相似。即互相暴露接口祭衩,互相暴露交接的對(duì)象灶体。Demo 也提供了一些非常實(shí)用的構(gòu)建 XPC 時(shí)用的 API。

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

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掐暮,一起剝皮案震驚了整個(gè)濱河市蝎抽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌路克,老刑警劉巖樟结,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異精算,居然都是意外死亡瓢宦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門灰羽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驮履,“玉大人,你說我怎么就攤上這事廉嚼∶蹈洌” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵怠噪,是天一觀的道長(zhǎng)摘悴。 經(jīng)常有香客問我,道長(zhǎng)舰绘,這世上最難降的妖魔是什么蹂喻? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮捂寿,結(jié)果婚禮上口四,老公的妹妹穿的比我還像新娘。我一直安慰自己秦陋,他們只是感情好蔓彩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驳概,像睡著了一般赤嚼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顺又,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天更卒,我揣著相機(jī)與錄音,去河邊找鬼稚照。 笑死蹂空,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的果录。 我是一名探鬼主播上枕,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼弱恒!你這毒婦竟也來了辨萍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤返弹,失蹤者是張志新(化名)和其女友劉穎锈玉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉苇,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘲玫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了并扇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片去团。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖穷蛹,靈堂內(nèi)的尸體忽然破棺而出土陪,到底是詐尸還是另有隱情,我是刑警寧澤肴熏,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布鬼雀,位于F島的核電站,受9級(jí)特大地震影響蛙吏,放射性物質(zhì)發(fā)生泄漏源哩。R本人自食惡果不足惜鞋吉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望励烦。 院中可真熱鬧谓着,春花似錦、人聲如沸坛掠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屉栓。三九已至舷蒲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間友多,已是汗流浹背牲平。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夷陋,地道東北人欠拾。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骗绕,于是被迫代替她去往敵國(guó)和親藐窄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理酬土,服務(wù)發(fā)現(xiàn)荆忍,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對(duì)象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,310評(píng)論 0 18
  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的閱讀 13,478評(píng)論 5 6
  • 他丟出一枚硬幣撤缴, 他的信仰沒有光環(huán)刹枉, 他在雨夜里彷徨 不敢承認(rèn)。 人群聚了又散屈呕, 剩他一人昏昏沉沉微宝, 借的誰(shuí)的故事...
    汀白白閱讀 266評(píng)論 0 3