二维码扫描,已经成为当下一款应用不可或缺,同时也是用户习以为常的功能了。uni-app 为我们提供了扫码 API ,直接调用即可。

需求场景

在实际开发中,平台提供的默认扫码界面,并不能满足一些自定义的需求。例如:

  • 非全屏显示
  • 扫码界面文字国际化
  • 扫码框的颜色调整

微信小程序等小程序平台,可以通过 <camera> 组件来实现部分自定义的需求。App 平台需要通过本地 HTML 来实现,即本文要分享的内容。

Tips:这里的 App 特指 Android(.apk)、iOS(.ipa) 移动应用,非泛指所有应用。

实现思路

在 App 上实现自定义扫码界面,有以下几个关键点的支持:

  • uni-app 在 App 平台支持 HTML5+ 规范的调用,这是核心依赖。
  • <web-view> 组件在 App 平台支持加载本地 HTML,这为自定义的 HTML 文件提供了规范目录存放。

大致的思路如下:

  • 开发一个 HTML 页面,使用 plus.barcode 等实现扫码功能。
  • 在 .vue 页面中通过 plus.webview 直接打开扫码页面。
  • 扫码页面监听 backbutton,防止打乱 uni-app 原有的路由控制。
  • 通过 plus.storage 实现数据的存储,以及 .vue 页面的数据读取。

关键代码

barcode.html

不同于 uni-app 直接调用 plus,在 HTML 中一定要等 plusready 后调用 plus 的 API。

var plusReady = function (callback) {
    if (window.plus && window.plus.isReady) {
        callback();
    } else {
        document.addEventListener('plusready', function () {
            callback();
        }, false);
    }
};

通过 create 方法创建的 Barcode 实例对象,一定要 append 到当前 Webview 上。

var barcode = plus.barcode.create(options.barcodeId, options.scanTypes, options.styles);
/* 省略代码 */
plus.webview.currentWebview().append(barcode);

监听 backbutton 的操作,防止打乱 uni-app 的路由管理,导致页面后退等操作异常。

plus.key.addEventListener('backbutton', function () {
    goBack();
});

index.vue

App 特有的功能及调用 plus 的 API,一定要条件编译。

<!-- #ifdef APP-PLUS -->
<button type="primary" @click="openBarcode">扫码</button>
<!-- #endif -->
// #ifdef APP-PLUS
openBarcode() {
    /* 省略代码 */
}
// #endif

监听扫码页面的销毁事件,在回调中读取扫码的结果。

barcodeWebview.addEventListener('close', function () {
  var barcodeValue = plus.storage.getItem('barcode_value');
  if (barcodeValue) {
    var barcodeResult = JSON.parse(barcodeValue);
    if (barcodeResult.code === 0) {
      _self.title = '扫码结果:' + barcodeResult.result;
    } else {
      _self.title = '扫码失败';
    }
  }
});

源码

上面只提到了一些关键或可能被忽视的代码,完整的代码已经上传至 GitHub,请自行下载体验。

注意事项

数据同步

目前是通过 plus.storage 实现的数据共享,可能会出现扫码界面已经关闭但是数据还没有立刻同步的情况。

页面跳转

除了一定要在 HTML 中监听 backbutton 外,还需要注意后续页面切换的操作。
可以是 vue->html 或者 vue->html->html,然后逐级 back。一定不能出现 html->vue 这种跳转,uni-app 的路由管理会乱掉。

更多增强

HTML5+ 提供的扫码能力,可以满足自定义大小,绘制文字的国际化,扫码框颜色定制等。在 plus.view 的支持下,还可以绘制更加丰富的自定义界面。当然,你可能需要加强一下对于 HTML5+ 的掌握。

结束

如果本文的分享对你有所帮助的话,请不要吝啬给 uni-custom-scan-code 一个小星星。目前的例子还是比较单薄,后面会持续补充一些示例,欢迎大家持续关注。

