首页 文章 精选 留言 我的

精选列表

搜索[AI原生],共10000篇文章
优秀的个人博客,低调大师

史上最详细的Android原生APP中添加ReactNative进行混合开发教程

背景 React Native出来已经一段时间了,相对来说也算稳定了,在很多的企业中都实际使用他们,混合开发已经是未来的一种趋势,混合开发中使用的技术很多,不外乎Html5、JS框架通过一定的技术和原始交互,目前主流混合开发React Native、Cordova、APICloud、MUI、AppCan、Sencha Touch、jQuery Mobile等等(其他的小伙伴们自己收集),目前网上写教程的人很多,但是React Native更新速度很快,根据他们的教程,中间会遇到各种问题,今天我和大家一起踩踩各种坑,让小伙伴们快速集成到自己的APP中。 集成的小伙伴一定要注意图片中标注和备注哦,不然有可能会走弯路哦 集成步骤 参考官方文档->react native 文档 本文使用开发环境 Android studio 注意最新的React Native支持的最新的SDK为16(android4.1) npm环境,小伙伴们自己安装 nodeJS自己安装,可以参考官方文档安装环境,有问题可以发411437734@qq.com沟通 创建Android项目(已有项目跳过) 1.打开Android studio 2.输入项目名称,选择项目目录,点击next 至此项目创建完成(需要注意的是最新的React Native支持最新SDK版本为16 android4.1) React Native集成到上面我们创建的ReactNativeAPPDemo中 参考Facebook react native文档 1.进入项目根目录,添加JS到项目中-点击Android studio中的Terminal(如下图) 分别执行一下语句 npminit npminstall--savereactreact-native curl-o.flowconfighttps://raw.githubusercontent.com/facebook/react-native/master/.flowconfig init 主要根据提醒生成package.json文件 install --save react react-native 安装React 和React Native curl -o .flowconfighttps://raw.githubusercontent.com/facebook/react-native/master/.flowconfig下载.flowconfig文件 参考图片 查看项目中有node_modules,说明react和react native 安装完成 在项目根目录添加.flowconfig 参考下图 也可以手动创建在浏览器打开https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig网址复制内容创建文件 ReactNativeAppDemo配置相关内容 1.添加"start": "node node_modules/react-native/local-cli/cli.js start" 到package.json 文件下 scripts标签 修改前 修改后 2.添加index.android.js文件到项目中 'usestrict';importReactfrom'react';import{ AppRegistry, StyleSheet, Text, View }from'react-native';classHelloWorldextendsReact.Component{ render(){return(<Viewstyle={styles.container}> <Textstyle={styles.hello}>Hello,World</Text> </View> ) } }varstyles=StyleSheet.create({ container:{ flex:1, justifyContent:'center', }, hello:{ fontSize:20, textAlign:'center', margin:10, }, }); AppRegistry.registerComponent('HelloWorld',()=>HelloWorld); 至此React native配置基本完成 3.App build.gradle配置 dependencies{ ... compile"com.facebook.react:react-native:+"//Fromnode_modules.} 这里注意不要使用maven中的,因为我们使用的是我们本地node_modules中的,注意最新版本中支持的是23,appcompat-v7:23.0.1,暂时没有试24的api 整个工程build.gradle配置 allprojects{ repositories{ ... maven{//AllofReactNative(JS,Androidbinaries)isinstalledfromnpm url"$rootDir/node_modules/react-native/android" } } ... } 添加<uses-permission android:name="android.permission.INTERNET" />到AndroidManifest.xml: 确定External Libraries 确定是下是最新的,例如确定是0.34.1而不是0.20.1,如果出现请检查 maven{ `url"$rootDir/../node_modules/react-native/android"`//地址是否正确 } 修改url"$rootDir*/..*/node_modules/react-native/android"为url"$rootDir/node_modules/react-native/android" 添加native code 官方给出的 到时最新版本中提供了更加简单的方式,没错就是继承。 在这里我们也需要自定义一个Application否则 运行时会报错,不信的小伙伴可以试一试 到此为止,ReactNative 集成到已有项目中完成!!!迫不及待的运行试试吧!! 在Terminal中运行 npm start,看到下图表示启动成功 运行以后发现如下错误 react-native报错:Could not get BatchedBridge, make sure your bundle is packaged correctly 莫紧张,这是因为bundle没有打包好。找不到编译打包后的js文件。其实就是android studio默认的寻找js文件地址和react-native自己的工具编译所使用的地址不同。 解决方法 方法一 进入项目,在android/app/src/main下新建assets目录。执行以下命令 $>react-nativestart>/dev/null2>&1& $>curl"http://localhost:8081/index.android.bundle?platform=android"-o >"app/src/main/assets/index.android.bundle" 在项目根目录下执行 <!--$>(cdandroid/&&./gradlewassembleDebug)-->$>(cd项目名称/&&./gradlewassembleDebug) 把创建的apk安装到android设备 方法二 进入项目,在android/app/src/main下新建assets目录 启动服务器 $>react-nativestart $>react-nativebundle--platformandroid--devfalse--entry-fileindex.android.js--bundl 在assets文件夹下会生成index.android.bundle文件,把创建的apk文件安装到android设备 方法三 进入项目,在android/app/src/main下新建assets目录 在package.json中配置下面代码 "scripts":{ "start":"nodenode_modules/react-native/local-cli/cli.jsstart", "bundle-android":"react-nativebundle--platformandroid--devfalse--entry-fileindex.android.js--bundle-outputapp/src/main/assets/index.android.bundle--sourcemap-outputapp/src/main/assets/index.android.map--assets-destandroid/app/src/main/res/" }, 个人推荐使用方法三,方法三解决不了推荐方法二 手动执行 修改刚刚的package.json文件 如果真机(模拟器)需要执行 adbreversetcp:8081tcp:8081 一定要确定连接网络哦!! 开心的进行开发吧! 其他可能遇到的问题 ReactNative兼容64位Android手机 libgnustl_shared.so" is 32-bit instead of 64-bit类似错误 解决方法 在项目的根目录的 gradle.properties 里面添加一行android.useDeprecatedNdk=true. 在 build.gradle 文件里添加以下代码 android{ ... defaultConfig{ ... ndk{ abiFilters"armeabi-v7a","x86" } packagingOptions{ exclude"lib/arm64-v8abrealm-jni.so" } } } Genymotion模拟器运行显示没有连接到developement server如下图 先检查是否连接到网络 点击模拟器中Menu菜单弹出下面图片,点击Dev Settings 4.点击Debugging 下面的Debug Server host & port for device填写地址和端口 作者:天空oo7 来源:51CTO

