私は、SMJobBless
を使用して、エスカレートされた特権を持つヘルパーを作成するSwift macOSアプリケーションを作成しました。これは正常に動作します。ヘルパーは/Library/Privileged Helper Tools
にインストールされ、付随するLaunchDaemonは/Library/LaunchDaemons
に作成されます。ただし、ヘルパーは正常に起動できません。代わりに、 "Illegal instruction:4"というメッセージが表示されてクラッシュします。Swift Privileged Helper(XPCリスナー)不正な命令エラーでクラッシュする
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のさまざまな投稿は、この問題を解決するのに役立っていません。あなたの誰かがスウィフトで特権ヘルパーをつくろうとしましたか?ところで、アプリはサンドボックス化されていません。
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)
}
}
}
そして最後にHelperToolProtocol
:完全を期すために
は、ここに上記の私HelperDelegate
クラスで参照HelperTool
クラスのコードです任意のヘルプ
import Foundation
@objc(HelperToolProtocol) protocol HelperToolProtocol {
func getVersion(withReply: (NSData?) ->())
}
ありがとう!