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