Dans cette page, nous allons voir comment créer une application mobile iOS à partir d'une application Ksaar, prête à être publiée sur l'app store.
Cette documentation est plus technique que les autres, mais tout ce qui est présenté ici peut-être reproduit simplement en faisant des copier-coller des morceaux de codes présents dans chaque étape.
Créer le projet
On commence par créer un nouveau projet d'app IOS sur Xcode et on remplit les quelques informations nécessaires.
Dans le dossier ‘Assets’, on place l'icône qu'aura notre application dans 'AppIcon', puis on ajoute l'image de son logo qu'on renomme 'Logo' pour pouvoir l'utiliser plus tard.
Pour définir l'écran qui s'affiche au lancement de son application avec son logo, il faut aller dans les réglages de notre application, puis dans l'onglet Info, il faut ensuite aller dans 'Custom iOS Target Properties' et rajouter une ligne sous 'Launch Screen' avec le nom 'Image Name' et y mettre le nom de notre fichier : 'Logo'.
Créer une WebView
On débute ce projet par la création d'une simple WebView qui permet d'afficher une page internet sur notre application.
Dans le fichier ContentView, qui va contenir les éléments principaux de notre application, on créé notre structure WebView classique avec les fonctions makeUIView, qui permet d'initialiser la WebView, et updateUIView, qui permet de la mettre à jour.
On place notre WebView dans notre ContentView avec une url de test dans un premier temps.
On obtient alors une simple app avec uniquement notre WebView qui affiche le site choisi.
On va maintenant ajouter une TopBar et une BottomBar pour pouvoir naviguer entre plusieurs pages de notre application Ksaar.
Pour cela, on créé d'abord un nouveau fichier swift ‘Config’ qui va contenir tous les paramètres de notre application.
Dedans, on créé une structure ‘Page’ qui contient une icône et une url et qui définit toutes les icônes que l'on aura dans nos barres de navigations et les urls des pages de notre application Ksaar vers lesquelles ces icônes renvoient.
On ajoute une première ’settingsPage’, issue de cette structure, qui sera dans notre TopBar, puis toutes les pages qui seront dans notre BottomBar, on peut en mettre le nombre que l’on souhaite.
Puis, on définit la couleur de navigation qu'on souhaite utiliser pour signaler la page en cours.
importSwiftUIimportFoundationstructPage {let icon: Stringlet url: String}let settingsPage =Page(icon:"gearshape", url:"<à compléter>")let pages = [Page(icon:"calendar", url:"<à compléter>"),Page(icon:"person", url:"<à compléter>"),Page(icon:"house", url:"<à compléter>"),Page(icon:"folder", url:"<à compléter>"),Page(icon:"doc.text", url:"<à compléter>"), ]extensionColor {init(hex: String) {let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)var int: UInt64=0Scanner(string: hex).scanHexInt64(&int)let a, r, g, b:UInt64switch hex.count {case3:// RGB (12-bit) (a, r, g, b) = (255, (int >>8) *17, (int >>4&0xF) *17, (int &0xF) *17)case6:// RGB (24-bit) (a, r, g, b) = (255, int >>16, int >>8&0xFF, int &0xFF)case8:// ARGB (32-bit) (a, r, g, b) = (int >>24, int >>16&0xFF, int >>8&0xFF, int &0xFF)default: (a, r, g, b) = (255, 0, 0, 0) } self.init( .sRGB, red:Double(r)/255, green:Double(g)/255, blue:Double(b)/255, opacity:Double(a)/255) }}let navigationColorHex ="29E0A6"
BottomBar
Dans le fichier ContentView, on créé notre BottomBar en plaçant autant de boutons qu’on a définis de pages dans le fichier Config, chaque bouton ayant l’icône choisie.
Au clic sur un bouton, on indique que c’est la page correspondante qui est sélectionnée, ce qui change la couleur du bouton.
De la même manière, on créé notre TopBar avec le logo au milieu et une icône vers une page tout à droite, qui peut être une page utilisateur, une page de réglage ou autre.
On a maintenant nos barres de navigation, mais la page ne change pas encore sur la WebView.
Pour pouvoir faire la navigation, et que chaque icône redirige bien vers la page voulue, il suffit dans un premier temps de donner l’url correspondant dans la WebView à la place de notre url d’exemple.
On choisit la première page comme page par défaut.
On a maintenant une navigation fonctionnelle depuis nos barres de navigation.
Si on veut aller plus loin, il nous reste à gérer le cas où l’on serait redirigé vers un autre lien directement depuis notre WebView et pas par les barres de navigation, il faut alors mettre à jour nos barres de navigation pour qu’une icône ne soit plus sélectionnée si on n'est plus sur la bonne url.
Pour cela, on ajoute un coordinateur dans notre structure WebView qui permet de détecter les changements. On envoie alors une notification avec l’url actuelle dès que celle-ci change.
Maintenant, on peut ajouter notre coordinator dans notre contentView et une fonction qui va mettre à jour les barres de navigation à la réception de la notification et donc à chaque changement d’url.
Maintenant que nous avons un Top et BottomBar fonctionnelles, on peut vouloir modifier le css de notre page Ksaar pour, par exemple, enlever le menu de navigation qui est par défaut sur mobile. On peut aussi vouloir enlever la scrollbar qui n’est pas très utile sur une application mobile.
Pour cela, il faut créer notre propre css, dans un nouveau fichier Design.js, que l’on va injecter dans la page :
On peut vouloir récupérer des informations de la WebView directement dans notre application pour pouvoir les utiliser, comme par exemple le mail de l’utilisateur connecté.
Dans cet exemple, nous allons récupérer le mail de l'utilisateur pour afficher la TopBar et la BottomBar uniquement si l’utilisateur est connecté.
Pour cela, on ajoute du javascript dans la fonction WebView de notre classe Coordinator qui permet de récupérer l’email de l’utilisateur qui est dans le localStorage.
On peut maintenant afficher les barres de navigation uniquement dans le cas où l’utilisateur est bien connecté.
On définit alors une variable isUserLoggedIn qui se met à jour quand on reçoit un mail qui n'est pas vide, et on affiche les barres de navigation uniquement dans le cas où cette variable est vraie et donc que notre utilisateur est connecté.
Déclencher une action native à iOS depuis la WebView
Il est possible d’effectuer une action native à iOS depuis un élément intégré à la WebView comme par exemple un bouton. En combinant cela avec la récupération de l’email de l’utilisateur, il est possible par exemple d’ajouter des achats in-app à l’application et de débloquer certaines pages et fonctionnalités à partir de cela.
Dans cet exemple, nous allons voir comment déclencher une alerte iOS native contenant l’email de l’utilisateur à partir d’un bouton directement intégré dans la WebView.
On va commencer par créer un nouveau fichier JavaScript ‘CustomButton.js’ où l’on va créer notre bouton personnalisé que l’on va pouvoir intégrer dans une page.
Vous pouvez personnaliser ce bouton comme vous le souhaitez, ici on lui donne un style similaire aux boutons par défaut sur Ksaar.
Pour ajouter le bouton n’importe où sur l’application Ksaar, il suffit d’ajouter un élément HTML avec le contenu suivant à l'endroit où vous souhaitez placer votre bouton, l'élément sera reconnu grâce à l'id et rempli avec le bouton qu'on a créé :
Pour effectuer une action à partir du bouton, on ajoute dans le javascript une fonction, qui se déclenche au clic sur le bouton, qui envoie un message qui permet d’être reçu et utilisé dans la partie native de notre application. On ajoute le mail de l'utilisateur dans ce message pour l'utiliser.
Dans le fichier CustomButton.js, on ajoute notre fonction au clic dans checkDivInterval :