XPC 是苹果这边的一套用于进程间通讯的 API。
这套 API 在 iOS 和 OSX 上都有,不过 iOS 上一直是私有的,但是 XPC 相对于比如 CPDistributedNotificationCenter 和 DarwinNotification 还有更多的功能,主要是为了实现把一个应用分为前端的 GUI 和后端的 daemon 两部分,好处主要是
1. 往往程序中的某些部分要比其他部分更容易出问题,更容易崩溃,把这部分单独分离出来就能让整个应用的稳定性提高,不要让一小部分的问题造成整个应用的崩溃。
2. 将需要较高权限的代码分离到单独的进程中,代码越少越不容易出现安全漏洞,所以将需要高权限的代码分离出来之后,就可以在使用这些权限的时候,让用户界面这些进程继续停留在最低的权限,因为像UIKit这些巨大且混乱的框架一向是最容易出漏洞的(逆向的时候窝就时不时会看到苹果他们自己给自己做的hack。。心情很复杂。。
如果要说 XPC 的工作原理的话,一直追到底层就是用的内核的 Bootstrap API,这是Mach内核中的用于进程间通讯的服务端口(service port)相关接口,这套接口也有一套objc的封装和C的更高层一点的封装,就在Foundation和CoreFoundation框架里,同时上面提到的 iOS 上的私有的 CPDistributedNotificationCenter 和 DarwinNotification 也是在这个的基础上实现的。
如果要说Mach内核的进程间通讯的工作原理的话。。关键就是 跨进程的内存共享。。这方面知道不多,就不多说了。
从 iOS 7 开始进程间通讯的限制就加强了很多,相比较iOS 6,比如说
1. sandbox里的应用不能向外开mach service port,也不能搜索别的进程的port(不过搜索这个的话rpetrich有提供过一个workaround:rpetrich/RocketBootstrap 路 GitHub ,原理是通过 com.apple.SBUserNotification 这个没有被苹果限制的port来通信)
2. 进一步增加了私有框架的调用限制,除了检查应用签名里面的entitlement,甚至还有根据连接服务的进程来细分一个框架里不同API的调用限制,比如ChatKit框架,Messages和SpringBoard的签名里都有使用这个框架的entitlement,但是SpringBoard只能做读取通知,标记已读之类事情,不能发送消息,不能读取消息列表。
iOS 7 在这些方面进一步的限制,大概可能就是在为 iOS 8 开放一部分 IPC 接口做准备,因为以前应用都完全不能使用进程间通讯技术,苹果可以不担心自己的私有服务被别人使用,而现在这个控制马上就要没有了,这些服务都会暴露在别人手中,所以很有必要做进一步的保护。
iOS 8 在有了这些进程间通讯技术后,就可以做更多事情了,比如题目提到的 WKWebView 什么。这都是开发者的自己发挥的事情噜~
— 完 —
本文作者:李邦
【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)
此问题还有 3 个回答,查看全部。
延伸阅读:
Java 中的接口有什么作用?
Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的?