2017-09-07 6 views
1

私は、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?) ->()) 
} 

ありがとう!

答えて

0

テストの日の後、私は最終的に私のXPCヘルパーを正しく起動し、どんなメッセージにも応答できる解決策を見つけました。問題は現在、質問に入れて、非常に最後の行直後にヘルパーをクラッシュさせる

let listener = NSXPCListener.service() 
listener.delegate = delegate 
listener.resume() 

を読んmain.swiftモジュールの最後の3行です。

私はこれらの行をApple’s Creating XPC Services documentationから直接受け取りました。ここでNSXPCListenerresume()関数のドキュメントがあります:

service()オブジェクト上で呼び出された場合、このメソッドは戻ることはありません。したがって、希望の初期状態を設定し、リスナー自体を設定した後、XPCサービスのメイン関数内の最後のステップとして呼び出す必要があります。

ソリューションはNSXPCListener.service()シングルトンオブジェクトを呼び出すのではなく、メインのアプリのXPC接続で使用されているのと同じマッハサービス名を渡すinit(machServiceName:)初期化子を使用して新しいNSXPCListenerオブジェクトをインスタンス化しませにあります。この場合、resume()はすぐに再開し、ヘルパーを終了させるため、現在の実行ループに配置して不確定に実行する必要があります。新しい作業コードは次のとおりです。

let listener = NSXPCListener(machServiceName: "Privilege-Escalation-Sample.Helper") 
listener.delegate = delegate 
listener.resume() 
RunLoop.current.run() 
関連する問題