You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic iOS应用扫描二维码获取指定十进制字节数组求助

iOS端PhoneGap条码扫描器获取二维码原始字节数组解决方案

问题核心

iOS端PhoneGap条码扫描器默认返回解码后的字符串,而非原始字节数组;安卓可通过intent.getByteArrayExtra('SCAN_RESULT_BYTE_SEGMENTS_0')直接获取目标数据,但iOS需通过AVMetadataMachineReadableCodeObject的公开API提取并转换数据。

具体解决方案

1. 自定义iOS扫描插件逻辑,提取原始字节数据

修改PhoneGap条码扫描器的iOS插件实现,调用AVMetadataMachineReadableCodeObject的rawBytes公开属性(避免私有属性带来的审核风险)获取原始NSData:

// 在扫描结果回调中获取原始数据
AVMetadataMachineReadableCodeObject *codeObject = notification.object;
NSData *rawData = codeObject.rawBytes;

if (!rawData) {
    CDVPluginResult *errorResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"无法获取原始字节数据"];
    [self.commandDelegate sendPluginResult:errorResult callbackId:command.callbackId];
    return;
}

2. 转换为预期格式(十六进制字符串/十进制字节数组)

根据需求将NSData转换为对应格式:

转十六进制字符串(匹配你提供的预期格式)

NSMutableString *hexStr = [NSMutableString stringWithCapacity:rawData.length * 2];
const unsigned char *bytes = rawData.bytes;
for (NSInteger i = 0; i < rawData.length; i++) {
    [hexStr appendFormat:@"%02X", bytes[i]];
}

转十进制字节数组

NSMutableArray *byteArray = [NSMutableArray arrayWithCapacity:rawData.length];
const unsigned char *bytes = rawData.bytes;
for (NSInteger i = 0; i < rawData.length; i++) {
    [byteArray addObject:@(bytes[i])];
}

3. 统一跨平台返回字段

将转换后的数据通过SCAN_RESULT_BYTE_SEGMENTS_0字段返回给前端,与安卓端保持一致:

CDVPluginResult *result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:@{
    @"SCAN_RESULT_BYTE_SEGMENTS_0": hexStr, // 或byteArray,根据前端需求选择
    @"format": @"QR_CODE",
    @"cancelled": @NO
}];
[self.commandDelegate sendPluginResult:result callbackId:command.callbackId];

4. 前端Ionic统一处理

无需区分平台,直接读取返回字段并验证数据长度:

cordova.plugins.barcodeScanner.scan(
    (res) => {
        const rawHex = res.SCAN_RESULT_BYTE_SEGMENTS_0;
        // 验证长度(180字节对应360位十六进制字符串)
        if (rawHex.length !== 360) {
            console.error("数据长度不符,预期180字节");
            return;
        }
        // 转换为十进制字节数组(若需要)
        const byteArray = [];
        for (let i = 0; i < rawHex.length; i += 2) {
            byteArray.push(parseInt(rawHex.substr(i, 2), 16));
        }
        // 后续业务逻辑
    },
    (err) => console.error("扫描失败:", err),
    { formats: "QR_CODE" }
);

注意事项

  • 禁止使用_internal.basicDescriptor.BarCodeRawData等私有属性,否则会导致App Store审核被拒
  • 测试时对比转换后的十六进制字符串与你提供的预期值是否完全一致
  • 确保二维码本身编码正确,无数据截断或格式错误

内容的提问来源于stack exchange,提问作者Cap-7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:30