Сканирование QR-кода уже является очень распространенной функцией в мобильных приложениях.Осуществить сканирование кода на нативной стороне очень просто.Android обычно использует для его реализации библиотеку ZXing, а iOS может использовать собственный SDK, ZXing или ZBar SDK для реализации Это. Есть два способа реализовать сканирование QR-кода в React Native:
- Нативная сторона инкапсулирует компонент функции сканирования, а функция рендеринга на стороне RN ссылается на него в виде метки.
- Собственная сторона напрямую реализует все функции, а сторона RN напрямую переходит к интерфейсу собственного кода сканирования.
В первом методе обработка бизнес-логики, связанная со сканированием кода, по-прежнему выполняется на стороне RN. Поскольку основная часть нашего проекта основана на RN, здесь описан только первый способ реализации сканирования кода, второй способ также проще в реализации, и те, кто знаком с нативной разработкой, должны знать, как это сделать.
Здесь я использую стороннийreact-native-camera
реализовать функцию сканирования. Генерация QR-кода используетreact-native-qrcode-svg
. Ниже приведены рендеры кода сканирования Android и iOS:
Создание QR-кода относительно просто.Давайте сначала объясним, как создать QR-код в RN.
Сгенерировать QR-код
Раньше я искал библиотеку RN для генерации QR-кода на github, и многие люди, похоже, используютreact-native-qrcode
. Я также попробовал это сам, и я действительно могу сгенерировать QR-код, но сгенерированный QR-код не может быть распознан, независимо от того, использую ли я WeChat, Alipay или любое другое приложение, в котором есть функция сканирования кода, поэтому QR-код, сгенерированный этой библиотекой, Есть проблема, его вообще нельзя использовать.
После поиска и практики я нашелreact-native-qrcode-svg
Это действительно эффективная библиотека генерации QR-кода на стороне RN. Интеграция также очень проста, используйте команду npm install --save или yarn add для установки.react-native-qrcode-svg
,react-native-svg
,Потомreact-native link react-native-svg
Вот и все.
react-native-svg
даreact-native-qrcode-svg
Базовая библиотека должна быть установленаreact-native-community
Открытый исходный код, более высокая надежность. После завершения интеграции использование выглядит следующим образом:
<QRCode
value={"This is a QR code string, string cannot be null"}
size={140}
/>
Следует отметить, что значение не может быть пустой строкой "" или нулевым значением, иначе будет сообщено об ошибке. Генерация QR-кода может быть распознана путем сканирования с помощью любого приложения, которое сканирует код, включая функцию сканирования кода в этой демонстрации. Конкретный эффект можно посмотреть в демо, а адрес в конце статьи.
Сканировать QR-код
Рекомендуется использовать стороннюю библиотеку для сканирования QR-кода.react-native-camera
,Слишкомreact-native-community
Произведено. Напоминаю, что многие сторонние библиотеки для сканирования кодов на стороне РН тоже зависят от этой библиотеки, а некоторые уже просрочены и больше не поддерживаются.Это самая надежная библиотека сканирования на стороне РН.
iOS-интеграция
Интеграция с iOS очень проста, просто следуйте документации и установите ее. Действуйте следующим образом:
- пряжа добавить реактивную камеру установить
- react-native link react-native-camera
- Откройте проект iOS с помощью Xcode, найдите TARGETS -> щелкните цель, чтобы найти справа этапы сборки -> разверните Link Binary With Libraries, удалите libRNCamera, которая входит по ссылке по умолчанию, нажмите знак + для поиска и добавьте ее снова. Это тот же этап операции, что и при связывании react-native-svg выше.
- Добавьте разрешение на использование камеры «Конфиденциальность — Описание использования камеры» в info.plist и укажите цель разрешения на использование.
Интеграция с Android
Интеграция на стороне Android немного великовата, а конфигурация Android в документации по react-native-camera — это слишком много. Слепая конфигурация без внимательного чтения чревата ошибками. Ниже приведена конфигурация gradle в моем демонстрационном проекте:
- Конфигурация андроида/сборки/градла
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
mavenLocal()
jcenter()
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url "$rootDir/../node_modules/react-native/android"
}
maven { url "https://jitpack.io" }
google()
}
}
ext {
buildToolsVersion = "26.0.3"
minSdkVersion = 16
compileSdkVersion = 26
targetSdkVersion = 26
supportLibVersion = "26.1.0"
}
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'com.android.support'
&& !details.requested.name.contains('multidex') ) {
details.useVersion "26.1.0"
}
}
}
}
- Измените дистрибутивUrl в android/gradle/wrapper/gradle-wrapper.properties на:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
- Основная конфигурация в android/app/build.gradle выглядит следующим образом (начиная со строки «android {»):
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.qrcode"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
ndk {
abiFilters "armeabi-v7a", "x86"
}
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86"
}
}
buildTypes {
release {
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
def versionCodes = ["armeabi-v7a":1, "x86":2]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
}
}
}
}
dependencies {
compile project(':react-native-camera')
compile project(':react-native-svg')
compile fileTree(dir: "libs", include: ["*.jar"])
compile "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}"
compile "com.facebook.react:react-native:+" // From node_modules
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.compile
into 'libs'
}
Конфигурация gradle требует особого внимания, чтобы поддерживать единообразие версии, иначе легко допустить ошибку.
- Добавьте разрешение в файл AndroidManifest:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE"/>
На самом деле здесь нужны только разрешения CAMERA и VIBRATE (вибрация), потому что мы используем только функцию сканирования кода react-native-camera, а запись видео и чтение и запись хранилища бесполезны.
Код сканирования бокового вызова RN
Создайте новую страницу js в качестве страницы кода сканирования и визуализируйте компонент RNCamera в функции рендеринга. Следует отметить, что в демонстрации я указал тип категории кода сканирования компонента как для Android, так и для iOS. Поскольку нам нужно сканировать только QR-код, укажите тип, чтобы предотвратить сканирование других типов кодов.Это устанавливается в соответствии с потребностями проекта.
Поскольку нативные реализации Android и iOS различаются, при вызове компонентов в RN имена атрибутов типа несовместимы, в iOS это barCodeTypes, который представляет собой массив и может указывать несколько типов кода сканирования:
<RNCamera
style={styles.preview}
type={RNCamera.Constants.Type.back}
barCodeTypes={[RNCamera.Constants.BarCodeType.qr]}
flashMode={RNCamera.Constants.FlashMode.auto}
onBarCodeRead={(e) => this.barcodeReceived(e)}
>
В Android это googleVisionBarcodeType, который используется для одного типа кода сканирования:
<RNCamera
style={styles.preview}
type={RNCamera.Constants.Type.back}
googleVisionBarcodeType={RNCamera.Constants.GoogleVisionBarcodeDetection.BarcodeType.QR_CODE}
flashMode={RNCamera.Constants.FlashMode.auto}
onBarCodeRead={(e) => this.barcodeReceived(e)}
>
Суммировать
На данный момент RN завершил вызов третьей стороны для сканирования кода и создания QR-кода. В основном используются следующие библиотеки:
- react-native-camera
- react-native-qrcode-svg
- react-native-svg
Код сканирования RN с помощью react-native-camera, интерфейс можно настроить самостоятельно. Более надежно использовать react-native-qrcode-svg и react-native-svg для генерации QR-кодов.
Демонстрационный адрес:GitHub.com/Nobody Arron at/Hot…