macOS XPC 服务未启动

Posted

技术标签:

【中文标题】macOS XPC 服务未启动【英文标题】:macOS XPC Service not starting 【发布时间】:2016-07-21 00:41:01 【问题描述】:

我有一个桌面 Swift 应用程序,其中包含一个停止工作的 XPC 服务。从那以后,我设法让它工作了一次,但它又被打破了。我尝试将代码简化为最简单的情况,但感觉有一个我不明白的因素。

初始化代码:

connection = NSXPCConnection(serviceName: XPCBundleID)
connection.remoteObjectInterface = NSXPCInterface(withProtocol:UploadServiceProtocol.self)
connection.resume()

测试功能:

func initService()
    let uploaderRemoteObject = connection.remoteObjectProxyWithErrorHandler() 
    (error) in NSLog("UploadServiceClient - remote proxy error: %@", error)
     as! UploadServiceProtocol
    uploaderRemoteObject.initService?(nil)  (data) in
        NSLog("UploadServiceClient - initService - Got \(data?.length) bytes.")
    


如果我打印 uploaderRemoteObject 我得到 <_NSXPCDistantObjectWithError: 0x618000083980> 这可能是正常的,但实际的 XPC 进程永远不会启动(当然也不会调用远程方法)。

服务协议是:

@objc(UploadServiceProtocol) protocol UploadServiceProtocol 
optional func initService(action:String?, withReply: (NSData?)->Void )

XPC main.swift 的内容是:

class ServiceDelegate: NSObject, NSXPCListenerDelegate 
    func listener(listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool 
        newConnection.exportedInterface = NSXPCInterface(withProtocol: UploadServiceProtocol.self)
        newConnection.exportedObject = ImageUploader()
        newConnection.resume()
        return true
    

let delegate = ServiceDelegate()
let listener = NSXPCListener.serviceListener()
listener.delegate = delegate;
listener.resume()

请注意,我确信 XPCBundleID 是正确的,并且我正在为 Mac App Store 签署所有内容。有什么想法吗?

【问题讨论】:

嗨,我正在处理类似的情况,我的客户端和服务器都很迅速(服务器通过 launchd 作为代理运行,客户端只是一个提示的命令行可执行文件)并且无法建立连接 -我看到了这一点,因为我在客户端的NSXPCConnection 中实现了invalidationHandler。也许你可以建议我如何调试这个问题?我没有签署任何一方,你认为这可能是一个问题吗?有什么可以获取错误 ID 并了解问题的根本原因吗?谢谢 【参考方案1】:

已解决:显然您不能在 XPC 远程协议中使用可选功能。从UploadServiceProtocol 中删除optional 修复了它。

【讨论】:

以上是关于macOS XPC 服务未启动的主要内容,如果未能解决你的问题,请参考以下文章

非常简单的 macOS XPC

XPC 服务未从 Xcode 源代码编辑器扩展启动(`仍然很忙`)

macOS:在用户退出主应用程序后保持 XPC 服务(捆绑)运行

哪个处理程序在 macos xpc 中处理来自服务器的回复

如何在macOS上使用MTLSharedTextureHandle或MTLSharedEventHandle与C XPC接口?

XPC 服务:提高工作线程上的堆栈大小