import CapabilityQRCode
let qrCodeService = QRCodeServiceFactory.getInstance()
qrCodeService.scanQRCode(viewController: self) { response in
if response.success {
// 扫码成功
let qrCodeContent = response.data
print("扫码结果: \(qrCodeContent ?? "")")
} else {
// 扫码失败或取消
let error = response.errorMessage
print("扫码失败: \(error ?? "")")
}
}
import UIKit
import CapabilityQRCode
class ViewController: UIViewController {
private let qrCodeService = QRCodeServiceFactory.getInstance()
@IBAction func scanButtonTapped(_ sender: UIButton) {
qrCodeService.scanQRCode(viewController: self) { response in
self.handleScanResult(response)
}
}
private func handleScanResult(_ response: QRCodeResponse) {
if response.success {
guard let content = response.data else { return }
// 处理扫码结果
processQRCode(content)
} else {
// 处理错误
showError(response.errorMessage)
}
}
private func processQRCode(_ content: String) {
// 业务逻辑处理
print("二维码内容: \(content)")
}
private func showError(_ message: String?) {
let alert = UIAlertController(
title: "扫码失败",
message: message ?? "未知错误",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "确定", style: .default))
present(alert, animated: true)
}
}
public protocol QRCodeService {
/// 生成二维码
func generateQRCode(content: String, size: CGFloat) -> UIImage?
/// 扫描二维码
func scanQRCode(viewController: UIViewController, callback: @escaping (QRCodeResponse) -> Void)
/// 识别图片中的二维码
func recognizeQRCode(image: UIImage, callback: @escaping (QRCodeResponse) -> Void)
}
public struct QRCodeResponse {
public let success: Bool // 是否成功
public let data: String? // 二维码内容
public let errorCode: Int? // 错误码
public let errorMessage: String? // 错误消息
public let timestamp: Int64 // 时间戳
}
在项目中集成华为 Scan Kit Framework
ScanKitFrameWork.framework 和 ScanKitFrameWorkBundle.bundle 添加到项目配置 Info.plist
NSCameraUsageDescription在 Info.plist 中添加:
<key>NSCameraUsageDescription</key>
<string>需要相机权限来扫描二维码</string>
华为 Scan Kit Framework:如果项目中没有集成华为 Scan Kit Framework,代码会自动降级使用系统原生 AVFoundation 实现
权限处理:扫码功能会自动请求相机权限,如果用户拒绝权限,会返回相应的错误信息
线程安全:所有回调都在主线程执行,可以直接更新 UI
单例模式:QRCodeService 是单例,多个界面可以共享同一个服务实例
如果没有集成华为 Scan Kit Framework,代码会自动使用系统原生 AVFoundation 实现扫码功能,确保功能可用。