Xcode's 8 Source Editor Extensions

Xcode's 8 Source Editor Extensions

Quick intro to Source Editor Extensions development in Xcode 8

F2f5f7bc8bd3bd71e51d303e9881fe78?s=128

Esteban Torres

June 28, 2016
Tweet

Transcript

  1. 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 •
  2. 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 •
  3. 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 •
  4. 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 •
  5. 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 •
  6. 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 •
  7. 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 •
  8. 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 •
  9. 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 •
  10. 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 •
  11. 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 •
  12. 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 •
  13. 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 •