Librairies

Un pari sur l'avenir (2012 – 2025)

Pendant mes années de développement, je me suis retrouvé à créer plusieurs librairies réutilisables. Celles-ci m’ont évité de réinventer la roue à chaque nouvelle app, j’espère qu’elles pourront être utiles dans tes projets !

Bien que je n’ai pas encore choisi de licence prédéfinie telle que MIT ou GPL3, j’en cherche actuellement une qui ne poserait aucune contrainte pour les développeur•euses indépendant•es mais empecherait les grandes sociétés tech de les utiliser. Si vous en connaissez une qui pourrait correspondre tout en étant compatible avec la distribution sur AppStore, je suis tout ouïe !

Shush

Shush est ton libraire favori. Son but est de gérer tes besoins de persistence simples avec précision.

Tu as déjà eu des préférences utilisateur que tu voulais synchroniser sans trop avoir à y reflechir ? Et une liste des 30 dernières recherches faites par tes utilisateurs dans ton app ? Ou des données utilisateur pas trop lourdes que tu veux persister et synchroniser via iCloud ?

Tout cela est géré avec simplifié, en faisant au mieux pour rester hors de ton chemin.

import Shush

extension NSNotification.Name {
    static let settingsChanged = NSNotification.Name("settings_changed")
}

struct Preferences {
    let shared = Preferences()

    @ShushValue(key: "using_dark_theme", defaultValue: false, notification: .settingsChanged)
    var usingDarkTheme: Bool
}

PPMGobbler

Décodage et encodage de fichiers PBM, PGM et PPM, format binaire ou ASCII, avec un support complet P1, P2, P3, P4, P5 et P6 !

let imageData = try Data(contentsOf: URL(fileURLWithPath: "/path/to/my/image"))

// read RGB, grey levels or black and white image
let ppmImage = try PPMImage<PPMPixelRGB>(data: imageData)
let pgmImage = try PPMImage<PPMPixelGrey>(data: imageData)
let pbmImage = try PPMImage<PPMPixelBW>(data: imageData)

// Access pixels
let firstPixelRedValue = ppmImage[0, 0].r

// Display (UIImage and NSImage support is available)
myUIImageView.image = ppmImage.uiImage
myNSImageView.image = ppmImage.nsImage

SaneSwift

Le cerveau derrière Backlit. Cette librairie te permet de facilement intégrer SANE et le backend net dans ton app iOS !

SaneSetLogLevel(0)
SaneLogger.externalLoggingMethod = { level, message in
    guard level >= .error else { return }
    print(message)
}

Sane.shared.configuration.hosts = [.init(hostname: "192.168.13.12", displayName: "My Server")]
Sane.shared.updateDevices { result in
    switch result {
    case .success(let devices):
        print("Found devices:", devices)

    case .failure(let error):
        print("Encountered error:", error)
    }
}

Disco

Librairie Swift permettant plusieurs opérations réseau, telles que :

  • lister les interfaces disponibles sur l’appareil, ainsi que leur adresse et masque IP
  • pinger toutes les potentielles IPv4 sur le réseau d’une interface
  • utiliser Bonjour avec les services courants pour determiner le nom d’hôte associable à une adresse IP
  • surveiller à intervalles réguliers si un hôte est joignable sur un port donné ou pas, pour plusieurs paires à la fois

SYEmailHelper

Détecter facilement les clients emails installés et permettre aux utilisateur•ices d’en selectionner un pour vous envoyer un email.

Je l’utilise pour ajouter rapidement une fonctionnalité “Me contacter” dans mes apps. Aujourd’hui les types de services détectés sont :

  • le compositeur natif in-app
  • les apps tierces
  • dernier recourt : copier l’adresse email dans le presse papier, laissant l’utilisateur•ice utiliser une app non supportée

SYPictureMetadata

Lire et modifier les métadonnées d’images via ImageIO avec simplicité.

let metadata = try! SYMetadata(fileURL: imageURL)
metadata.metadataIPTC = metadata.metadataIPTC ?? SYMetadataIPTC()
metadata.metadataIPTC?.keywords  = ["Some test keywords", "added by SYMetadata example app"];
metadata.metadataIPTC?.city      = "Lyon";
metadata.metadataIPTC?.credit    = "© Me 2017";
    
let originalImageData = try! Data(contentsOf: imageURL)
let imageDataWithMetadata = try! metadata.apply(to: originalImageData)

SYOperationQueue

Une file d’opérations permettant une priorisation LIFO avec un nombre maximum d’opérations.

Je l’ai créé pour charger des images dans une UICollectionView en scrollant. Configuré correctement ceci permet de déclencher le charger des images à afficher en priorisant les images nécessaires les plus rapidement (et donc les dernières demandées).