uni-app app端专用扫码组件Barcode报Bug:autostart参数设为false时,ios端不能通过start方法开启扫码

uni-app app端专用扫码组件Barcode报Bug:autostart参数设为false时,ios端不能通过start方法开启扫码

开发环境 版本号 项目创建方式
Mac 10.15.5 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

PC开发环境操作系统版本号:10.15.5

HBuilderX类型:正式

HBuilderX版本号:3.1.22

手机系统:iOS

手机系统版本号:IOS 14

手机厂商:苹果

手机机型:iphone 6s

页面类型:nvue

打包方式:云端

项目创建方式:HBuilderX

## 示例代码:

```html
<template>
<view>
<barcode id='1' class="barcode" autostart="false" ref="barcode" background="rgb(0,0,0)" frameColor="#1C86EE" scanbarColor="#1C86EE" :filters="fil" [@marked](/user/marked)="success1" [@error](/user/error)="fail1"></barcode>
<button class="btn" [@click](/user/click)="toStart">开始扫码识别</button>
<button class="btn" [@click](/user/click)="tocancel">取消扫码识别</button>
<button class="btn" [@click](/user/click)="toFlash">开启闪光灯</button>
<button class="btn" [@click](/user/click)="toscan">预览</button>
</view>
</template> 
<script>
export default {
onLoad() {  
},  
data() {  
    return {  
        fil: [0, 2, 1]  
    }  
},  

methods: {  
    success1(e) {  
        console.log("success1:" + JSON.stringify(e));  
    },  
    fail1(e) {  
        console.log("fail1:" + JSON.stringify(e));  
    },  
    toStart: function() {  
        this.$refs.barcode.start({  
            conserve: true,  
            filename: '_doc/barcode/'  
        });  
    },  
    tocancel:function(){  
        this.$refs.barcode.cancel();  
    },  
    toFlash: function() {  
        this.$refs.barcode.setFlash(true);  
    },  

    toscan: function() {  
        console.log("scan:");                  
        const barcodeModule = uni.requireNativePlugin('barcodeScan');  
        barcodeModule.scan("/static/barcode1.png"  
        ,(e)=>{  
            console.log("scan_error:"+JSON.stringify(e));  
        });  
    }  
}  
</script> 
.barcode {
width: 750rpx;
height: 700rpx;
background-color: #808080;
}

.btn {  
top: 20rpx;  
width: 730rpx;  
margin-left: 10rpx;  
margin-top: 10rpx;  
background-color: #458B00;  
border-radius: 10rpx;  
}

操作步骤:

使用上述示例代码,真机运行或打包运行在IOS上,点击“开始扫码识别”

预期结果:

可以启动扫码

实际结果:

无法扫码

bug描述:

我用的是barcode组件中给的示例代码,只是把autostart参数改成了false,打包在IOS上运行,点击“开始扫码识别”无法启动扫码


更多关于uni-app app端专用扫码组件Barcode报Bug:autostart参数设为false时,ios端不能通过start方法开启扫码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

你这个咋解决的

更多关于uni-app app端专用扫码组件Barcode报Bug:autostart参数设为false时,ios端不能通过start方法开启扫码的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的 iOS 端兼容性问题。当 barcode 组件的 autostart 参数设置为 false 时,iOS 设备上调用 start() 方法确实无法正常启动扫码功能。

问题原因: iOS 平台对相机权限和初始化流程有更严格的限制。当 autostart="false" 时,组件初始化后相机资源未被正确预加载,导致后续手动调用 start() 方法时无法正常激活摄像头。

临时解决方案:

  1. 使用 autostart="true" 配合 cancel() 控制
// 页面加载时自动启动扫码,但立即取消
onReady() {
    setTimeout(() => {
        this.$refs.barcode.cancel();
    }, 100);
}

// 需要扫码时再调用start
toStart: function() {
    this.$refs.barcode.start({
        conserve: true,
        filename: '_doc/barcode/'
    });
}
  1. 使用原生插件方式替代组件
const barcodeModule = uni.requireNativePlugin('barcodeScan');

// 开始扫码
barcodeModule.start({
    autostart: false,
    // 其他参数...
}, (res) => {
    console.log(res);
});

// 手动启动
barcodeModule.startScan();
  1. 延迟初始化方案
<template>
    <view>
        <barcode v-if="showBarcode" ...></barcode>
        <button @click="initBarcode">初始化扫码</button>
    </view>
</template>

<script>
export default {
    data() {
        return {
            showBarcode: false
        }
    },
    methods: {
        initBarcode() {
            this.showBarcode = true;
            this.$nextTick(() => {
                setTimeout(() => {
                    this.$refs.barcode.start();
                }, 300);
            });
        }
    }
}
</script>
回到顶部