CodeFlow permet de développer de façon interactive sur iOS. Le live-coding proposé par l'outil ressemble à la magie de l’injection de code par DyCI qui a été présentée à la session d’avril, mais pousse le concept largement plus loin. Jean-Luc Jumpertz, son auteur, viendra de Rennes pour nous présenter cette solution.
1. CODEFLOW
Live app development for iOS
C O C O A H E A D S PA R I S
11 juin 2015
Jean-Luc Jumpertz @JLJump
créateur de celedev @celedevwww.celedev.com
3. CodeFlow
Env. de développement interactif d’apps iOS
CodeFlow
Mac App
Target
iOS App
CIM
Context
Monitor
CIM
Lua
Context
Exécution du code Lua
Interface avec iOS
Gestion du live-coding
…
Le code dynamique
est écrit en Lua.
Lua est un langage dynamique
très simple, puissant, et flexible.
Interface de CodeFlow pour
contrôler le Lua Context
4. CodeFlow
Env. de développement interactif d’apps iOS
CodeFlow
Mac App
Target
iOS App
CIM
Context
Monitor
CIM
Lua
Context
Exécution du code Lua
Interface avec iOS
Gestion du live-coding
…
Dans l’App, il suffit d’ajouter 3 lignes de code :
_luaContext = [[CIMLuaContext alloc] initWithName:@"Stocks"];
_luaContextMonitor = [[CIMLuaContextMonitor alloc] initWithLuaContext:_luaContext
connectionTimeout:10];
[_luaContext loadLuaModuleNamed:@"StockViewController"];
5. CodeFlow
Env. de développement interactif d’apps iOS
CodeFlow
Mac App
Target
iOS App
CIM
Context
Monitor
CIM
Lua
Context
Démo 1 : live coding
Ce qu’on a vu :
• les modifications du code source se propagent immédiatement dans l’application
• du simple ajustage de paramètres à l’ajout / suppression de méthodes dans une classe
• live coding en multi-devices : test simultané dans différentes configurations
• simplicité de connection d’un device à CodeFlow
6. Interface Lua Objective-C
• Accès transparent depuis Lua à toutes les classes Objective-C
• référence à une classe ObjC via la variable globale objc :
local UIColor = objc.UIColor
• création d’une instance
local label = objc.UILabel:newWithFrame(contentView.bounds)
• appel de méthodes
contentView:addSubview(label)
isOk, modifDate, error = url:getResourceValue_forKey_error(NsURL.ContentModificationDateKey)
• utilisation de propriété : label.backgroundColor = UIColor.clearColor
• subclassing et extension des classes ObjC en Lua
local LabelCell = class.createClass ("LabelCell", objc.UICollectionViewCell)
local ViewController = class.extendClass (objc.ViewController)
• Dans l’autre sens, le code natif appelle aussi de manière transparente votre code Lua
• méthodes surchargées en Lua, action methods, méthodes de protocoles ObjC,
• paramètres blocks des méthodes ObjC (à qui on passe des fonctions Lua)
local words = {}
local wordsCount = 0
text:enumerateSubstringsInRange_options_usingBlock (fullRange,
NsString.EnumerationOptions.ByWords,
function(word)
wordsCount = wordsCount + 1
words[wordsCount] = word
end)
7. Interface Lua Objective-C
• Les structs C sont vues comme des pseudo-objets (comme en Swift :)
local rect1 = struct.CGRect(0, 0, 200, 400)
local point2 = struct.CGPoint {x = 150.0, y = 80.0}
deltaX = point2.x - rect1:getMidX()
• Les autres entités C (enums, variables et fonctions globales, …) sont
exposés à travers des modules Lua
local NsString = require "Foundation.NSString"
-- ...
someString:enumerateSubstringsInRange_options_usingBlock
(fullRange, NsString.EnumerationOptions.ByWords,...)
• Les libraries de Bindings
• Ce sont des packages qui exposent les APIs natives au code Lua
• Bindings SDK exposent les APIs d'une version de SDK iOS (ou OS X)
• Bindings Projet exposent les APIs de votre projet Xcode
• créés en associant un projet Xcode au projet CodeFlow
• configurables et mis à jour automatiquement en cas de changement
dans les fichiers header du projet Xcode (live bindings !)
8. Live Resources
• Un projet CodeFlow = modules Lua + ressources : images, textes, …
• Une ressource peut être éditée dans toute application Mac (éditeur externe)
• Lorsque l’éditeur externe enregistre les modifications, CodeFlow propage
immédiatement celles-ci vers l’application cible.
• Côté application cible, on utilise la fonction getResource pour créer une live resource
au lieu de : imageView.image = [UIImage imageNamed:@"carrot"];
on écrit : getResource("carrot", "public.image", imageView, "image")
Code
Flow
Editeurs
externes
Target
App
Parce qu'il n'y a pas que le code dans la vie ...
9. Live Resources
• Demo
On a vu :
• La mise à jour instantanée de ressources images dans l'app, en utilisant un éditeur
externe, ou par glisser-déposer
• L'utilisation de fichier nib dynamiques dans une application
• Pas de limitation sur les types de ressources supportés
• Une API dans CIMLua permet d'ajouter vos propres types si besoin
Code
Flow
Editeurs
externes
Target
App
Parce qu'il n'y a pas que le code dans la vie ...
10. En guise de conclusion
• CodeFlow, c'est aussi …
• La configuration automatique du projet Xcode de l'app
• Un debugger complet, et son interpréteur de commandes
associé
• La gestion de l'historique de vos modifications
• ...
• Status courant / Roadmap
• CodeFlow est actuellement en beta publique
• Prochaines étapes
• Support du développement live d'apps OS X
• Corrections des bugs restants
• Lancement commercial !
11. MERCI !
Des questions ?
Jean-Luc Jumpertz @JLJump
celedev @celedevwww.celedev.com
Participez à la beta ! 😃
Téléchargez CodeFlow : www.celedev.com/en/support/#downloads
Vos retours seront les bienvenus !