使用Charles Proxy提升iOS开发效率
以前做前端开发的时候,使用最多的工具就是 Fiddler ,用来定位问题、模拟特定场景非常方便,极大提升了开发效率。
而转做 iOS 开发以后,一大头疼的问题是 Fiddler 没有 Mac 版,幸亏找到了 Charles Proxy 这个还不错的替代工具,不过使用上与 Fiddler 还是有不少区别
另外据我不完全的观察,不少 iOS 开发工程师并不习惯于使用 HTTP 抓包工具……因此我觉得还是有必要写一篇文章介绍下 Charles
试用 & 正版 & 破解
Charles 是收费软件,可以免费试用 30 天。试用版本每次使用时间不能超过 30 分钟,使用过程中不定时会中断 5 秒钟,并且启动时将会有 10 秒种的延时。因此,该试用方案对广大用户还是相当友好的,只是当你需要长时间进行封包调试时,会因为 Charles 强制关闭而遇到影响。
如果手头经济宽裕,建议上官网购买正版。
除此之外,网上也有破解版,在 http://charles.iiilab.com/ 这个网站可以下载到Charels各个版本的破解版。
使用与配置
鉴于 Charles 的使用教程非常多,本文不打算写成入门教程,而是针对常见的开发场景,介绍如何使用 Charles 提高开发效率
基础的使用,可以参考 iOS开发工具——网络封包分析工具Charles
Charles 本质上是一个 HTTP 代理服务器,因此需要在 iOS 设备上配置代理,不过这也意味着 Charles 只能抓取手机连接 WIFI 时的 HTTP 包,而 3G/4G 则不行
另外强烈建议使用之前先简单了解一下 HTTP 协议,Charles 毕竟只是个工具而已
使用场景
快速定位 BUG 原因
App 开发中最常见的问题是,某个界面需要通过后端 HTTP 接口获取数据并展示,而测试妹子给你提了个 BUG,告诉你这个界面没数据或者数据有误
初级工程师常犯的错误是:一开始就打断点 Debug 或者一口咬定是后端问题,这常常会造成时间的浪费
正确的做法是先缩小 BUG 原因范围,再准确定位,通常我会按照这样的顺序来诊断:
1. Charles 抓到相应的 HTTP 包了吗?没抓到请 debug App 代码
2. 抓到的包 HTTP 响应正确吗?
* 如果无响应,或者 HTTP status 是4xx/5xx/,责任果断推给后端
* 响应是否符合接口文档定义?完全不符合或者多了/少了JSON 字段,责任果断推给后端
* 响应符合定义,但是是报错信息,那么可能是 HTTP 请求不正确,对照请求与文档定义,如果无误,说明文档有错漏……责任依然推给后端
3. 以上都正确,那么问题应该在 App 端,请开始 debug 代码
记得拿着 Charles 的抓包结果截图去找后端,这比 Xcode 控制台打出来的信息更容易说服他们
禁用响应缓存
关于查看响应的部分,有一点需要注意的是,现在不少后端服务都会开启 Etag (不了解的请看维基百科)
而如果你使用了 AFNetworking ,那么可能在 Charles 中看不到响应内容(304响应没有 body)
解决方法是点击菜单Tools → No caching,在界面中开启全局或针对特定域名的缓存禁用模式![]()
快速构造请求中、请求失败
通常 App 在发起请求时会有过渡效果(比如转菊花⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄),在请求失败时会有错误提示
不过在开发过程中由于同在一个局域网请求过程通常非常短,一般也不会失败,那怎么去调试这两种界面呢?
一种方式是使用 OHHTTPStubs 这个库通过 Mock 来构造响应,缺点是要写代码,另一种就是使用 Charles 了
先启动 App 发起一次请求,然后在 Charles 中找到相应的请求,点击右键勾选『Breakpoints』![]()
这样,下次 App 再发起同样 URL 的请求时,Charles 会给你一个断点界面,你可以选择 Excute 或者 Abort
![]()
如果要调试请求失败的界面,那就点 Abort,App 会进入 HTTP 请求失败的处理流程
如果要调试请求中的界面,那就停在这个断点界面即可,调试完了再点 Abort 或者 Excute
实际操作过程中会发现 Excute 需要点击两次才能完成一次 HTTP 请求,这是为什么呢?请看下节
构造期望的响应数据
App 中常有一些界面会根据后端数据的不同而展现不同的样式,那么在开发过程中就期望后端接口能返回一些特定的数据。如果巴望着后端同学替你『造数据』那就不太现实了,可行的方式依然是上面提到的两种,通过 OHHTTPStubs mock,或者使用 Charles
而 Charles 里要构造数据又有两种方式
实时修改响应
前面提到需要点击两次 Excute 才能完成一次 HTTP 请求,原因是,Charles 的断点功能分别提供了修改 HTTP Request 和 Response 的机会
在点击第二次 Excute 之前,我们可以实时修改响应的内容,点击『Edit Response』,然后选一种合适的展示面板修改即可,比如如果是 JSON 响应的话,推荐使用 JSON 面板![]()
映射本地文件
另外一种方式就类似于 OHTTPStubs 了,可以将本地文件指定为特定 URL 的响应
首先依然需要先让 Charles 抓取到相应的 HTTP 请求,然后在请求上点右键,选择最下面的『Map Local』![]()
然后在弹出界面中选择本地文件 ![]()
这种方式最大的用处是,当后端接口开发尚未完毕时,App 端可以『自给自足』地完成完整的界面流程。
另外 Charles 还提供了对已有 Map 规则的导入导出功能,这样就可以将编好的整套规则共享给其他同事了,方法是点击菜单 Tools → Map Local,在弹出界面中点击 Export ![]()
最后剧透下,我正在考虑如何通过工具将 Map Local 与后端开发流程连接,更高效地实现 App 开发,至于时间点嘛……哈哈
使用Charles Proxy提升iOS开发效率的更多相关文章
- fir.im Weekly - 17 个提升 iOS 开发效率的必备工具
本期 fir.im Weekly 精选了一些iOS 开发工具和动画源码分享,希望每个开发者能专注效率.实用.灵感. iOS开发工具--如何优化ipa包大小 @iOS程序犭袁 推荐了关于"如 ...
- iOS之17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...
- 17个提升iOS开发效率的必用工具
时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...
- 10个提升iOS开发效率的必用工具
Xcode插件 几乎所有开发者都知道Alcatraz是一个开源的包管理工具,可以让我们更轻松地管理各种插件.接下来就介绍下我的最推荐的10个插件: 10.HOStringSense 在编辑字符串的时候 ...
- iOS-提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- iOS开发——实用篇&提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- 【老孟Flutter】6种极大提升Flutter开发效率的工具包
老孟导读:本文介绍6种极大提升Flutter开发效率的工具包. [1] 强大的日志软件包 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面 ...
- Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725
Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...
- atitit.提升软件开发效率大的总结O5
atitit.提升软件开发效率大的总结O5 #---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建 ...
随机推荐
- C#中string和byte[]相互转换问题解决
本来想讲string转换为byte数组,通过在VS上打 ‘str. “来找,结果半天没发现跳出来的函数中有想要的,哭瞎 /(ㄒoㄒ)/~~ 这回将两种情况都记下来了.... string ---> ...
- How To Use ggplot in ggplot2?
1.What is ggplot2 ggplot2基本要素 数据(Data)和映射(Mapping) 几何对象(Geometric) 标尺(Scale) 统计变换(Statistics) 坐标系统(C ...
- DIV+CSS清除浮动方法
一.为什么要清除浮动? 1>父元素在未定义高的情况下,由于子元素全部浮动脱离文本流,而造成父元素高的塌陷(正常情况下,父元素的高是由未浮动的子元素撑起来) 2>因为部分子元素的而浮动,脱离 ...
- JVM知识在离线数据中的运用
又是飞花的季节了.多愁善感的林妹妹看到柳絮说:“嫁与东风春不管,凭尔去,忍淹留.”宝姐姐看了却来一句:“好风凭借力送我上青云”. 特别羡慕情商高的人,经常在想他们是怎么做到的.从来看不出他们不喜欢谁, ...
- 什么是javascript中的静态方法?一个例子让你懂~!
function Foo(){ this.age = 28};var a = new Foo();alert(a.age);//28alert(a.name);//undifined Foo.name ...
- nginx学习笔记——http module分析
源码:nginx 1.12.0 nginx由于其高性能.扩充性好等特点在迅速走红,越来越多的公司采用nginx作web服务器.负载均衡.waf等 工作,一些基于nginx ...
- C++ 头文件系列(system_error)
1.为什么system_error "....report error conditions originating from the operating system or low-lev ...
- JS理解之闭包
首先,闭包是什么?这个问题,百度上一大堆,然后我也是,现在学的有点累,来回顾一下吧算是,懂的自动略过,小弟不才,道行入不了你们法眼. 我认为的闭包是,就是取到,不是在自己作用域内或者按照js的规则,娶 ...
- JavaWeb的国际化(17/4/8)
国际化的缺点: 因为文字不同,所以带来的排版问题一样严重,通常都是重新在写一个网站反而更加清晰,快捷 1:需要从浏览器中获取到浏览器语言(Accept-Language) 2:利用locale获取 ...
- # Android动画笔记
标签: Android开发艺术探索笔记 View动画 帧动画 属性动画 View动画 View动画的作用对象时View,有4种动画效果,分别是平移动画.缩放动画.旋转动画.和透明度动画. 此类动画通常 ...