flutter作为跨平台提效方案,确实可以将开发的效率大幅提升,前提是:
- 尽量少的桥接
- 尽量多的复用
从这两个出发点延伸,接入Flutter后,会承接更多的业务逻辑,增加代码的平台性。基于这个原则,flutter将会承接工程中的主力。网络库的构建,也成了不可缺少的工作。
这篇文章中不在介绍网络选型的逻辑,所有的代码都是基于DIO网络通道构建的。
flutter作为跨平台提效方案,确实可以将开发的效率大幅提升,前提是:
从这两个出发点延伸,接入Flutter后,会承接更多的业务逻辑,增加代码的平台性。基于这个原则,flutter将会承接工程中的主力。网络库的构建,也成了不可缺少的工作。
这篇文章中不在介绍网络选型的逻辑,所有的代码都是基于DIO网络通道构建的。
之前介绍符号化文件的时候,使用atos命令可以将符号堆栈信息变的可读。方法如下:
atos -o dYSM -arch **arch -l imageAddress stackAddress
在真实的环境中使用的时候需要准备的dYSM
文件远远不止archive出来的app二进制文件。奔溃的堆栈中都会出现系统的库,例如:
CoreFundation
UIkit
libdyld.dylib
...
在hook crash时,单独的app测试handle方法会生效,但是一旦将测试的代码加入到依赖很多第三方库的工程中,可能这段代码就不再生效了,不过也有别的可能,例如,当前代码有效,别的第三方库中的代码功能失效。导致这一现象出现的原因是,handle句柄没有正常传递。正常使用的规范是:
拿到之前的句柄。
方式:preHandler = NSGetUncaughtExceptionHandler();
注册自己的handle。
方式:NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
处理完之后检测之前的handler是否存在,存在就将handle交给 NSSetUncaughtExceptionHandler
if (preHandler != NULL) {
NSSetUncaughtExceptionHandler(preHandler)
}
前两章说了crash文件解析的方法和crash文件中包含的内容,基于的条件是拿到当前奔溃的手机,再拿到手机中对应的日志。或者,用户打开了日志上报的功能,统计到的日志被apple收集了。这两种方式都比较被动,而且没有筛选的功能。对于监测app状态来说不是很准确,定位的过程也比较长。
上面已经介绍了背景,接下来开始自定义工具,先画一个逻辑图来阐述工具具备的功能
一步一步来,首先在客户端收集crash,收集的方式包含两种:
至于hook Unix信号还是 mac内核信号,这个地址中给出了详细的介绍,这里就不在赘述了。工程中的函数如下:
上一篇文章中讲述了,如何拿到crash,并且有几种方式来符号化crash文件。但是对文件本身还没有做对应的介绍。本节就来说说crash文件中各个字段对应的意义
每个crash都有这样的header
Incident Identifier: 056AE3FF-0053-4B5F-8C42-5CFD2F4CE9F4
CrashReporter Key: 3c6d6b39fd3e330ce44828e97ab49661480cbb94
Hardware Model: iPhone10,3
Process: TestCrash [652]
Path: /private/var/containers/Bundle/Application/538B29B9-CED1-4969-913B-CB9344F70E94/TestCrash.app/TestCrash
Identifier: com.lianjia.TestCrash
Version: 1 (1.0)
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: com.lianjia.TestCrash [682]
Date/Time: 2018-08-10 17:43:31.2405 +0800
Launch Time: 2018-08-10 17:43:27.4744 +0800
OS Version: iPhone OS 11.4.1 (15G77)
Baseband Version: 1.93.00
Report Version: 104
apple 给出的解释如下:
随着支付宝,QQ AR技术的应用,越来越多的团队开始认识到AR的价值,可以说2016年AR技术离我们又进了一步。再往前倒一年,你会发现,其实双11会场也是做过AR红包的,但是当时的红包效果确实不怎么地,界面抖动的太厉害(没有对感应器做深层次的了解)。随之还有QQ火炬接力,当时没有记错的话,QQ的AR是好像2d的,设备要求在水平放置时,才能展示更好的效果。随着研究的深入,产品的效果也是越来越理想,这里介绍两个国内的AR产品。“视+”,基于标记的AR技术,逼格很高,也拥有了很庞大的用户群。”随便走“基于地理位置的AR技术,下面来几张截图:
这次的主题也是基于地理位置的AR实现。
客户端中涉及到了mapView坐标系的转化,有必要在这里先做一下记录。众所周知地球是一个不规则椭圆体,GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定。 基准面是利用特定椭球体对特定地区地球表面的逼近,因此每个国家或地区均有各自的基准面。基准面是在椭球体基础上建立的,椭球体可以对应多个基准面,而基准面只能对应一个椭球体。意思就是无论是谷歌地图、搜搜地图还是高德地图、百度地图区别只是针对不同的大地地理坐标系标准制作的经纬度,不存在准不准的问题,大家都是准的只是参照物或者说是标准不一样。谷歌地图采用的是WGS84地理坐标系(中国范围除外),谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系,百度采用的是BD09坐标系,而设备一般包含GPS芯片或者北斗芯片获取的经纬度为WGS84地理坐标系,为什么不统一用WGS84地理坐标系这就是国家地理测绘总局对于出版地图的要求,出版地图必须符合GCJ02坐标系标准了,也就是国家规定不能直接使用WGS84地理坐标系。所以定位大家感觉不准确很多又叫出版地图为火星地图其实只是坐标系不一样而已。这就是为什么设备采集的经纬度在地图上显示的时候经常有很大的偏差,远远超出民用GPS 10米偏移量的技术规范。
以上参考自:haotsp.com