iOS中通信原理的整体分层

iOS的通信体系从宏观上可分为四个层面:进程内通信(应用内部的对象、线程与队列之间传递消息)、进程间通信(应用与应用、应用与系统守护进程之间)、网络通信(设备与设备之间经由协议栈)、外设通信(与蓝牙、NFC、MFi配件等硬件交互)。这四层都建立在同一个根基之上——XNU混合内核(Mach微内核 + BSD层 + IOKit驱动层),再向上经由系统调用、Runloop事件循环和各种框架暴露给应用层。
一、内核通信基石:Mach消息与端口权限
XNU最底层的IPC原语是Mach端口(Mach Port)与Mach消息。端口本质上是一个由内核维护的消息队列,用户态拿到的端口名只是一个整数句柄,真正决定通信能力的是端口权限:发送权(send right)、接收权(receive right)、一次性发送权(once right)和命名权。持有接收权的进程才能读取消息,而权限本身只能通过端口间传递的消息来授予,因此每一次通信能力都由内核显式背书。用户态通过mach_msg()陷入内核完成收发,其消息体由msgh_bits、msgh_size、msgh_remote_port、msgh_local_port、msgh_id等字段构成,消息尾还可附带安全Trailer用于审计发送者身份。复杂接口由MIG(Mach Interface Generator)生成存根代码,task端口、host端口等系统调用均由此实现。NSPort/NSMachPort、CFMachPort以及Runloop的Source1都是对Mach端口的面向对象封装。
二、BSD层提供的POSIX通信手段
XNU中的BSD层在Mach之上提供了传统Unix通信能力:管道pipe与命名管道FIFO、Unix Domain Socket(本地套接字,AF_UNIX)、POSIX共享内存(shm_open/mmap)、POSIX信号量与互斥锁、消息队列、文件锁、kqueue事件通知以及signal信号。CFSocket/CFStream、GCD的DISPATCH_SOURCE_TYPE_READ等高级接口底层都映射到这些机制。共享内存适合传递大体量数据,Unix Domain Socket则常用于本地服务化通信。需要强调的是,iOS的Application Sandbox(基于sandboxd的Seatbelt策略)会限制文件路径与套接字访问,因此这些机制主要在进程与系统服务之间使用,而不是任意App之间直连。
三、XPC与系统服务通信
XPC是Apple现代架构中的核心IPC框架,位于libxpc与Foundation的NSXPCConnection之上,底层仍然是Mach消息加序列化的字典/对象。XPC采用连接式通信,通过Endpoint对象可以把连接句柄经IPC再次传递,并且连接建立时会拿到对端的audit token,再用SecCodeCopyGuestWithAttributes校验其代码签名与Team ID,这就是系统服务鉴权应用身份的机制。iOS中开发者不能自定义XPC Service(该能力仅限macOS),但系统服务如cloudd、nsurlsessiond、pastebd等均以XPC方式与App交互;应用扩展(App Extension)与宿主App、Today Widget、Action Extension等也建立在XPC通信体系之上。
四、App之间的通信机制
iOS出于沙箱隔离考虑,App间不能直接共享内存,必须经由系统框架:其一是URL Scheme(openURL:/canOpenURL:,并需要在Info.plist的LSApplicationQueriesSchemes中声明白名单);其二是Universal Links,通过apple-app-site-association把HTTPS域名映射到原生页面;其三是App Groups,同一开发者资质下的App可以通过group container共享文件目录、 suiteName共享的NSUserDefaults以及Keychain Access Group共享钥匙串;其四是UIPasteboard,底层由系统的pboardd守护进程完成跨进程数据复制;其五是Darwin通知,通过CFNotificationCenterGetDarwinNotifyCenter发布名义字符串,经notifyd守护进程广播给所有订阅进程;其六是Handoff/NSUserActivity,结合iCloud与低功耗蓝牙广播实现跨设备接力。
五、Objective-C运行时的消息机制
语言层面,Objective-C的方法调用并非静态绑定,而是动态消息发送。编译器把[b receiver method]翻译为objc_msgSend(receiver, @selector(method), ...):运行时通过isa指针找到类对象,先在方法缓存中以SEL为键做哈希查找,未命中再遍历方法列表method list并沿继承链向上;若仍找不到,则进入消息转发三阶段——resolveInstanceMethod:动态添加实现、forwardingTargetForSelector:替换消息接收者、methodSignatureForSelector:与forwardInvocation:完整转发,最终仍失败才抛出doesNotRecognizeSelector异常。NSProxy、KVO(系统动态创建NSKeyValueObservation子类并改写isa)、转发链等高级特性都依赖该机制。Swift默认按静态派发或函数表派发,只有@objc dynamic修饰的方法才走这套运行时消息机制。
六、进程内的通信模式
同一App内部最常用的通信模式都构建在Runloop事件循环之上:NSNotification(NSNotificationCenter,进程内同步或异步分发)、KVO(基于isa-swizzling,setter被重写为_NSSetXXXValueAndNotify,最终调用observeValueForKeyPath:)、block、GCD队列、delegate/target-action以及performSelector。Runloop的输入源分为Source0(应用主动触发,如CFSocket回调、手动的CFRunLoopSourceSignal)与Source1(基于Mach端口,可跨线程/跨进程唤醒)。NSTimer、CADisplayLink等计时器同样是Runloop的timer源。GCD则在底层通过dispatch_mach与内核事件源把线程管理、信号量、屏障与端口唤醒统一起来。
七、网络通信协议栈
iOS网络栈自上而下为:NSURLSession/NSURLConnection(会话、任务、配置HTTP/2、TLS、Cookie、Cache等策略)→CFNetwork(CFHTTPMessage、CFHTTPStream等C层封装)→BSD Socket(socket/connect/send/recv,TCP/UDP)→内核TCP/IP栈→IOKit网络驱动。iOS 12之后Apple推出Network.framework(NWConnection、NWListener、NWPathMonitor),原生支持TLS 1.3与QUIC/HTTP/3,并基于NWPathMonitor做多路径网络评估;传统socket代码也可配合GCD AsyncSocket、CocoaAsyncSocket等第三方库使用;低层安全传输由Secure Transport(旧)及Network框架内建TLS实现。Bonjour(mDNS/DNS-SD)则提供局域网内的零配置服务发现,是AirDrop、Multipeer等能力的基础。
八、设备间及近场通信
近场通信最常用的是Multipeer Connectivity(MCSession、MCNearbyServiceAdvertiser/Browser),底层在 инфра WiFi与蓝牙之间自动选择链路;Apple Watch与iPhone之间使用WatchConnectivity(WCSession,后台经系统守护进程配对转发);AirDrop/Handoff依赖低功耗蓝牙广播与点对点WiFi。CoreBluetooth下iOS设备可作为中心或外设,遵循BLE的ATT/GATT协议进行服务、特征值读写与通知;L2CAP通道在较新系统上也可通过CBLinkedList风格接口使用。ExternalAccessory框架用于MFi认证配件,通过EAAccessory与协议字符串建立EASession的双向NSInputStream/NSOutputStream。Core NFC支持NDEF读写与ISO 14443-4 APDU及ISO 15693交互。更底层的IOKit用户态接口(IOServiceMatching、IOServiceOpen、IOConnectCall、IOHIDDevice)在iOS上属私有框架,仅供系统与MFi配件使用。
九、WebView与JS通信
WKWebView时代,JS与原生之间通过WKScriptMessageHandler与WKUserContentController建立脚本消息通道:JS端调用window.webkit.messageHandlers.
十、贯穿始终的安全与沙箱模型
所有通信机制都受同一套安全模型约束:沙箱用Seatbelt策略限制文件、套接字、Mach端口的访问;Entitlements与代码签名决定进程被允许使用的服务类型;Mach端口的权限必须显式传递,接收端才能应答;XPC连接通过audit token + SecCodeCopyGuestWithAttributes验证对端PID、Team ID与签名;跨进程共享数据依赖App Groups,跨应用跳转依赖URL Scheme或Universal Links声明。通信能力即权限能力,这是iOS通信体系区别于桌面系统的根本设计。
核心总结
iOS通信原理可以概括为:底层统一为Mach消息与端口权限,中层由BSD POSIX、XPC、Runloop事件驱动承上启下,上层以Foundation/Core Foundation框架暴露给应用,再辅以URL Scheme、App Groups、Pasteboard等受控的App间通道;网络与外设通信则分别经由BSD Socket/Network.framework协议栈与CoreBluetooth、ExternalAccessory、Core NFC等驱动接口接入。整个体系遵循"机制统一、策略分层、权限受控"三条原则,在开放通信能力的同时由沙箱与签名体系守住边界。

查看详情

查看详情