a6217829
(a6217829)
1
目前我使用的是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);
}
a6217829
(a6217829)
4
我上面这个
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客户端不行
实在不行就 webscoket 配合 pb 也能玩的很爽呀
a6217829
(a6217829)
9
webscoket 也可以本地进程 双向通信吗? 有教程文章吗 前辈
Tandrow
(Tandrow)
12
我也遇到这个问题了,但是我前一天是能正常使用,第二天莫名其妙的就不行了,最后你解决了吗
请问,最后这个问题解决了吗?是不是和entitlement.plist相关呢
大神,关于xpc的connection error, 报Connection invalid,请问有没有解决办法 ?
我在调用这个的时候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
确实是支持ios13,我错了…
不过我在网上找到了rocketbootstrap 1.0.7~beta3后,发现还是不行,还是同样的错误
hoffconna
(hoffconna)
24
关于这个问题,有啥新的结论吗,我用theos起了个xpc service。自己的测试APP也没法通信,报错也是一样的。