关于 进程间通信 xpc 使用的问题

目前我使用的是XPC 来进行app和deamon 进行进程之间通信
我发现大部分app 和我的 daemon 用xpc都能连接, 但是部分app作为client 连接daemon时候, 立马直接报下面的错误

Received reply object: <error: 0x1b2a16bc0> { count = 1, transaction: 0, voucher = 0x0, contents =
“XPCErrorDescription” => <string: 0x1b2a16e18> { length = 18, contents = “Connection invalid” }
}

请教一下,这是为什么呢 , 应该怎么解决呢?

这个地方 就比较讲究了。
如果是你回复服务端发过来的消息你应该用 xpc_dictionary_create_reply 来生成 xpc_object_t
大概类似这样

xpc_object_t reply = xpc_dictionary_create_reply(some_object);
 if (reply) {
  xpc_dictionary_set_string(reply, "message", "Pong");
  HBLogDebug(@"XPC connection sending reply: %s", xpc_copy_description(reply));
  xpc_connection_send_message(xpc_dictionary_get_remote_connection(some_object), reply);
}

我上面这个

Received reply object: <error: 0x1b2a16bc0> { count = 1, transaction: 0, voucher = 0x0, contents =
“XPCErrorDescription” => <string: 0x1b2a16e18> { length = 18, contents = “Connection invalid” }
}

是client 收到的, 我客户端代码如下:

// Send message to mach service, and wait for a response
xpc_object_t object = xpc_dictionary_create(NULL, NULL, 0);
xpc_dictionary_set_string(object, "message", "Ping");
NSLog(@"Sending object: %s\n", xpc_copy_description(object));

xpc_object_t reply = xpc_connection_send_message_with_reply_sync(connection, object);
NSLog(@"Received reply object: %s\n\n", xpc_copy_description(reply));

其实server端 没有收到客户端发到消息, 客户端直接报错了, 不知道为什么

我的猜测:
1.是不是跟app的权限文件entitlements有关
2.该app是不是有别的xpc服务, 导致我把他当成xpc客户端不行

不知道, 反正我的工作的很美好:yum:

好吧… 这个问题困扰了我几天了 :cold_sweat:

实在不行就 webscoket 配合 pb 也能玩的很爽呀

webscoket 也可以本地进程 双向通信吗? 有教程文章吗 前辈

ws 不是可以建聊天室?

我还没用过 websocket 所以不是很清楚 :disappointed_relieved:

我也遇到这个问题了,但是我前一天是能正常使用,第二天莫名其妙的就不行了,最后你解决了吗

有没有安装RocketBootstrap?App应该只有发送权限

请问,最后这个问题解决了吗?是不是和entitlement.plist相关呢

大神,关于xpc的connection error, 报Connection invalid,请问有没有解决办法 ?

root的app在一些方面是连不上sandbox内的服务的

我在调用这个的时候rocketbootstrap_cfmessageportcreateremote就出现了这个问题,有没有可能是权限或者是签名的问题,使用这个方法的时候都需要哪些签名,前辈指教一下

进程间通讯我还真没遇到过说有需要特殊签名的

我前段时间发现1.0.8以上的rocketbootstrap通信没有反应,退到1.0.7就行了,具体原因没深究,是你说的这个问题吗?

但就会有一个问题,1.0.7不支持iOS13.吧?

static CFMessagePortRef messageSnapshotPort = NULL;

static NSData* send_event(int msgid, NSData * data) {

if (messageSnapshotPort && !CFMessagePortIsValid(messageSnapshotPort)){
    CFRelease(messageSnapshotPort);
    messageSnapshotPort = NULL;
}
if (!messageSnapshotPort) {
    messageSnapshotPort = rocketbootstrap_cfmessageportcreateremote(NULL, CFSTR(SPRINGBOARD_UI_MACH_PORT_NAME));
}
if (!messageSnapshotPort || !CFMessagePortIsValid(messageSnapshotPort)) {
    NSLog(@"*******task service *****Error: MessagePort is invalid");
    return NULL; //kCFMessagePortIsInvalid;
}
CFDataRef cfData = NULL;
if (data) {
    cfData = (__bridge CFDataRef)data;
}
CFDataRef rData = NULL;

CFMessagePortSendRequest(messageSnapshotPort, msgid, cfData, 30, 30, kCFRunLoopDefaultMode, &rData);


NSData * result = nil;
if (rData) {
    result = (__bridge NSData *)rData;
    CFRelease(rData);
}

return result;

}

就这,直接报******task service *****Error: MessagePort is invalid,rocketbootstrap_cfmessageportcreateremote这个函数就没创建成功

然后,我还发现在xpc的连接的部分,
xpc_connection_set_event_handler(connection, ^(xpc_object_t object
通过xpc_type_t type = xpc_get_type(object);返回了type= XPC_TYPE_ERROR

支持13,我的越狱机一直最新系统