举例

Client端的Preferences发送给Server端的akd

  • 概述
    • Client端的Preferences的NSXPCConnection:去发送XPC消息=调用函数
      • -[__NSXPCInterfaceProxy_AKAnisetteProvisioningAndSigningDeamonInterface fetchAnisetteDataAndProvisionIfNecessary:device:completion:]
    • Server端的akd的NSXPCConnection:去接收XPC消息=找到对应函数去处理
      • -[AKAnisetteProvisioningService fetchAnisetteDataAndProvisionIfNecessary:device:completion:]

详解

先明白基础概念和此处所涉及到的内容:

  • 当前的NSXPCConnection
    • serviceName=com.apple.ak.anisette.xpc
    • Client端
      • iOS的app:设置=Preferences
        • 包名:com.apple.Preferences
        • 二进制:/Applications/Preferences.app/Preferences
    • Server端=Listener端
      • AuthKit库的daemon服务程序:akd
        • 二进制:/System/Library/PrivateFrameworks/AuthKit.framework/akd

此处最初的情况是:

  • 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:
  • 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>

所以最终的调用的过程是:

  • 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:]

results matching ""

    No results matching ""