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

Xcode's 8 Source Editor Extensions

Xcode's 8 Source Editor Extensions

Quick intro to Source Editor Extensions development in Xcode 8

Esteban Torres

June 28, 2016
Tweet

More Decks by Esteban Torres

Other Decks in Technology

Transcript

  1. Hola a todos, sólo quería iniciar agradeciéndoles el que
    se hayan hecho presentes el día de hoy.
    Espero de verdad que estas charlas les hayan sido de
    utilidad y hayan podido aprender algo.
    Xcode 8's Source
    Editor Extensions
    ! COCOAHEADS !
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  2. Anteriormente varios desarrolladores habían desarrollado una manera de que Xcode
    cargara plugins «en proceso».
    Gracias a ésto y mediante una serie de notification «hijacking» y «swizzling» (en los
    lejanos tiempos de Obj-C) se podía literalmente inyectar código sobre Xcode de
    manera tal que el proceso del IDE corría a la vez el código de éstos plugins y permitía
    que su funcionamiento fuese modificado en ejecución.
    OLD SCHOOL PLUGINS
    GOOD OLD DAYS WITH Alcatraz
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  3. Ésto requería que se hiciera dumps de los headers de Xcode, evidentemente no
    oficiales y nada documentados, explorador de herarquías como se ve en la imágen
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  4. Y observers de notificaciones, todo esto con el fin de poder determinar conocimientos internos
    del funcionamiento de Xcode y de esa forma poder inyectar nuestro código de la mejor
    manera y así también poder reaccionar a las diferentes acciones que queríamos sobreescribir.
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  5. Por demás está decir que muchos plugins hacían que
    Xcode corriera más lento
    Algunos provocaban que Xcode ni siquiera levantara
    Otros tenían serios efectos secundarios debido a que se
    hacía swizzling sobre swizzling sin reparo y el
    comportamiento era totalmente inesperado.
    ISN’T THAT
    great?
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  6. Este año durante WWDC  anuncia que van a «abrir» el ecosistema de Xcode para
    que de manera autorizada los desarrolladores puedan agregar funcionalidades al IDE
    mediante extensions.
    Evidentemente todos aquellos que alguna vez habíamos creado o jugado con
    plugins de la vieja escuela sentíamos una grand curiosidad por saber que tan
    limitados serían y hasta adonde nos dejaría  llegar
    HERE COMES 
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  7. Esta es la solución de  al problema de la inyección de
    código de terceros a Xcode
    las extensiones son firmadas por lo que hay mayor
    seguridad de que se está cargando en el proceso del
    IDE
    Las extensiones se componen de 2 clases importantes
    SOURCE EDITOR
    EXTENSIONS
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  8. An Xcode Source Editor Extension is an instance of a class conforming to
    this protocol, which is set as the value of the
    XCSourceEditorExtensionPrincipalClass key in the NSExtensionAttributes
    dictionary in the extension's Info.plist.
    Note
    Make no assumptions about the thread or queue on which any methods
    will be invoked or properties will be accessed, including the designated
    initializer.
    función que se llama cuando le extensión es cargada en el proceso del
    IDE, llamada que puede suceder mucho antes de que la extensión tan
    siquiera reciba una llamada.
    Arreglo de comandos definidos por la extensión tal y como fueron
    definidos en el Info.plist del target de la extensión
    XCSourceEditorExtension
    ▸ func extensionDidFinishLaunching
    ▸ var commandDefinitions
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  9. Define un comando que va a ser ejecutado por la extensión.
    No hay una relación 1:1 entre clases y comandos, una clase
    puede coordinar múltiples comandos al verificar el
    identificador del comando en la invocación.
    Éste método es el que se llama cuando efectivamente se
    invoca el comando de la extensión
    XCSourceEditorCommand
    ▸ func perform(with invocation: XCSourceEditorCommandInvocation,
    completionHandler: (NSError?) -> Swift.Void)
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  10. Si están desarrollando usando macOS 10.11.x (El capitan) Xcode ni
    siquiera se va a molestar en cargar sus extensiones a menos que
    ejecuten el comando anterior y luego reinicien su computadora.
    No se sabe al 100% el porque de esto pero al parecer tiene que
    ver con el servicio de XPC y como el capitán no expera dicho
    servicio (a menos que se le indique)
    Si están en Sierra no es necesario correr dicho programa

    sudo /usr/libexec/xpccachectl
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  11. Live CODING
    !
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  12. Como ya vieron hay ocasiones donde la extensión no carga…
    ^ Antes de que se ulceren yo ya pasé por eso cuando estaba
    preparando el proyecto de ésta presentación y ya pasé por
    todas las etapas de frustración posibles.
    Así que para evitarles dolores de cabeza tomen en cuenta
    ésto
    EXTENSION NOT
    LOADED
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  13. Por lo que vimos anteriormente en El Capitan hay que indicarle al OS que
    debe cargar el servicio XPC para cargar correctamente las extensiones.
    Algunas veces el proceso queda corriendo lo que al parecer «cierra el
    pipe» evitando que otros procesos se carguen.
    Simplemente con matar el proceso de AttachToXPCService cuando no
    carga una extensión y volver a correr el proyecto y listo, Xcode 8 va a
    correr cargando la extensión que estamos desarrollando sin problemas
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  14. Questions?
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  15. Thanks
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide

  16. Reference Links
    ▸ Blog postby me !
    ▸  Docs
    ▸ WWDC 16 - Session #414
    ▸ Russ Bishop blog post
    by me ! https://estebantorr.es/blog/2016/06/28/Xcode-8-Source-Editor-Extensions/
    • Esteban Torres - @esttorhe • CocoaHeads Costa Rica, 2016 •

    View full-size slide