Mesure et instrumentation
Développement d'un scanner de code à barres et Qr en Ios avec Avfoundation
Table of Contents
Comprendre la base AV pour le balayage du code à barres et du code QR
Pour le code à barres et le balayage de code QR, le cadre expose la classe , qui peut détecter une large gamme de codes lisibles par machine en temps réel à partir du flux de la caméra. Cela inclut les codes QR, EAN-8/13, Code 128, PDF417, Aztec, et de nombreux autres formats. Le cadre gère la lourde levage de l'analyse d'image et le décodage de code, permettant aux développeurs de se concentrer sur la logique d'application plutôt que d'appliquer des algorithmes de numérisation personnalisés.
Le balayage AVFoundation est accéléré sur des appareils modernes, offrant une détection rapide et fiable même dans des conditions d'éclairage difficiles. Il fonctionne avec les caméras avant et arrière, et la zone de détection peut être limitée à une région spécifique d'intérêt pour améliorer les performances et l'expérience utilisateur.
Configuration de la session de capture de caméra
Le noyau de tout scanner basé sur AVFoundation est le . Cet objet orchestre le flux de données depuis l'entrée de la caméra jusqu'à la sortie des métadonnées. La configuration de la session nécessite plusieurs étapes de la plaque de chaudière, qui sont mieux mises en œuvre dans une classe de contrôleur de vue ou gestionnaire dédié.
Demande de permission de caméra
Avant d'accéder à la caméra, vous devez demander la permission de l'utilisateur. À partir d'iOS 10, vous devez inclure la touche dans votre fichier Info.plist avec une chaîne expliquant pourquoi votre application a besoin de la caméra.
AVCaptureDevice.requestAccess(for: .video) { granted in
if granted {
// Configure and start the capture session
} else {
// Show an alert guiding the user to Settings
}
}
Création de l'AVCaptureSession
Une fois la permission accordée, instanciez un . Configurez sa session préréglée pour contrôler la qualité vidéo; pour la numérisation de code-barres, est un bon défaut, mais vous pouvez également utiliser pour un traitement plus rapide.
let session = AVCaptureSession()
session.sessionPreset = .high
Ajout de l'entrée de la caméra
Obtenir le périphérique vidéo par défaut (l'appareil photo arrière) et créer un . Si l'entrée ne peut pas être ajoutée à la session (p. ex., l'appareil est occupé), saisir l'erreur et présenter la rétroaction à l'utilisateur.
guard let camera = AVCaptureDevice.default(for: .video) else { return }
do {
let input = try AVCaptureDeviceInput(device: camera)
guard session.canAddInput(input) else { return }
session.addInput(input)
} catch {
print("Camera input error: \(error.localizedDescription)")
}
Ajout de la sortie de métadonnées
Créez une instance , définissez son délégué (sur une file d'attente série dédiée), et ajoutez-le à la session. Le délégué recevra les objets de métadonnées détectés.
let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
guard session.canAddOutput(metadataOutput) else { return }
session.addOutput(metadataOutput)
// Specify which code types to detect – must be done after the output is added
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128, .pdf417]
Important : doit être défini après que la sortie soit ajoutée à la session. La configuration plus tôt provoquera un crash.
Début de la session
Lancez la session sur un thread de fond pour garder l'interface utilisateur réactive. Appelez dans une file d'attente de l'expédition de fond ou sur une file d'attente série dédiée.
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
}
Mise en œuvre de la méthode déléguée
La méthode de délégation est appelée chaque fois que le scanner détecte un ou plusieurs codes. Cette méthode reçoit un tableau d'instances que vous devez lancer dans pour accéder à la chaîne décodée.
func metadataOutput(_ output: AVCaptureMetadataOutput,
didOutput metadataObjects: [AVMetadataObject],
from connection: AVCaptureConnection) {
// Process only the first detected code (most common pattern)
guard let metadataObject = metadataObjects.first,
let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject,
let stringValue = readableObject.stringValue else { return }
// Use the scanned value (e.g., display, validate, or send to server)
handleScannedCode(stringValue, type: readableObject.type)
}
Il est courant d'arrêter la session après un scan réussi pour empêcher les détections répétées. Appelez après avoir manipulé le code, et redémarrez-le lorsque l'utilisateur réinitialise le scanner.
Manipulation des codes détectés
Une fois que vous avez la valeur de chaîne, déterminez quelles mesures prendre en fonction du type de code et du contenu. Les scénarios communs comprennent :
- URLs – Ouvrez dans Safari ou un navigateur in-app en utilisant .
- Indentifications Wi-Fi – Parcourez le format standard () et connectez-vous programmatiquement (exige un droit additionnel).
- – Consultez les informations sur le produit via une API comme la base de données UPC ou votre propre système d'inventaire.
- Informations de contact – Parse vCard ou MeCard formats et créer un nouveau contact dans le carnet d'adresses.
- Texte enduit – Affichez dans une alerte ou copiez-la au collage.
Pour chaque type de code, validez la chaîne avant le traitement. Les codes malformés ou malveillants doivent être ignorés ou signalés gracieusement.
Meilleures pratiques pour la numérisation des performances
Pour assurer une numérisation fluide et efficace, suivez les lignes directrices suivantes :
- Limiter les types d'objets de métadonnées – Activez uniquement les formats de code dont votre application a réellement besoin. Chaque format supplémentaire ajoute des frais généraux de traitement.
- Faire une région d'intérêt – Utilisez pour définir une petite partie du flux vidéo où les codes sont attendus.
- Utilisez la gravité vidéo correcte – maintient la prévisualisation de la caméra proportionnelle et est idéal pour superposer les guides de zone de balayage.
- Tirer une file d'attente série pour les callbacks délégués – Effectuer un traitement lourd (p. ex., recherche réseau) hors du thread principal pour garder l'interface utilisateur réactive.
- Consider le support de torche – Permettre à l'utilisateur de basculer la torche de la caméra pour les scénarios à faible luminosité.
- Reset scanning after handling – Après un scan réussi, redémarrez la session avec un court délai (p. ex. 1-2 secondes) pour éviter une nouvelle détection immédiate du même code.
Fournir des commentaires aux utilisateurs
Une bonne expérience de numérisation comprend des repères visuels et auditifs. Mettre en œuvre ces mécanismes de rétroaction pour guider l'utilisateur :
- Relace visuelle – Dessiner un rectangle de mise en évidence autour du code détecté en utilisant la propriété de . Cela nécessite la conversion des coordonnées des métadonnées pour afficher les coordonnées via .
- Animation – Jouer une animation subtile (p. ex., une bordure rétrécissante) lorsqu'un code est reconnu.
- Sound – Jouer un son système en utilisant avec un ton court et positif comme (le son --Mail Sent).
- Feedback haptique – Utilisez ou pour une vibration subtile.
- Scan area guide – Affiche un rectangle translucide avec des guides d'angle pour aider les utilisateurs à centrer le code.
Gestion des erreurs et des cas de bord
La manipulation d'erreurs robustes assure que votre scanner se dégrade gracieusement lorsque les choses tournent mal.
- Camera indisponible – Vérifiez et sur l'appareil. Sur iPod touch ou simulateur sans caméra, présentez un message significatif.
- Permission refusée – Afficher une alerte avec un bouton qui ouvre Paramètres via .
- Fraction de configuration de la session[ – Erreurs de log lorsque ou retourne . Cela peut se produire si une autre application utilise la caméra en arrière-plan (rare).
- Images faibles ou floues[ – Réduire la zone de détection d'intérêt et s'assurer que l'autofocus de la caméra est activé.
- Types de code non valides ou non pris en charge – La propriété ne supporte pas tous les formats sur tous les appareils. Utilisez pour demander la compatibilité avant de définir.
Essais sur les appareils
Les performances de numérisation du code-barres AVFoundation varient considérablement selon les générations d'iPhone et d'iPad. Testez votre implémentation sur:
- Appareils plus anciens (iPhone 6s, iPad Air 2) – Ils ont des processeurs plus lents et peuvent se heurter à des préréglages haute résolution. Utilisez pour un équilibre optimal sur les vieux matériels.
- Les appareils avec différentes optiques de caméra – iPhones avec téléphoto ou caméras ultra-large peuvent se concentrer différemment. Utilisez toujours la caméra grand-angle par défaut pour la numérisation de codes-barres.
- Environnements à faible luminosité – Testez dans des conditions démêlées pour s'assurer que la superposition de la scan demeure visible et que la torche fonctionne.
- Différentes tailles de code et orientations – Essayez des codes de 1 cm × 1 cm autocollants aux grandes affiches, et testez le paysage vs le portrait scanné.
Considérations avancées
Pour les applications de production, envisagez d'ajouter des fonctionnalités comme la numérisation continue (permettant plusieurs codes en une session), les commandes de zoom ou l'intégration avec ARKit pour les superpositions de réalité augmentée. Si vous devez traiter des codes à partir d'images fixes (p. ex., bibliothèque photo), utilisez ou du cadre Vision, bien que AVFoundation soit généralement plus rapide pour la vidéo en temps réel.
Pour une plongée plus profonde dans la configuration AVFoundation, reportez-vous à Apples Setting Up a Capture Session guide et le AVCaptureMetadataDocumentation d'extrant. Vous pouvez également trouver un projet d'échantillon complet dans l'article Scanning Barcodes avec AVCaptureMetadataOutput.
En suivant ces lignes directrices et en testant votre implémentation, vous pouvez fournir un code-barres et un scanner QR haute performance qui améliore votre application iOS et sa fiabilité.