扫描此(https://www.barcoderobot.com/static/bcgen/01026/478064310081_3b120.jpg?preview=True)条形码我们应该得到以下结果:47806431008
使用iOS7 api读取条形码,我得到以下结果:047806431008
任何想法如何处理这个?
部分代码:
CGRect highlightViewRect = CGRectZero;
AVMetadataMachineReadableCodeObject *barCodeObject;
NSString *detectionString = nil;
NSArray *barCodeTypes = @[AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code,
AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode];
for (AVMetadataObject *metadata in metadataObjects) {
for (NSString *type in barCodeTypes) {
if ([metadata.type isEqualToString:type])
{
barCodeObject = (AVMetadataMachineReadableCodeObject *)[_prevLayer transformedMetadataObjectForMetadataObject:(AVMetadataMachineReadableCodeObject *)metadata];
highlightViewRect = barCodeObject.bounds;
detectionString = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
break;
}
}
if (detectionString != nil)
{
[_session stopRunning];
[self scanResult:detectionString];
break;
}
我发现了这个问题。 Apple只需添加一个前导零即可将每个UPC-A条形码转换为EAN13。
解决方案是验证条形码是否为EAN13,并且如果字符串结果具有前导零,则可以安全地将其移除并获得UPC-A条形码。
if(detectionString!=nil){
if([metadata.type isEqualToString:AVMetadataObjectTypeEAN13Code]){
if ([detectionString hasPrefix:@"0"] && [detectionString length] > 1)
detectionString = [detectionString substringFromIndex:1];
}
}
更多信息:http://www-01.ibm.com/support/docview.wss?uid=pos1R1002813
根据统一代码委员会,根据定义,以零开头的EAN-13条形码是12位UPC-A条形码。要遵循此规则,当扫描仪设备读取以零开头的EAN-13条形码时,它会丢弃前导0,将条形码截断为12位数,并将UPC-A(而不是EAN-13)指示符附加到标签上,在将标签传递给操作系统之前。因此,操作系统无法识别扫描仪设备传递给它的这个UPC-A标签最初是一个以零开头的EAN-13标签。
如果有人对swift版本感兴趣。
Swift 3.1:
guard let barcodeReadable = barcodeData as? AVMetadataMachineReadableCodeObject else {
return
}
guard var barcode = barcodeReadable.stringValue else {
return
}
if barcodeReadable.type == AVMetadataObjectTypeEAN13Code && barcode.hasPrefix("0"){
let index = barcode.index(barcode.startIndex, offsetBy: 1)
barcode = barcode.substring(from: index)
}
正如Sandro&Gunn Varot:
解决方案是验证条形码是否为EAN13。
此代码适用于Swift 4.2版本:
if let metadataObject = metadataObjects.first {
guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
guard var stringValue = readableObject.stringValue else { return }
if readableObject.type == AVMetadataObject.ObjectType.ean13 && stringValue.hasPrefix("0"){
let index = stringValue.index(stringValue.startIndex, offsetBy: 1)
stringValue = String(stringValue[index...])
}