前言

随着移动互联网的兴起,Webapp开始大行其道。大概在15年下半年的时候我接触到了HybridApp。因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱。

HybridApp最早好像是国外的PhoneGap,然后国内有AppCan、Dcloud、APICloud等等。我当时接触的是APICloud,相比于其他平台,APICloud最大的特点是它的混合程度比较高!

要知道,Webapp最大的问题就是性能问题始终无法和原生App相比,由此才发展出来HybridApp。

界内公认的最稳定的的Hybrid开发方式就是:由Native解决交互问题,由H5解决应用层问题。比如AppStore就是采用这种模式。

在这一点上APICloud做的还是不错的,它的交互都是调用原生的接口,而应用层开发者可以自行通过H5进行开发。

当然了,HybridApp的坑还是比较多的。在大概半年的时间里我踩了无数的坑。。。

想起来都是泪啊。

不说了,今天说说React Native。

React Native

React Native

因为Hybrid的平台太多了,所以一直以为React Native也是一种HybirdApp开发方式。

最近想做一个监听手机短信的APP,所以就又用APICloud尝试了下,结果只能监听到正规手机号发送的短信却监听不到短信通道发送的。我以为是APICloud的模块问题,所以就想着看看React Native能不能帮我解决这个需求?

了解RN之后才发现,完全不是我想的那样!!

之前的各种HybridApp开发方式,它们的原理其实就是在一个运行在Webview中的app,只不过这个Webview比较特殊而已。

而RN完全不是这样!

RN是最终还是会把你写的代码转换成原生的代码进行编译。这就意味着RN开发出来的APP是无限接近原生APP的性能的!

FB真是牛逼到家了!!

具体的RN开发我还没深入,这里就不误人子弟了。

下面就说说RN到底能不能帮我解决监听短信的问题呢?

当时是。。。额。。。没解决。。。

哈哈~

其实没解决不是因为RN的问题,具体的原因我最后再说。

我查遍了RN的文档,最终确定确实是没有SMS相关的API和模块。

无奈之下只能在网上搜索下咯~

这里我就要夸一夸我大Google了。

在百度上搜索ReactNative SMS,毛也没有搜到!

在Google上立马搜到了很多。

百度搜索结果

Google搜索结果

成功找到一个React-native-sms-listener的模块,是一个巴西的开发者开发的。

React-native-sms-listener

兴奋的去安装编译,结果又掉坑里了。。。

在坑里爬了半天,发现是因为RN的版本升级了。。。

0.29更新日志

在RN的0.29版本中,Android的原生代码中增加了一个MainApplication.java的文件,原先的MainActivity.java的文件也有所调整。。。

而这个React-native-sms-listener的模块安装的时候要求将他的一段代码写到MainActivity.java中去,结果就当然可想而知了,编译的时候死活无法通过。抓狂~

然后又费了半天劲给RN进行降级。

这里也提一嘴如何给RN降级,官网的文档只提了如何升级却没有如何降级,这又是一个小坑。

RN如何升级

因为是通过npm进行管理的,所以会有一个package.json的文件。这个文件里指定了RN的版本,安装好之后就是最新版本,如果官网版本有更新,那么你这里的版本就会落后了,那么升级的时候就是需要把这个版本号改为最新的版本然后执行npm install.

升级很简单,降级需要注意的是。你需要先把Android相关的代码全部删掉。

ReactNative根目录

就是图中的android文件夹和index.android.js的文件全部都删掉。然后将package.js中的版本号调整为要降到的版本,最后执行npm install就可以了。

为什么要删掉?官网文档中有提到的

如果是新添加的文件,则直接创建。
如果文件和当前版本的文件相同,则跳过。
如果文件和当前版本的文件不同,则会提示你一些选项。

这就意味着,如果新版本有新文件而旧版本并没有,它是不会自动删掉的。这就会导致编译的时候出现一些莫名奇妙的错误。。。

最终

成功的写了一个监听短信的App,可惜还是监听不到通过短信通道发来的短信。。。

我又一度怀疑是不是巴西那哥们写的模块有问题。。。

反正Android的开发环境都搭好了,索性自己用原生的方式写一个吧。

查了下资料,发现想要监听短信有两种方式,一种是监听广播,一种是监听短信数据库。

首先尝试了监听数据库,经过一番调试终于可以监听到了,赶紧找个渠道发个验证码试试。激动~~

可是。。。

尼玛!!!

还是监听不到!!!

这时候我突然想起一件事:MIUI的短信列表被特殊处理了!

Paste_Image.png

如上图,它把通知类的短信和普通短信进行了区分把通知类的短信摘出去了。。

