将参数从应用程序委托传递到系统扩展,Mac OS



我正在创建一个系统扩展并将其捆绑在Mac OS Catalina上的Mac应用程序中。 我已经成功地构建了应用程序,并向我的应用程序代表 (Swift( 请求激活扩展。我的系统扩展可以成功运行。

我的问题是我需要以某种方式将请求激活扩展的应用程序委托的其他参数传递给我的系统扩展的主函数。具体来说,我正在尝试传递运行该应用程序的用户的用户名。有没有办法将其他参数从委托传递到扩展?

我无法从系统扩展中获取当前用户,因为扩展始终以 root 身份运行。因此,获取当前用户将返回root。

来自应用委托的相关代码:

func applicationDidFinishLaunching(_ aNotification: Notification) {

let ID = "com...."
let req = OSSystemExtensionRequest.activationRequest(forExtensionWithIdentifier: ID,
queue: DispatchQueue.main).                                         
req.delegate = self

/*some how pass this arguments to extension*/
let username = NSFullUserName()
OSSystemExtensionManager.shared.extensionManager.submitRequest(req)                 
}

我的系统扩展的主要功能:

int main(int argc, const char* argv[]){
//start.....extension
//Need to receive arguments here
dispatch_main();
}

如果我能以某种方式收到传递给argv的用户名,那就太好了。我对其他解决方案持开放态度。底线是我需要某种方式在两者之间传达此用户名值。

如果我正确理解了您的问题,那么答案在很大程度上取决于您正在开发的系统扩展类型。例如:

  • VPN 网络扩展 API 已经具有内置机制,用于通过隧道启动请求期间传递选项等与其启动器应用程序进行通信。
  • DriverKit 扩展通常通过IOUserClient子类与应用程序通信。
  • 对于任何没有指定机制的东西,我的猜测是使用XPC。

最新更新