XPC服務的啟動、監控和終止由launchd管理,比如崩潰恢復。當服務完成或空閑時,將由kill -9終止,kill-9可以更好地管理XPC服務的生命周期。
通過find/system/library/FrameWorks-name \ *搜索應用下的系統框架和XPC服務。XPC或查找/應用程序-名稱\*。xpc,我們可以發現xpc廣泛應用於系統框架、系統應用和第三方應用,比如Xcode、Chrome、CleanMyMac等等。但對於iOS,只能蘋果使用,第三方開發者不能使用(xcode中也沒有提供相應的模板)。
Apple提供了兩個API來處理xpc服務器:
下面將介紹使用上述接口創建XPC服務的典型情況。
XPC服務的典型應用是實現應用中組件之間的通信,以保證核心功能的穩定性。它的創建相對簡單。xcode已經提供了相應的模板,編譯後會直接添加到相應的應用包中。路徑為/contents/xpcsercies,其包結構與應用包類似,包括二進制程序、Info.plist文件和添加的資源文件。
Xcode默認以NSXPCConnection的形式創建服務模板。Info.plist中配置的XPCService字典ServiceType是Application,Info.plist還包含定義服務屬性和類型的其他字段,如下:
創建服務和偵聽連接典型用法如下:
xpc_main函數啟動服務並設置事件處理程序,其中事件處理程序XPCService_event_handler主要設置事件連接處理程序,xpc_connection_resume恢復連接;默認的連接處理隊列是DISPATCH_TARGET_QUEUE_DEFAULT,GCD處理隊列可以用xpc _ connection _ set _ TARGET _ QUEUE修改;Xpc_connect提供了同步或異步消息發送/接收接口,如下所示:
其中xpc _ connection _ send _ message _ with _ reply _ sync為同步接口,阻塞到收到回復消息,其余為異步接口;Xpc_connection_send_barrier可以在發送完最後壹條消息後設置執行塊,類似於dispatch fence接口。
消息發送實現如下圖所示:
其本質是通過mach_msg發送消息,即通過mach消息機制;
基於Objective-c的表單如下:
NSXPCConnection相關類提供了更高級的接口,通過NSX客戶端監聽服務連接,通過指定NSXPCListenerDelegate的代理方法處理新的連接請求:listener:shouldaceptnewconnection:NSXPCConnection屬性exportedInterface和exportedObject用於指定導出接口(由協議實現)和對象,用於對端服務進程分別通過指定的NSXPCConnection屬性remoteObjectInterface和remoteObjectProxy獲取遠程協議的導出接口和導出對象,從而實現本地調用
典型的界面如下:
主要流程如下:
創建的xpc_connection_t連接對象可以通過全局對象保存,用於為後續消息發送/接收相同的連接消息;
典型用法如下:
壹般流程如下:
通過initWithServiceName創建NSXPCConnection對象,通過interfaceWithProtocol指定約定的協議方法,resume啟動連接;當通過remoteObjectProxy對象調用xpc服務的方法時,launchd將在應用程序包中搜索匹配的xpc服務並啟動該服務,通過創建xpc服務的代理方法來接口連接,並執行導出接口方法。
與其他進程間通信方式相比,如ns distributed Notification Center、Mach Port、domain socket等。,XPC服務更輕便,不需要管理子流程的生命周期,可以實現子流程的恢復功能。通過NSXPCConnection相關的高級接口可以方便的實現遠程過程調用,更加簡潔易用。
XPC
XPC簡介
XPC API
創建XPC服務
守護程序和服務編程指南
介紹XPC
用XPC實現多進程間的通信
“了解麥克·OS X &;IOS操作系統”
進程間通信(OSX/iOS)