Slide 1

Slide 1 text

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 •

Slide 2

Slide 2 text

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 •

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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 •

Slide 5

Slide 5 text

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 •

Slide 6

Slide 6 text

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 •

Slide 7

Slide 7 text

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 •

Slide 8

Slide 8 text

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 •

Slide 9

Slide 9 text

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 •

Slide 10

Slide 10 text

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 •

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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 •

Slide 13

Slide 13 text

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 •

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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 •