uni-app 自定义扫码界面的更多相关文章

  1. uni-app自定义app端的扫码界面

    记得当时是在西班牙有这样的一个需求,需要自定义扫码页面,还需要加上西班牙文,当时是在一个组件里面找到了这样的一个方法,全文大部分使用的app端的Native里面的方法,记录一下,跑路了项目代码要删库了 ...

  2. FNScanner二维码接口openView自定义扫码Demo

    本文出自APICloud官方论坛 FNScanner 模块是一个二维码/条形码扫描器,是 scanner 模块的优化升级版.在 iOS 平台上本模块底层集成了 Zbar 和系统自带的条形码/二维码分析 ...

  3. 别再问WiFi密码了,HMS Core统一扫码服务让手机一键联网

    现代生活离不开网络.在餐厅.商场等公共场所,手机连接WiFi一直是高频使用场景.虽然公共场所的免费WiFi越来越多,但网络连接过程却很麻烦.有的需要打开网页注册或点击广告链接才能上网,还有的要求下载特 ...

  4. C#开发微信门户及应用(41)--基于微信开放平台的扫码登录处理

    在现今很多网站里面,都使用了微信开放平台的扫码登录认证处理,这样做相当于把身份认证交给较为权威的第三方进行认证,在应用网站里面可以不需要存储用户的密码了.本篇介绍如何基于微信开放平台的扫码进行网站的登 ...

  5. Odoo 仓库扫码打包方案

        Odoo仓库扫码的设计,前提是操作人在PC上先做好分拣单,然后根据打印出来的分拣单去仓库进行扫码打包,默认的情况下,分拣在被确认的时候会自动保留库位中已经存在的库存(已经分配批次\序列号),而 ...

  6. spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版

     前言 基于之前两篇(<spring boot高性能实现二维码扫码登录(上)——单服务器版>和<spring boot高性能实现二维码扫码登录(中)——Redis版>)的基础, ...

  7. Channels实现扫码登录

    参考了下别人说的原理,根据自己的逻辑实现,没有完全按照别人的原理来,所以不一定适用于大家,仅供参考吧!!! 流程如下: 1. web发起websocket链接,后端接受链接后立马发送第一次消息,为全局 ...

  8. 【JavaWeb开发】初步实现网站应用钉钉扫码登录

    http://blog.csdn.net/baofeidyz/article/details/59059379 版权声明:转载请注明我的个人微信平台 暴沸 目录(?)[+] 写在前面:如果你还不知道钉 ...

  9. Blazor组件自做三 : 使用JS隔离封装ZXing扫码

    Blazor组件自做三 : 使用JS隔离封装ZXing扫码 本文基础步骤参考前两篇文章 Blazor组件自做一 : 使用JS隔离封装viewerjs库 Blazor组件自做二 : 使用JS隔离制作手写 ...

随机推荐

  1. 使用Storm实现实时大数据分析!

    随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战.Shruthi Kumar和Siddharth Patankar在Dr.Dobb's上结合了汽车超速监视,为我们演示了使用Storm进 ...

  2. bzoj 1207 [HNOI2004]打鼹鼠 小技巧

    Description 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某些时刻鼹鼠会在某一个网格探 ...

  3. Maven 从安装到环境配置到项目搭建

    maven是基于项目对象模型(pom),可以通过一小段的描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven是构建项目的管理工具,白话就是说:“Maven的核心功能便是合理叙述项目间的 ...

  4. vue使用SockJS实现webSocket通信

    以前使用websocket都是使用 window.webSocket = new WebSocket('ws://' + config.webSocketUrl + '/webData/websock ...

  5. Swagger在 NETcore 中的使用

    请参考 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view=asp ...

  6. crm2013使用图片字段

    在CRM2013能够加入图片字段(一个实体仅仅能加入一个图片字段) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveV9mMTIz/font/5a6L5L2 ...

  7. oracle常见sql语句优化

    1.* 号引起的运行效率 尽量降低使用select * 来进行查询,当你查询使用*, 数据库会进行解析并将*转换为所有列. select count(si.student_id)  from Stud ...

  8. hdu3966_树链剖分

    近期在强化知识点深度.发现树链剖分不是非常会写了. 回想一下改动操作: 若两个点在同一条链上,则直接改动这段区间. 若不在同一条链上,改动深度较大的点到其链顶端的区间,同一时候将这个点变为他所在链顶端 ...

  9. 从HTTP 2.0想到的关于传输层协议的一些事

    0.HTTP协议的历史 我也不知道... 1.关于HTTP 2.0 收到了订阅的邮件,头版是说HTTP 2.0的内容,我本人不是非常关注HTTP这一块儿.可是闲得无聊时也会瞟两眼的.HTTP 2.0的 ...

  10. UVA 294 - Divisors 因子个数

    Mathematicians love all sorts of odd properties of numbers. For instance, they consider 945 to be an ...