| 庫 | 特點 | GitHub Stars |
| EFQRCode | 生成/識別雙支持、Swift 純原生、支持圖片水印 | 3.5k+ |
| QRCodeReader.swift | 簡潔封裝、支持相冊選圖、燈光切換、代理回調 | 2.8k+ |
| MTBBarcodeScanner | ObjC 老牌、穩定、支持連續掃描、自定義覆蓋層 | 1.2k+ |
| Vision 框架 (iOS 11+) | Apple 官方 ML 視覺框架、離線、高精度、支持文本/人臉/條碼統一 API | 內置 |
3. 相冊選圖識別核心代碼
// 1. 打開相冊
let picker = UIImagePickerController()
picker.sourceType = .photoLibrary
picker.delegate = self
present(picker, animated: true)
// 2. 委托方法中識別
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
guard let image = info[.originalImage] as? UIImage,
let ciImage = CIImage(image: image) else { return }
let request = VNDetectBarcodesRequest { request, error in
guard let results = request.results as? [VNBarcodeObservation] else { return }
for result in results {
print("掃碼結果: \(result.payloadStringValue ?? "")")
}
}
let handler = VNImageRequestHandler(ciImage: ciImage)
try? handler.perform([request])
picker.dismiss(animated: true)
}
4. 手電筒控制
guard let device = AVCaptureDevice.default(for: .video), device.hasTorch else { return }
try? device.lockForConfiguration()
device.torchMode = device.torchMode == .on ? .off : .on
device.unlockForConfiguration()
集成清單
Info.plist 添加 NSCameraUsageDescription、NSPhotoLibraryUsageDescription。
- 引入庫(CocoaPods/SPM):
pod 'QRCodeReader.swift'。
- 自定義掃描頁 UI(覆蓋層、提示框、燈光按鈕)。
- 測試:暗光、反光、異形碼、相冊圖片、長距離。
避坑指南
- 模擬器**無相機**,必須真機調試。
- iOS 10+ 必須聲明權限描述,否則 Crash。
- 相冊選圖識別依賴
Vision 框架 (iOS 11+),舊版本需用 CIDetector (較慢、準確率低)。
- 外部掃碼槍通常模擬鍵盤輸入(HID 模式),焦點在輸入框時自動填入,無需特殊代碼。
推薦直接集成 **QRCodeReader.swift** 或 **Vision 框架**,幾十行代碼覆蓋全部需求,維護成本極低。
- 上一篇文章: Fedora 22 雙系統啟動異常:grub-install 目標應為 /dev/sda 而非分區
- 下一篇文章: C++ 迭代器解引用調用 size() 報錯:優先級問題,需加括號或用 ->
Copyright ©
程式碼之家 All Rights Reserved