0

我正在开发一个端点安全扩展。主应用程序使用 pyobjc 在 Python 2.7.18 中运行。为了在应用程序和扩展之间建立通信,我尝试了 NSXPCConnection。我成功地将值发送到 Extension。但是在 pyobjc 中使用块并不成功。首先我进入了这个问题。我使用这个解决方案解决了它。在那之后得到问题

ValueError: NSInvalidArgumentException - [NSXPCConnection sendInvocation]: Block was not compiled using a compiler that inserts type information about arguments.

后来我想到了使用 XPC 的 C Api。但这里的问题是 xpc_main 阻塞了那个主线程。

main(int argc, char *argv[])
{
    init_dispatch_queue();
    xpc_main(connection_handler);
    es_client_t *client;
    es_new_client_result_t result = es_new_client(&client, ^(es_client_t *c, const es_message_t *msg) {
        handle_event(c, msg);
    });

    if (result != ES_NEW_CLIENT_RESULT_SUCCESS) {
        os_log_error(OS_LOG_DEFAULT, "Failed to create the ES client: %d", result);
        return 1;
    }

    es_event_type_t events[] = { ES_EVENT_TYPE_AUTH_EXEC, ES_EVENT_TYPE_AUTH_OPEN };
    if (es_subscribe(client, events, sizeof(events) / sizeof(events[0])) != ES_RETURN_SUCCESS) {
        os_log_error(OS_LOG_DEFAULT, "Failed to subscribe to events");
        es_delete_client(client);
        return 1;
    }

    dispatch_main();

    return 0;
}

xpc_main 调用了 dispatch_main 并且没有执行实际的扩展代码。我在 info.plist 中添加了 XPCService dict,并将 RunLoopType 添加为 NSRunLoop,如链接中所示

如果 xpc_main 和 Endpoint 扩展可以一起工作,请帮助我。NSXPCListner工作正常。如果 xpc_main 不可能,那么我们如何使用 pyobjc 执行块。

4

0 回答 0