二维码扫描,已经成为当下一款应用不可或缺,同时也是用户习以为常的功能了。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. 三维重建:Kinect几何映射-SDK景深数据处理

    此文大量使用XML,非C类的代码,看看图即可. 原文链接:Kinect for Windows SDK开发入门(五):景深数据处理 3. 对物体进行测量 像上篇文章中对深度值测量原理进行讨论的那样,像 ...

  2. 06--C语言数学函数

    在使用C语言数学函数时候,应该在该源文件中使用以下命令行: #include <math.h> 或 #include "math.h",这里的<>跟&quo ...

  3. 03--SQLtie三言两语SQLtie链接(join)

    本文将从连接的理论和语法讲起,结合具体的例子,详细分析 SQL 连接. 之前对数据库的连接操作似懂非懂,大概知道是什么东西,但是面试笔试的时候被虐成渣,讲不清连接到底是什么.吃一堑,长一智.这就是所谓 ...

  4. virtualenv 虚拟环境依赖安装

    虚拟环境依赖安装 开发要学会用 virtualenv 来管理多个开发环境 Ubuntu/Centos/MacOS 下 virtualenvwrapper 使得virtualenv变得更好用,所以我们一 ...

  5. 路飞学城Python-Day77

    11-DIY一个web框架3 web框架 yuan功能总结 main.py: 启动文件,封装了socket 1 urls.py: 路径与视图函数映射关系 ---- url控制器 2 views.py ...

  6. iOS 小知识

    iOS 各版本: http://www.pig66.com/2018/145_1021/17357553.html

  7. 1520dc更新与NUll语句用法

    update dbo.dc_出租信息set 出租类型 = 1where 出租类型='普通楼上房' update dbo.dc_出租信息set 朝向 = 5where 朝向 is NULL

  8. 使用canvas保存网页为pdf文件支持跨域

    前言 之前上一篇随笔说了Canvas截图网页为图片,下来个新需求,把网页截图后保存为PDF文件供用户下载. 前文 Canvas截图网页为图片:https://www.cnblogs.com/bubub ...

  9. NOIP2018提高组金牌训练营——动态规划专题

    NOIP2018提高组金牌训练营——动态规划专题 https://www.51nod.com/Live/LiveDescription.html#!#liveId=19 多重背包 二进制优化转化成01 ...

  10. PHP学习总结(5)——PHP入门篇之PHP字符串

    字符串 一个字符串是用双引号括起来的一个词或一个句字,比如:"Hi,imooc!".你可以用PHP语言输出把这个字符串输出,像这样: <?php echo "Hi, ...