Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to XPC inter-process communication

vashchenko
November 12, 2018

Intro to XPC inter-process communication

This presentation gives basic understanding how XPC works on macOS and how to establish it.

vashchenko

November 12, 2018
Tweet

More Decks by vashchenko

Other Decks in Programming

Transcript

  1. XPC Connection

    View full-size slide

  2. XPC
    currently the only non-deprecated
    inter-process communication API on macOS

    View full-size slide

  3. XPC services
    XPC connection

    View full-size slide

  4. We are NOT talking about XPC Services here.
    We are talking XPC as API fo inter-process
    communication

    View full-size slide

  5. XPC benefits
    1. Performance: lazy (on-demand) automatic launching XPC services

    2. Architecture: one executable can represent several services

    3. Security: making services with minimum privileges

    4. Stability: crashing one process doesn't affect another

    View full-size slide

  6. Adding an executable, that
    can be called via XPC
    1. Copy configuration plist to appropriate system location*
    2. Change plist owner to root
    3. Add plist to lauchd (load or bootstrap)
    4. Put service's executable to location, defined in configuration plist
    5. Run client!
    *System locations

    — user agent for current user: ~/Library/LaunchAgents/

    — user agent for all users: /Library/LaunchAgents/

    — daemon: /Library/LaunchDaemons/

    View full-size slide

  7. Daemon config plist
    example

    View full-size slide

  8. libxpc API
    xpc.h and connection.h

    View full-size slide

  9. libxpc API
    xpc.h and connection.h

    View full-size slide

  10. NSXPCConnection
    1. NSXPCConnection

    2. NSXPCInterface

    3. NSXPCListener

    4. NSXPCListenerEndpoint

    View full-size slide

  11. NSXPCConnection
    1. NSXPCConnection

    2. NSXPCInterface

    3. NSXPCListener

    4. NSXPCListenerEndpoint optional

    View full-size slide

  12. Establishing XPC
    connection
    Details: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/
    Chapters/CreatingXPCServices.html
    Client side
    call on the
    server side

    View full-size slide

  13. Establishing XPC
    connection
    Details: https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/
    Chapters/CreatingXPCServices.html
    Server side
    Instantiate your listener soon after launch:
    set it's delegate

    View full-size slide

  14. Establishing XPC
    connection
    Server side
    In NSXPCListener's delegate method set up the connection:

    View full-size slide

  15. invalidation handler
    interruption handler

    View full-size slide

  16. invalidation handler
    interruption handler
    error →

    View full-size slide

  17. invalidation handler
    interruption handler
    error →
    OK →

    View full-size slide

  18. Error output goes to
    Console.app

    View full-size slide

  19. Method signature
    restrictions for XPC calls
    Methods should return Void.
    Parameters could be:
    1. Arithmetic types (int, char, float, double, uint64_t, NSUInteger, and so on)
    2. BOOL
    3. C strings
    4. C structures and arrays containing only the types listed above
    5. Objective-C classes, that implement the NSSecureCoding protocol (e.g. NSString or custom
    classes).
    6. NSArray, NSDictionary and other collections with objects, conforming to NSSecureCoding.
    7. Only one block (reply block), that returns Void and receives parameters of types, listed above.

    View full-size slide

  20. Passing objects
    by copy and by proxy
    Passing by copy is a recommended and performant way.
    Passing by proxy decreases performance and should be avoided.

    View full-size slide

  21. Thank you!
    Happy to help via [email protected]

    View full-size slide