2016-07-21 3 views
1

У меня есть настольное приложение Swift с одной службой XPC, которая перестала работать. Мне удалось заставить его работать с тех пор, но он снова разбился. Я попытался уменьшить код до простейшего случая, но похоже, что есть фактор, который я не понимаю.macOS XPC Сервис не начат

Init Код:

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. Есть идеи?

+0

Привет, я имею дело с аналогичной ситуацией, когда и мой клиент, и сервер являются быстрыми (сервер запускается как агент при запуске, а клиент - это просто исполняемый файл командной строки), и соединение не может быть установлено - я видел это, поскольку i реализовал 'invalidationHandler' в' NSXPCConnection' на стороне клиента. Возможно, вы можете предложить мне, как отладить эту проблему? Я не подписал ни одной из сторон, как вы думаете, это может быть проблема? есть ли какие-нибудь идентификаторы ошибок и понять причину проблемы? благодаря – Zohar81

ответ

0

Решено: очевидно, вы не можете иметь дополнительные функции в удаленном протоколе XPC. Снятие optional от UploadServiceProtocol зафиксировано.