对于扫描的使用本文不做介绍,大家有需要的话可以去看看CIDetector的使用方式, iOS获取相册中的二维码图片,在iOS6以后可以使用CIDetector类,但是这个类只能识别二维码图片,条形码目前暂不支持。并且手机拍照的图片取出成功率比较低。
读取相册中的二维码/条形码,可以使用ZBarSDK,由于要上架新APP,但发现APP中ZBarSDK/libzbar.a库中包含uiwebview,现在苹果新APP上架禁用uiwebview,但网上基本没有不包含uiwebview的库,至此只能自己寻找源码修改后打包成静态库替换ZBarSDK中的libzbar.a,并将ZBarSDK中的所有UIWebView都改掉。
最新的依赖文件可以到这个地址提取,提取码: gd6i
使用方法:
- 直接将ZBarSDK文件引入项目
- 在桥接文件中引入头文件
#import "ZBarSDK.h"
- 点击对应的按钮打开相册选取条形码或二维码
//选取相册
func getPicker(){//判断设置是否支持图片库if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){//zBar识别条形码和二维码let imagePicker = ZBarReaderController();imagePicker.showsHelpOnFail = false;imagePicker.sourceType = .photoLibraryimagePicker.delegate = selfimagePicker.allowsEditing = trueimagePicker.modalPresentationStyle = .currentContextself.present(imagePicker, animated: true, completion: nil)}else{print("读取相册错误")}
}
- 在使用的swift文件中实现协议ZBarReaderDelegate,UIImagePickerControllerDelegate
- 实现点击取消的方法
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {picker.dismiss(animated: true, completion: nil)//此处代码是由于iOS进入后台时会自动停止扫描,这行代码是唤醒扫描的方法startRunning()
}
- 未扫描到条形码或二维码的回调方法
func readerControllerDidFail(toRead reader: ZBarReaderController!, withRetry retry: Bool) {showToast(message: "未在图中发现二维码或条形码", fromeSuperView: view)startRunning()self.dismiss(animated: true, completion: nil)
}
- 扫描到条形码或二维码的回调方法
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {// zBar识别条形码和二维码let results: [ZBarSymbol] = info[UIImagePickerController.InfoKey(rawValue: ZBarReaderControllerResults)] as! [ZBarSymbol]for symbol in results {// 使用返回的条形码或二维码的值self.delegate?.returnUrl(url: symbol.data ?? "")break}picker.dismiss(animated: true, completion: nil)
}
到此,在相册中识别条形码和二维码的功能就实现了