AVFoundation for Barcode and QR Code Scanning

Rangka kerja AVFoundation Apple menyediakan antarmuka tingkat-penuh untuk bekerja dengan media audiovisual pada perangkat iOS. Untuk pemindaian kode barcode dan QR, kerangka kerja mengekspos kelas , yang dapat mendeteksi berbagai macam kode yang dapat dibaca mesin dalam waktu nyata dari feed kamera. Ini termasuk kode QR, EAN-8/13, Kode 128, PDF417, Aztek, dan banyak format lainnya. Kerangka kerja menangani angkat berat analisis dan kode decoding, memungkinkan pengembang untuk fokus pada aplikasi logika daripada menerapkan algoritma kustom scanning.

Pemindaian AVFoundation adalah perangkat keras ⁇ accelered pada perangkat modern, menawarkan deteksi cepat dan tepercaya bahkan dalam kondisi pencahayaan yang menantang. Alat ini bekerja dengan kamera depan maupun belakang, dan area deteksi dapat dibatasi ke wilayah spesifik kepentingan untuk meningkatkan kinerja dan pengalaman pengguna.

\"Membentuk Sesi Tangkap Kamera\"

core AVFoundation ⁇ based scanner adalah . Objek ini mengatur ulang aliran data dari masukan kamera ke keluaran data meta. Menetapkan sesi memerlukan beberapa langkah boilerplate, yang terbaik diimplementasikan dalam kelas pengatur tampilan atau manajer yang berdedikasi.

Meminta Izin Kamera LUAR

Sebelum mengakses kamera, Anda harus meminta izin pengguna. Mulai di iOS 10, Anda perlu memasukkan kunci di berkas Info.plist Anda dengan string menjelaskan mengapa aplikasi Anda membutuhkan kamera. Izin diminta menggunakan . Menangani kedua kasus ⁇ diberikan dan ditolak ⁇ dan memperbarui UI Anda sesuai.

AVCaptureDevice.requestAccess(for: .video) { granted in
 if granted {
 // Configure and start the capture session
 } else {
 // Show an alert guiding the user to Settings
 }
}

ukraine. kgm

Setelah izin diberikan, instantiate an . Atur preset sesinya untuk mengontrol kualitas video; untuk scanning barcode, adalah default yang baik, tetapi anda juga dapat menggunakan untuk pemrosesan yang lebih cepat.

let session = AVCaptureSession()
session.sessionPreset = .high

* Menambahkan Masukan Kamera *

OWOWO Obtain perangkat video default (kamera belakang) dan membuat . Jika masukan tidak dapat ditambahkan ke sesi (misalnya, perangkat sibuk), menangkap kesalahan dan hadir umpan balik ke pengguna.

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)")
}

Memtambahkan Output Metadata

ifrica Cipta sebuah kejadian , setkan delegasinya (pada antrian serial yang telah didedikasikan), dan tambahkannya ke sesi. Delegasi akan menerima objek data meta yang terdeteksi.

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]

Penting: harus ditetapkan setelah output ditambahkan ke sesi. Menetapkannya sebelumnya akan menyebabkan kecelakaan.

Dia memulai sesinya.

¡Ogody Jalankan sesi pada benang latar belakang untuk menjaga responsif UI. Call dalam antrian pengiriman latar belakang atau pada antrian serial yang didedikasikan.

DispatchQueue.global(qos: .userInitiated).async {
 session.startRunning()
}

Mengimplementasi Metode Delegasi

Metode delegasikan disebut kapan pun pengimbas mendeteksi satu atau lebih kode. Metode ini menerima urutan dari kejadian , yang perlu Anda cast ke untuk mengakses string yang didekode.

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)
}

Hal ini umum dilakukan untuk menghentikan sesi setelah pemindaian sukses untuk mencegah deteksi berulang. Call setelah menangani kode, dan memulai ulang ketika pengguna me-reset scanner.

Kode - Kode yang Dikesan Penanganan Ego

Setelah Anda memiliki nilai string, menentukan tindakan apa yang akan diambil berdasarkan jenis kode dan konten.

  • [[GALALT:0]]URL ⁇ Buka di Safari atau di dalam ⁇ app browser menggunakan .
  • Ewan Wi ⁇ Fi klime ⁇ Parse format standar (]) dan menyambung secara program secara otomatis (perlu tambahan entitlement).
  • [[CALT:0]]Product codes ⁇ Cari informasi produk melalui API seperti UPC Database[ atau sistem inventaris sendiri.
  • [[CharseFLT:0]]Contact information[ ⁇ Parse vCard atau format MeCard dan membuat kontak baru dalam buku alamat.
  • Plain teks ⁇ Tampilan dalam alert atau salin ke pasteboard.

Untuk setiap jenis kode, validasi string sebelum diproses. Kode cacat atau jahat harus diabaikan atau dilaporkan dengan anggun.

Praktek Terbaik untuk Mengimbas Prestasi

Untuk memastikan pemindaian yang lancar dan efisien, ikuti pedoman ini:

  • [[GANDAFLT:0]]Limit tipe objek data meta ⁇ Hanya aktifkan format kode aplikasi Anda yang sebenarnya diperlukan. Setiap format tambahan menambahkan pemrosesan overhead.
  • Set a region of interest ⁇ Gunakan untuk mendefinisikan sebagian kecil dari video feed di mana kode diharapkan. Ini secara dramatis meningkatkan kecepatan deteksi dan mengurangi positif palsu.
  • [[EfronFLT:0]]Gunakan gravitasi video yang benar ⁇ membuat kamera tetap pratinjau proporsional dan ideal untuk overlaying scan ⁇ area panduan.
  • [[EUGAL:0]]Liverage a seried queue for delegation callbacks]] ⁇ Lakukan pengolahan berat (mis., pencarian jaringan) off thread utama untuk menjaga responsif UI.
  • [[EfolfLT:0]]Consider torbor support ⁇ Izinkan pengguna untuk menjungkitkan obor kamera untuk skenario rendah ⁇ cahaya. Periksa sebelum toggling.
  • [[ObleofFLT:0]] Reset scanning setelah penanganan]] ⁇ Setelah sukses scan, memulai ulang sesi dengan jeda singkat (mis., 1 ⁇ detik) untuk mencegah re ⁇ detection segera dari kode yang sama.

