SMJobBless
을 사용하는 Swift macOS 앱을 생성하여 에스컬레이션 된 권한을 가진 도우미를 만듭니다. 이것은 잘 작동하는데 도우미는 /Library/Privileged Helper Tools
에 설치되고 동반 LaunchDaemon은 /Library/LaunchDaemons
에 생성됩니다. 그러나 도우미는 성공적으로 시작할 수 없습니다. 대신 "Illegal instruction : 4"메시지와 충돌합니다.잘못된 명령 오류로 Swift Privileged Helper (XPC Listener)가 깨졌습니다.
NSXPCListenerDelegate
프로토콜을 구현하여 XML 연결에 응답하는 도우미를 준비했습니다.
import Foundation
class HelperDelegate: NSObject, NSXPCListenerDelegate {
func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
newConnection.exportedInterface = NSXPCInterface(with: HelperToolProtocol.self)
newConnection.exportedObject = HelperTool()
newConnection.resume()
return true
}
}
let delegate = HelperDelegate()
let listener = NSXPCListener.service()
listener.delegate = delegate
listener.resume()
충돌은 마지막 줄, listener.resume()
발생 : 여기 내 도우미 main.swift
코드입니다.
명령 줄 (LaunchDaemon과 동일한 기능)에서 수동으로 도우미 응용 프로그램을 시작하려고 시도했지만 위의 오류 메시지가 stdout에 인쇄되어 충돌합니다. 근본 원인을 테스트하는 방법에 대한 더 이상의 아이디어가 없습니다. 구현은 Apple’s guidlines for implementing XM services에 이어 초보적인 것 이상입니다. 또한 XML 서비스와 관련하여 SO에 대한 여러 게시물이이 문제를 해결하는 데 도움이되지 못했습니다. Swift에서 권한있는 도우미를 성공적으로 만들려고 노력한 사람이 있습니까? BTW, 응용 프로그램은 샌드 박스되지 않습니다.
완성도를 위해서, 여기에 위의 내 HelperDelegate
클래스에서 참조 HelperTool
클래스의 코드는 다음과 같습니다 마지막으로 HelperToolProtocol
import Foundation
class HelperTool: NSObject, HelperToolProtocol {
func getVersion(withReply reply: (NSData?) ->()) {
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString" as String) as? String ?? "<unknown version>"
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String ?? "<unknown build>"
if let d = "v\(version) (\(build))".data(using: .utf8, allowLossyConversion: false) {
reply(d as NSData)
}
}
}
그리고 : 어떤 도움
import Foundation
@objc(HelperToolProtocol) protocol HelperToolProtocol {
func getVersion(withReply: (NSData?) ->())
}
감사합니다!