以前做前端开发的时候,使用最多的工具就是 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开发效率的更多相关文章

  1. fir.im Weekly - 17 个提升 iOS 开发效率的必备工具

    本期 fir.im Weekly 精选了一些iOS 开发工具和动画源码分享,希望每个开发者能专注效率.实用.灵感.  iOS开发工具--如何优化ipa包大小 @iOS程序犭袁 推荐了关于"如 ...

  2. iOS之17个提升iOS开发效率的必用工具

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我提升编码速度和工作效率的工具 ...

  3. 17个提升iOS开发效率的必用工具

    时间就是金钱.编码效率的提升意味着更多的收入.可是当我们的开发技巧已经到达一定高度时,如何让开发效率更上一层楼呢?答案就是使用开发工具!在这篇文章中,我会向你介绍一些帮助我们提升编码速度和工作效率的工 ...

  4. 10个提升iOS开发效率的必用工具

    Xcode插件 几乎所有开发者都知道Alcatraz是一个开源的包管理工具,可以让我们更轻松地管理各种插件.接下来就介绍下我的最推荐的10个插件: 10.HOStringSense 在编辑字符串的时候 ...

  5. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  6. iOS开发——实用篇&提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  7. 【老孟Flutter】6种极大提升Flutter开发效率的工具包

    老孟导读:本文介绍6种极大提升Flutter开发效率的工具包. [1] 强大的日志软件包 在开发 Flutter 的过程中打印日志是常用的调试方式之一,但 Flutter 内置的日志打印非常简单,下面 ...

  8. Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓 O725

    Atitit. 提升软件开发效率and 开发质量---java 实现dsl 4gl 的本质and 精髓  O725 1. DSL主要分为三类:外部DSL.内部DSL,以及语言工作台. 1 2. DSL ...

  9. atitit.提升软件开发效率大的总结O5

    atitit.提升软件开发效率大的总结O5 #---平台化.组件化 1 #--cbb公用模块的建设 1 #---内部最佳流程方法跟实践的总结 2 #---内部知识体系的建设 2 #---问题Qa库的建 ...

随机推荐

  1. PCIE_DMA实例三:Xilinx 7系列(KC705/VC709)FPGA的EDK仿真

    一:前言 好久没写博客了,前段时间有个朋友加微信请教关于PCIe的一些学习方法.本人也不是专家,只是略知一些皮毛.对于大家反馈的问题未必能一一解答,但一定知无不言.以后我会常来博客园看看,大家可以把问 ...

  2. C# WebClient、jQuery ajax jsonp实现跨域

    WebClient 无传输数据获取 Uri uri = new Uri(allURL); WebClient wc = new WebClient(); wc.Encoding = System.Te ...

  3. asp.net core源码飘香:Logging组件

    简介: 作为基础组件,日志组件被其他组件和中间件所使用,它提供了一个统一的编程模型,即不需要知道日志最终记录到哪里去,只需要调用它即可. 使用方法很简单,通过依赖注入ILogFactory(Creat ...

  4. tolua#代码简要分析

    简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类.它是一个用来简化在C#中集成lua的插件,可以自动生成用于在lua中访问Unity的绑定代码 ...

  5. python scrapy 抓取脚本之家文章(scrapy 入门使用简介)

    老早之前就听说过python的scrapy.这是一个分布式爬虫的框架,可以让你轻松写出高性能的分布式异步爬虫.使用框架的最大好处当然就是不同重复造轮子了,因为有很多东西框架当中都有了,直接拿过来使用就 ...

  6. Eclipse实现图形化界面插件-vs4e

    vs4e插件下载地址:http://visualswing4eclipse.googlecode.com/files/vs4e_0.9.12.I20090527-2200.zip 下载完成后,解压,然 ...

  7. 商城项目实战 | 1.1 Android 仿京东商城底部布局的选择效果 —— Selector 选择器的实现

    前言 本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 京东商城的底部布局的选择效果看上去很复杂,其实很简单,这主要是要 ...

  8. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  9. 使用 Composer 安装 Laravel 框架

    前言: 1. Composer 安装 Laravel 有两种方式: 第一种是通过 Composer 的 create-project 命令安装 Laravel 框架, 第二种是先通过 Composer ...

  10. Omi树组件omi-tree编写指南

    Omi框架能够以少量的代码声明式地编写可拖拽移动节点的树形组件. 通常树组件能够考验UI框架的健壮性,因为需要使用到UI框架的如下特性: 组件嵌套 组件传值 组件批量传值 组件依赖自身递归嵌套(nes ...