坑啊~

这TM肯定不在一个数据库了。。。

想明白这个问题之后都无奈了,折腾半天是手机系统的问题。。。

然后又尝试了下监听广播的方式,也宣告失败。

猜测miui底层应该在自身接收到广播做完相应处理就把广播拦截掉了。。

好了,本周的踩坑记就分享到这里了~

彩蛋

看过我之前文章的都知道我为什么要做短信监听。我说过打算做两个Sender,一个是App,一个是基于SIM900A的小嵌入式产品。App的版本暂时就这样了,等我给我的M4刷个其它的ROM再说。

喜讯是SIM900A调用Http请求时总重启的问题顺利解决了!!

原来是电脑USB电流输出不足导致的,外接了个电源立马好了~

请叫我踩坑小王子~

文/闫大伯(简书作者)
原文链接:http://www.jianshu.com/p/04593766df5e
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

【踩坑记】从HybridApp到ReactNative的更多相关文章

  1. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  2. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  3. Spark踩坑记——共享变量

    [TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...

  4. Spark踩坑记——从RDD看集群调度

    [TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...

  5. djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记

    情况是这样的,项目用的restful规范,后端用的django+djangorestframework,前端用的vue-cli框架+webpack,前端与后端交互用的axios,然后再用户登录之后,a ...

  6. HttpWebRequest 改为 HttpClient 踩坑记-请求头设置

    HttpWebRequest 改为 HttpClient 踩坑记-请求头设置 Intro 这两天改了一个项目,原来的项目是.net framework 项目,里面处理 HTTP 请求使用的是 WebR ...

  7. vue踩坑记

    vue踩坑记 易错点 语法好难啊qwq 不要把'data'写成'date' 在v-html/v-bind中使用vue变量时不需要加变量名 在非vue事件中使用vue中变量时需要加变量名 正确 < ...

  8. 【bug记录】OS Lab4 踩坑记

    OS Lab4 踩坑记 Lab4在之前Lab3的基础上,增加了系统调用,难度增加了很多.而且加上注释不详细,开玩笑的指导书,自己做起来困难较大.也遇到了大大小小的bug,调试了一整天. 本文记录笔者在 ...

  9. 【bug记录】OS Lab3 踩坑记

    OS Lab3 踩坑记 Lab3在之前Lab2的基础上,增加了进程建立.调度和中断异常处理.其中测试包括进程建立以及进程调度部分. 由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记 ...

随机推荐

  1. Thinkphp单字母函数使用指南

    Thinkphp单字母函数使用指南A方法A方法用于在内部实例化控制器,调用格式:A('[项目://][分组/]模块','控制器层名称')最简单的用法: $User = A('User'); 复制代码 ...

  2. webstorm 如何修改背景颜色

    http://www.cnblogs.com/zxyun/p/4744744.html 见文章底部有图文说明 15个必须知道的chrome开发者技巧(GIF):http://www.wtoutiao. ...

  3. ASP.NET MVC 使用Echarts

    Echarts官网 页面配置: <!DOCTYPE html> <html> <head> <meta name="viewport" c ...

  4. kafka环境搭建2-broker集群+zookeeper集群(转)

    原文地址:http://www.jianshu.com/p/dc4770fc34b6 zookeeper集群搭建 kafka是通过zookeeper来管理集群.kafka软件包内虽然包括了一个简版的z ...

  5. 关于tableView的那些坑(一)—— automaticallyAdjustsScrollViewInsets属性

    最近用tabbar来切换控制器,用childViewController来实现多控制器管理,多列表切换,在子控制器中设置了automaticallyAdjustsScrollViewInsets属性为 ...

  6. 升级Capitan 10.11以后CocoaPod 无效解决办法

    今天发现升级10.11的系统以后执行 pod install 的时候报错 zsh: command not found: pod 解决方法如下: 1.检查gem 的数据源 gem sources -l ...

  7. sql中truncate 、delete与drop区别

    SQL truncate .delete与drop区别   相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL ...

  8. c++primer复习(六)—面向对象编程

    1 C++中,通过基类的引用(或指针)调用虚函数时,发生动态绑定,两个条件(基类引用或指针.虚函数)缺一不可 虚函数的默认实参将发生静态绑定 2 继承层次的根类一般都需要定义虚析构函数 3 任意非st ...

  9. 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)

    题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...

  10. absolute之实现居中的三种方式

    居中思想可以由很多方式实现,这篇文章采用absolute实现:由传统方式开始到absolute独立使用方式 方式一:传统方式,父容器relateive,子元素absolute,然后left:50%,再 ...