info.plist a disparu

Pour certains projets crées avec XCode 13, l’application ne génère plus de fichier info.plist. Au lieu de cela, vous pouvez accéder aux paramètres de ce fichier dans l’onglet Infos de la Target :

Custom iOS Target Properties dans l'onglet Info
Custom iOS Target Properties dans l’onglet Info

Afficher du HTML dans SwiftUI

La vue texte de SwiftUI ne permet pas (encore) d’afficher du texte enrichi. C’est l’occasion de créer une vue sur mesure, basée sur une vue existante de l’UIKit.
UILabel permet l’affichage de texte enrichi, et la classe NSAttributedString peut convertir du html.

Commençons par créer un wrapper pour la vue UILabel. On utilise pour cela le protocole UIViewRepresentable.

Lire la suite Afficher du HTML dans SwiftUI

Les erreurs ‘CDVPlugin.h’ file not found et Missing dependency target CordovaLib

Si vous rencontrez l’une de ces erreurs lors de la compilation d’un projet iOS produit par ionic/cordova, votre projet est abimé et doit être recréé. Le contenu du dossier CordovaLib dans platforms/ios/ est manquant ou incomplet.

La solution est simple. Supprimez et ajoutez la plateforme de cette manière :

ionic cordova platform rm ios
ionic cordova platform add ios

Vous pouvez alors compiler ( build ) le projet.

Xcode 10 Object Library

Petit moment de frustration lors de l’édition d’un Storyboard dans XCode 10. La bibliothèque d’objets, habituellement située dans la colonne de droite sous les propriétés a disparu.

Elle est désormais accessible avec la bibliothèque des médias par ce bouton situé dans la barre de titre à droite.

Elle fonctionne comme un panneau temporaire qui disparait après utilisation. Si vous voulez qu’elle reste en permanence sur l’écran, appuyez sur option (⌥) en cliquant sur le bouton.

Les raccourcis pour accéder aux différentes bibliothèques

  • ⌘⇧L ouvre la bibliothèque d’objets temporaire.
  • ⌥⌘⇧L ouvre la bibliothèque d’objets permanente.
  • ⌘⇧M ouvre la bibliothèque de médias temporaire.
  • ⌥⌘⇧M ouvre la bibliothèque de médias permanente.

Swift: Que faire d’un objet ‘Unmanaged’

Aux débuts d’Objective-C et de Cocoa, les développeurs devaient gérer eux-mêmes les allocations et libérations de mémoires pour leurs objets avec les méthodes alloc, retain, release.

À chaque emplacement de mémoire est associé un compteur de références, chaque appel à alloc ou retain augmente ce compteur, chaque appel à release diminue ce compteur. Lors d’un release, si le compteur passe à zéro, ça signifie qu’aucun objet dans le code ne fait plus référence à cet emplacement. Il doit donc être libéré. Si le compteur est encore supérieur à zéro, release ne fait rien.

Avec l’ARC (Automatic Reference counting), le compilateur se charge de placer lui-même ces mêmes méthodes aux endroits appropriés, évitant ce travail aux développeurs, et garantissant un équilibre parfait entre les retain et les release. Sauf que pas toujours…

Certaines fonctions fournies par les frameworks d’Apple peuvent vous retourner des Unmanaged. Vous devez pour ces objets décider de la stratégie à adopter. C’est notamment le cas lors que vous manipulez des objets issus de Core Graphics (CG…) ou Core Foundation (CF…).

Exemple, dans la classe AVCapturePhoto :

func cgImageRepresentation() -> Unmanaged<CGImage>?

Cette fonction retourne une Unmanaged CGImage.

Pour récupérer l’objet CGImage lui-même, il faut faire appel à l’une des deux fonctions
takeUnretainedValue() qui n’incrémente pas le compteur de référence
takeRetainedValue() qui incrémente le compteur de référence.

Mais laquelle utiliser ?

En règle générale, si le nom de la fonction qui retourne l’objet Unmanaged contient Create ou Copy, vous utiliserez takeRetainedValue(), sinon c’est takeUnretainedValue() qui convient.

Dans cet exemple :

...
let unmanagedCGImage = capturePhoto.cgImageRepresentation()
let cgImage = unmanagedCGImage.takeUnretainedValue()
...