Can CARemoteLayerServer and CARemoteLayerClient be used between processes?

为君一笑 提交于 2019-12-03 14:24:01

Yes, it's possible. Here is an example: https://github.com/krevis/RemoteLayerDemo

Run the app, press the "Get Remote Layer" button, and the service will be started and will give the app a green remote layer. (Oddly, it takes several seconds to appear -- no idea why.)

After that, the "Change Color" button sends a message to the service asking it to change the layer's color, which takes effect immediately, and even animates. The "Remove Remote Layer" button removes the layer; the service will then get terminated if you let it idle for a few seconds.

The hard part is passing the Mach port of the CARemoteLayerServer between processes. The mach_port_t that you see in your process is just a number; it only has meaning within your process. (Same idea as a pointer: pointers are just numbers, but you can't pass a pointer from one process to another, and expect them to point to the same thing.)

You'd think XPC could send Mach ports, but it can't. It would make this a lot easier!

Instead, you have to use Mach API to send the underlying Mach port around. In the demo, I'm using bootstrap_register in the app and and bootstrap_look_up in the service, using an agreed-upon name. This is not secure, because any other app in the same bootstrap context could find the port, but it's good enough for a demo. In reality you'd want to dive down to some uglier Mach calls.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!