优秀的个人博客,低调大师

关于iOS原生条形码扫描,你需要注意的两三事

前言 这篇文章是我们在新发布的礼物说的iOS端开发过程中遇到的一些关于条形码的问题总结而来。 本文记录的问题是:当AVFoundation使用多译码器扫描的时候。二维码是秒杀,但是条形码却经常扫不上。如果去掉二维码的话,条形码扫描又秒杀的问题。 为什么我们没有选用ZXing而是用AVfoundation呢,是因为我说服了老板,iOS7开发,而不再去兼容iOS5/6。所以我们终于可以抛弃效率低下的ZXing,而选择AVFoundation。为什么说ZXing效率低下,我们这里可以说上几句。 ZXing ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及可移植性,出现了c++ port. Github上的Objectivc-C port,其实就是用OC代码封装了一下而已,而且已经停止维护。 ZXing扫描,是拿到摄像头的每一帧,然后对其根据如下公式做灰度化 f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j)) 之后做全局直方图二值化的方法,最后按照ISO/IEC 18004 规范进行解析。 这样效率非常低,在instrument下面可以看到CPU占用远远高于 AVFoundation。而且全局直方图二值化导致精准度并不高。这个库还会带来一大堆C++的东西,在纯iOS7的工程下,不推荐使用。 AVFoundation 扫码的简单使用 这里说一下,我们礼物说是和passbook一样,同时可以扫描二维码和条形码,真是因为这个特性,导致了我写这篇总结。 先粘一下扫码实现部份,如下。 -(BOOL)startReading{ _isReading=YES; NSError*error; AVCaptureDevice*captureDevice=[AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput*input=[AVCaptureDeviceInputdeviceInputWithDevice:captureDeviceerror:&error]; if(!input){ NSLog(@"%@",[errorlocalizedDescription]); returnNO; } _captureSession=[[AVCaptureSessionalloc]init]; //Settheinputdeviceonthecapturesession. [_captureSessionaddInput:input]; AVCaptureMetadataOutput*captureMetadataOutput=[[AVCaptureMetadataOutputalloc]init]; [_captureSessionaddOutput:captureMetadataOutput]; //Createanewserialdispatchqueue. dispatch_queue_tdispatchQueue; dispatchQueue=dispatch_queue_create("myQueue",NULL); [captureMetadataOutputsetMetadataObjectsDelegate:selfqueue:dispatchQueue]; if(self.qrcodeFlag) [captureMetadataOutputsetMetadataObjectTypes:[NSArrayarrayWithObject:AVMetadataObjectTypeQRCode]]; else [captureMetadataOutputsetMetadataObjectTypes:[NSArrayarrayWithObjects:AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeQRCode,nil]]; _videoPreviewLayer=[[AVCaptureVideoPreviewLayeralloc]initWithSession:_captureSession]; [_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill]; [_videoPreviewLayersetFrame:self.view.layer.bounds]; [self.view.layeraddSublayer:_videoPreviewLayer]; [_captureSessionstartRunning]; returnYES; } -(void)stopReading{ [_captureSessionstopRunning]; _captureSession=nil; [_videoPreviewLayerremoveFromSuperlayer]; } -(void)captureOutput:(AVCaptureOutput*)captureOutputdidOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*)connection { if(!_isReading)return; if(metadataObjects!=nil&&[metadataObjectscount]>0){ AVMetadataMachineReadableCodeObject*metadataObj=[metadataObjectsobjectAtIndex:0]; DoSomething.... } } 这个代码也不需要加什么注释,挺简单易懂的。 阐述问题 我们上面说过了:当AVFoundation使用多译码器扫描的时候。二维码是秒杀,但是条形码却经常扫不上。如果去掉二维码的话,条形码扫描又秒杀的问题。 但有趣的事情是,如果我写了个demo,用上述代码的话。却又可以秒杀扫描。这个问题困扰了我一下午,仔细对比了项目中的每一行代码和我demo中的全部。除了demo没有画一个提示框在屏幕上以外,其他地方全都一模一样。 那么为什么导致项目中扫描效率如此之慢呢? 猜想1: UI以及后台线程占用大量CPU时间 结果在 instrument下,不攻自破,cpu占用,内存占用非常非常低。 猜想2:系统架构问题 因为添加了QRCode才导致扫描变慢的,那么就应该是和算法效率有关。多引入了一个每一帧都要工作的译码器,导致条形码扫描效率下降。我的Demo是arm64 v7s v7 系统全支持,而项目是ArmV7。 这个想法挺异想天开的。觉得可能是Arm64的指令集效率比armv7快得多导致的。我还去问巧哥,armv7和arm64在密集运算的时候效率差多少,会不会比较明显。 但重新配置了一下,还是错误的。 插曲 我发现把屏幕横过来扫描效率比竖过来高多了。于是怀疑是不是 Capture 的方向问题。 猜想3: 摄像头方向问题导致解碼效率低 这个猜想,我没有去证实,因为太麻烦了。要给Session 添加一个新的output 来输出每一帧,而且还是个CMBuffer,还要手动转码。不过后面证实这个也是错的。 猜想4:摄像头参数问题 当初看AVCam 写拍照模块的时候,记得摄像头有很多参数,ZXing 也有一个文件位叫做精确解碼,牺牲效率换精确度。于是就在想会不会苹果家的也要设置参数。 于是就坏怀这个问题去看文档去了,结果歪打正着的发现了正确原因。 这是记录在苹果的FAQ中的,并没在AVFoundation 的 Reference 中。具体编号为:Technical Note TN2325 正确原因 就是描述问题里面说到的,demo和工程里面的唯一区别,多了个surfaceLayer。如下图: 为了正确解释这个有趣的问题,我们要解释一下条形码扫描原理。 上面有提过二维码是通过全局直方图二值化后,按照ISO标准解碼,实际上是,按照1:1:3:1:1去寻找那三个寻像图形,就是标志性的大方块。然后圈出二维码大小再去解碼的。也就是说,再没设定边界的情况下全屏都可以。 而条形码完全不同,他是在Detect Center那个点,画一个无限延伸的米字型,然后去判断每一条在线能否解析出条形码所需要的0101010序列。而iOS默认的Center是 Layer 的 Center。 我们再回过头来看工程中的 SurfaceLayer,其实他提示给用户的那个框,已经远离了Center。所以我们竖着扫描的时候,那条水平的扫描线是没有贯穿条形码的,所以扫不上他。 于是乎要根据设备,iPhone4 iPhone5 通过AVCaptureDeviceFormat和AVCaptureSessionPreset 重新设置一下AVCaptureMetadataOutput rectOfInterest,结果问题就解决了。 为什么去掉二维码就没事了呢? 还在那篇FAQ中,有那么一个表格。 可见,当我们没有二维码的时候,他会有个additional存在。用更加优秀且稍微耗时的算法去优化扫描精准度。 总结 1.当我们遇到问题的时候,不光要记得看 苹果的 guide 和 reference,还要记得看以下 sample code,tech note, FAQ。 2.说不好有意外收获 为什么条形码扫描仪上往往会有一条红线,这并不是为了拟物化,而是告诉用户一定要用这条线对准条形码,否则会有扫不上的可能性。 3.正如福尔摩斯所说:抛开所有不可能的,剩下的,不管多么令人匪夷所思,那都是事实。两套代码仅有UI不一样,效果不同,其实就是UI引导用户错误的使用了扫描仪。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册