反编译 iOS 系统库二进制文件

前言

有时一些 Crash 是挂在系统库,如 CoreFoundation 里,因为是闭源的,没法直接分析代码。不过我们可以找到对应系统库的二进制文件进行反编译,查看对应汇编指令,结合 Crash 时的一些寄存器,以此猜测其执行流程。

ReactNative升级至0.50.3

前言

本文主要记录升级项目的 ReactNative 框架版本(0.44 升到 0.50)过程中遇到的一些问题,主要包含三部分:

  • iOS 编译
  • 运行 JS
  • android 编译

这次框架升级变动比较大,下面我们一步一步来解决。

ReactNative自定义地址调试

前言

ReactNative 在 android 上开发时摇一摇选择 Debug server host & port for device 即可 让真机访问指定 ip 及 端口上的 js bundle 文件,如下图:

但是 iOS 默认没有这个功能,初始化一个项目后(截止本文,最新版本为 0.48.0),默认使用的是 localhost:8081,所以真机调试要么设置代理,要么手动更改 AppDelegate.m 里代码(这样每次改完都得重新编译一遍)。

下面我们将一步一步找出方法来给 iOS 的摇一摇增加一个跟 android 一样的菜单项来修改 ip 及端口。

ReactNative ScrollView 及 WebView 上下拖动切换

前言

本文主要记录在 ReactNative 里如何实现 ScrollView 及 WebView 的上下拖动切换。

由于 ReactNative 里 WebView 没有提供 onScrollEndDrag 等拖动事件的回调,所以只能通过别的方法来实现。原生的 WebView 有这些回调,但是这样的话得借助 iOS 跟 android 两端的原生代码,这里我们只通过 js 来实现最终效果:

NodeJS编写命令行脚本

前言

前段时间电脑键盘和触摸板都用不了了,试了下重装系统都不行,还不小心丢了博客的 markdown 源文件,只剩 github 上的 html 文件…

事隔几个月后,刚好公司项目在发版前都要修改一些参数(如版本号等),人工修改的方式存在漏改或改错的风险,便学了下 NodeJS 写了个预发布脚本(然后也一起写了个工具将 hexo 的 html 文件转为需要的 markdown 文件…)

NSURLSession错误使用引起的网络阻塞问题

前言

最近一段时间公司的 APP 在某个时间段比较多人访问时,经常出现连接不上服务器的情况,刚开始我们一直都以为是服务器问题,运维同事做了一些措施还是不能解决。

后来在使用 Charles 抓包时,看到每次的接口请求,Keep-Alive 都是不生效的。

猜测是因为这里导致用户发起的每个请求,都要重新进行 DNS 解析、建立 SSL 握手等操作(尤其我们首页每次刷新还都会同时发起好几个请求…)。

而我们 DNS 用的貌似是第三方的服务,所以问题比较大可能是出在跟我们服务器的握手阶段(为了方便定位是什么问题,我在一个版本中,加入了错误码的提示,发现很多是超时、握手失败等情况)。

当很多人同时访问时,由于前面有大量握手(我们用的是 HTTPS,报文会比 HTTP 多一些)没建立成功,服务器还在忙着处理,后面的请求就处理不过来了,所以就阻塞了。

那应该如何解决呢?

__block修饰符探究

前言

我们知道,在 block 里面能读取外部变量,但是如果需要修改外部变量的值,需要给变量加上 __block 修饰符才行。

接下来让我们带着2个问题来研究一下:

  1. 为什么不加 __block 就只能读取,不能修改(即:block 的实现,是怎么达到不能修改的)
  2. 加了 __block 为什么就能修改