举例
Client
端的Preferences
发送给Server
端的akd
- 概述
- Client端的Preferences的NSXPCConnection:去发送XPC消息=调用函数
-[__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface fetchAnisetteDataAndProvisionIfNecessary:device:completion:]
- Server端的akd的NSXPCConnection:去接收XPC消息=找到对应函数去处理
-[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]
- Client端的Preferences的NSXPCConnection:去发送XPC消息=调用函数
详解
先明白基础概念和此处所涉及到的内容:
- 当前的
NSXPCConnection
serviceName
=com.apple.ak.anisette.xpc
- Client端
- iOS的app:
设置
=Preferences
- 包名:
com.apple.Preferences
- 二进制:
/Applications/Preferences.app/Preferences
- 包名:
- iOS的app:
- Server端=Listener端
- AuthKit库的daemon服务程序:
akd
- 二进制:
/System/Library/PrivateFrameworks/AuthKit.framework/akd
- 二进制:
- AuthKit库的daemon服务程序:
此处最初的情况是:
- Client端的:
Preferences
的 NSXPCConnection- log信息
<NSXPCConnection: 0x282adc640> connection to service with pid 125 named com.apple.ak.anisette.xpc
- 注:akd的PID=125
remoteObjectProxy
<__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface: 0x2838ccb40>
remoteObjectInterface
- Protocol:
AKAnisetteProvisioningAndSigningDeamonInterface
- 此处po能查看到:所有的函数
fetchAnisetteDataAndProvisionIfNecessary:device:completion:
absintheSignatureForData:completion:
attestationDataForDevice:withRequest:completion:
syncAnisetteWithSIMData:device:completion:
eraseAnisetteForDevice:completion:
provisionAnisetteForDevice:completion:
legacyAnisetteDataForDSID:device:completion:
signaturesForData:options:completion:
- 从头文件中可以确认:其实是conform遵守了2个protocol,且对应的函数正好是2个protocol的函数
AKAnisetteProvisioningDaemonProtocol
attestationDataForDevice:withRequest:completion:
legacyAnisetteDataForDSID:device:completion:
fetchAnisetteDataAndProvisionIfNecessary:device:completion:
eraseAnisetteForDevice:completion:
syncAnisetteWithSIMData:device:completion:
provisionAnisetteForDevice:completion:
AKAppleIDSigningDaemonProtocol
signaturesForData:options:completion:
absintheSignatureForData:completion:
- 此处po能查看到:所有的函数
- Protocol:
- log信息
- Server端的:
akd
的 NSXPCConnection- log信息
<NSXPCConnection: 0x105204680> connection from pid 17416 on mach service named com.apple.ak.anisette.xpc
- 注:Preferences的PID=17416
exportedObject
<AKAnisetteProvisioningService: 0x107412620>
- 而AKAnisetteProvisioningService这个类,是akd中才有的
- 且实现了conform了前面的2个protocol
AKAnisetteProvisioningDaemonProtocol
AKAppleIDSigningDaemonProtocol
exportedInterface
<NSXPCInterface: 0x107420650>
- log信息
所以最终的调用的过程是:
- Client端Preferences中的NSXPCConnection,去调用
-[__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface fetchAnisetteDataAndProvisionIfNecessary:device:completion:]
即:
-[<__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface: 0x281c88aa0> fetchAnisetteDataAndProvisionIfNecessary:device:completion:
1
0
<__NSStackBlock__: 0x16dd79ec0
invoke = "__92-[AKAnisetteProvisioningController fetchAnisetteDataAndProvisionIfNecessary:withCompletion:]_block_invoke.51"
>
]
过程是:
- 会触发到:Server端的exportedObject的类:
AKAnisetteProvisioningService
- 去调用对应的函数去处理
-[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]
- 注:因为本身
AKAnisetteProvisioningService
就conform了对应的2个protocol:AKAnisetteProvisioningDaemonProtocol``、AKAppleIDSigningDaemonProtocol
,所以支持这些函数调用
- 注:因为本身
- 去调用对应的函数去处理
最终是触发:
-[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]