经验 · 在 iOS 中遇到的一个前端问题

最近同事遇到一个问题,正好我有 iOS 经验就一块帮忙看了看,复盘一下整个问题的解决思路。

问题背景:iOS 请求 node 的一个接口的时候,「偶尔」会出现「乱码」。但是在浏览器和安卓设备中都没有问题,只有 iOS 有问题。

由于涉及到跨部门沟通的问题,对方明确告诉我们是前端的问题,然后丢给我们一张图,让我们自己解决。

经验 · 在 iOS 中遇到的一个前端问题_第1张图片

对于前端同学来说,通过页面展示的结果来看,确实是乱码。如果站在 iOS 角度上来说,乱码只是表象,问题本质是 initWithData 这个方法返回结果为 nil 。代码中,当 initWithData 返回结果为空时,尝试以其它编码的方式进行解码, 本来是 utf8 编码的二进制,使用其它编码方式进行解码,结果肯定会有乱码(比如中文)。这就是前端所看到的乱码表象。

此处有一坑,如果让前端同学解决,找问题的切入点就会通过乱码来切入,这样很难解决问题,所以还需要 iOS 同学配合。正好我以前搞过 iOS,然后可以帮忙一块看看这个问题。

通过另一位同事查看源码得知,上面截图中的代码是 RN 项目中的源码。那就好办了,有源码后问题好办多了。到 github 找到代码:

https://github.com/facebook/react-native/blob/aee88b6843cea63d6aa0b5879ad6ef9da4701846/Libraries/Network/RCTNetworking.mm

发现官方的代码和截图中的代码并不一致。

经验 · 在 iOS 中遇到的一个前端问题_第2张图片

首先想到的是版本导致,现在使用的 RN SDK 并不是最新的版本。查看提交记录,看看官方是为啥要改的这段代码。查看历史记录发现在 4 年前有人已经修复了这个问题:

经验 · 在 iOS 中遇到的一个前端问题_第3张图片

继续看一下这个问题的详细说明,大意是说 HTTP 请求时,如果是增量返回数据的时候,可能会导致这个问题,这正是我们目前遇到的问题:

经验 · 在 iOS 中遇到的一个前端问题_第4张图片

既然定位到了问题,要么 iOS 升级 RN SDK,要么 node 返回数据时一次都返回,去掉对 range 的支持。让 iOS 立刻升级 RN SDK 不太现实,毕竟 iOS 发版是一件很难的事情。所以只能在 node 层修改了。

我特意搜了下 initWithData 这个方法返回 nil 时的解决方案:

经验 · 在 iOS 中遇到的一个前端问题_第5张图片

都不太优雅,其实通过 RN SDK 中提供的方法,可以很优雅解决这个问题。

总之,通过这次经验,解决问题主要需要主要几点:

1、要找到导致问题的本质原因,避免被问题表面所迷惑;

2、多找身旁的同事聊聊,听听他们的建议;

3、多学点,总是没错的;

4、遇到问题要复盘,找到导致问题的本质原因,这样成长会快很多;

大家加油!


推荐阅读:

vim 电脑壁纸来了(3种主题)

npm install -g 的时候别再输密码了

你可能感兴趣的:(经验 · 在 iOS 中遇到的一个前端问题)