对于扫描的使用本文不做介绍,大家有需要的话可以去看看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 = .photoLibrary
imagePicker.delegate = self
imagePicker.allowsEditing = true
imagePicker.modalPresentationStyle = .currentContext
self.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)
}
到此,在相册中识别条形码和二维码的功能就实现了