Umpan Umpan Umpan Pengguna yang Mengancam Kebidanan

Pengalaman pemindaian yang baik mencakup isyarat visual dan audit. Implementasi mekanisme umpan balik ini untuk membimbing pengguna:

  • [[GALALT:0]]Visual overlay]] ⁇ Gambar sebuah kotak sorot di sekitar kode yang terdeteksi menggunakan milik . Ini memerlukan konversi koordinat data meta untuk melihat koordinat melalui .
  • [[CUALLAST:0]]Animasi ⁇ Mainkan animasi halus (contoh, perbatasan mengecil) ketika sebuah kode diakui.
  • [[EflearFLT:0]]Sound ⁇ Mainkan suara sistem menggunakan dengan nada pendek dan positif seperti (suara \"Mail Sent”).
  • [[Efleksif:0]]Haptic feedback[ ⁇ Gunakan atau untuk getaran halus.
  • [[EfleksifLT:0]]Scan area guide ⁇ Tampilkan persegi panjang transparan dengan panduan sudut untuk membantu pengguna pusat kode.

Kesalahan Penanganan dan Kasus Pinggiran

Kesalahan penanganan bius morfolosis memastikan pengimbas Anda menurun dengan anggun ketika sesuatu menjadi salah.

  • [[EUBNFLT:0]]Camera avaable]] ⁇ Periksa dan pada perangkat. Pada iPod touch atau simulator tanpa kamera, hadirkan pesan berarti.
  • [[Eflat:0]]Permission negative ⁇ Tampilkan peringatan dengan tombol yang membuka Pengaturan melalui .
  • [[NezronFLT:0]]Session konfigurasi gagal ⁇ Log errors when atau mengembalikan . Hal ini dapat terjadi jika aplikasi lain menggunakan kamera di belakang (rare).
  • [[EUZALT:0]]Low cahaya atau gambar kabur ⁇ Kurangi wilayah deteksi bunga dan pastikan autofocus kamera diaktifkan. Maklum pengguna untuk meningkatkan cahaya atau menstabilkan perangkat.
  • KATA [[CANDAFLT:0]]Invalid atau code types tidak didukung ]] ]] ]] ]] ]] ]] Properti tidak boleh mendukung semua format pada semua perangkat. Gunakan untuk menanyakan keserasian sebelum penetapan.

Menguji Berbagai Perangkat Seberang

AVAFoundation barcode kinerja pemindaian bervariasi secara signifikan di seluruh generasi iPhone dan iPad. Uji implementasi Anda pada:

  • Perangkat lebih tua (iPhone 6s, iPad Air 2) ⁇ Perangkat yang lebih lambat dan mungkin berjuang dengan preset Øresolution tinggi. Gunakan untuk keseimbangan optimal pada perangkat keras yang lebih tua.
  • Perangkat dengan optik kamera yang berbeda ⁇ iPhone dengan telephoto atau kamera ultra ⁇ lebar mungkin berfokus secara berbeda. Selalu gunakan kamera lebar ⁇ sudut baku untuk pemindaian barcode.
  • Lingkungan rendah ⁇ cahaya ⁇ Uji dalam kondisi redup untuk memastikan overlay pemindaian tetap terlihat dan torch togol berfungsi.
  • Berbagai ukuran kode dan orientasi ⁇ Coba kode dari 1 cm × 1 cm stiker ke poster besar, dan uji lanskap vs potret scanning.

Pertimbangan lanjutan fusion

Untuk aplikasi produksi anime, pertimbangkan penambahan fitur seperti pemindaian berkelanjutan (memungkinkan kode ganda dalam satu sesi), kontrol zoom, atau integrasi dengan ARKit untuk overlay realitas teraugmented. Jika Anda perlu memproses kode dari gambar yang masih ada (misalnya, perpustakaan foto), gunakan atau dari kerangka Vision, meskipun AVFoundation umumnya lebih cepat untuk video real ⁇ time.

Untuk menyelam lebih dalam konfigurasi AVFoundation, mengacu pada Apple Setting Up a Capture Session panduan dan AVCaptureMetadataOutput dokumentasi. Anda juga dapat menemukan proyek sampel lengkap dalam Scanning Barcodes with AVCaptureMetadataOutput] article.

Dengan mengikuti pedoman ini dan secara menyeluruh menguji implementasi Anda, Anda dapat mengirimkan barcode dan scanner kode QR yang dipoles dan memiliki performa tinggi serta kode QR yang meningkatkan kemampuan dan keandalan aplikasi iOS Anda.