乐于分享
好东西不私藏

NMocker:一款轻量级 iOS App 网络抓包与 Mock 工具

NMocker:一款轻量级 iOS App 网络抓包与 Mock 工具

无需证书、无需代理,基于NSURLProtocol吧无侵入拦截,搭配 Web 控制台和 Mac 应用,让 API 调试效率翻倍

前言

在日常 iOS 开发中,我们经常会遇到这样的场景:

  • 后端接口还没写好,但前端需要联调 UI
  • 某些异常场景(超时、5xx 错误)难以在真实环境中复现
  • 测试阶段需要验证 App 对不同返回数据的处理逻辑
  • 想要快速抓包查看 App 发出的网络请求,但不想配置代理和证书

通常我们会选择 Charles 或 Proxyman 这类工具,但它们需要配置代理、安装证书,流程繁琐,而且对 macOS 的开发者来说,还需要保持电脑和手机在同一网络环境下。

有没有一种更轻量的方式来解决这些问题?

NMocker 正是为了解决这些痛点而诞生的。

什么是 NMocker?

NMocker 是一款 iOS 网络拦截与 Mock 工具。它通过可视化无侵入拦截,拦截 App 内所有的 HTTP/HTTPS 请求,并提供 Web 控制台 和 原生 Mac 应用 两种调试方式,支持基于真实请求日志一键创建 Mock 规则。

简单来说:你只需要在 Debug 环境下集成 NMocker,启动服务后,就能在浏览器或 Mac 应用中实时查看所有网络请求,并一键生成模拟响应。

核心特性

🔀 无侵入拦截,可视化呈现

NMocker 的核心拦截能力让开发者可以在系统层面可视化地拦截、修改或模拟网络请求。

NMocker 通过可视化拦截方案,能够在不侵入业务代码的前提下,拦截 App 内所有通过 URLSession 和 URLConnection 发出的请求。

🌐 两种调试方式

NMocker 提供了两种调试方式,你可以根据场景灵活选择:

方式
优点
适用场景
Web 控制台
无需安装,浏览器即可访问
快速调试、临时查看
Mac 应用
支持 USB 连接
日常开发、无网络环境

📋 基于日志的一键 Mock

传统 Mock 工具需要手动配置规则(路径、方法、响应数据)。NMocker 的做法更直观:

  1. 在控制台中查看实时请求日志
  2. 点击任意请求的 "Mock" 按钮
  3. 编辑响应数据并保存

后续匹配该路径和方法的请求将自动返回你设置的模拟数据。整个过程无需手动编写任何规则配置

🎮 三种拦截模式

模式
行为
适用场景
Lazy
仅当 Web 控制台连接时拦截
日常开发,减少干扰
Adaptive
根据历史使用习惯智能启动窗口
默认推荐,平衡效率与体验
Eager
服务启动即拦截所有请求
深度调试

📡 实时请求日志

通过 Server-Sent Events (SSE) 技术,NMocker 将拦截到的请求详情(Headers、Body、响应数据)实时推送到控制台,无需刷新页面即可查看最新请求。

💾 规则持久化

Mock 规则通过 Keychain 持久化存储,App 重启后规则依然有效,无需重复配置。

效果预览

网络请求日志

Mock

Mac版

技术架构

NMocker 的整体架构分为四个核心层次:

┌─────────────────────────────────────────────────────┐│                   控制台层                           ││    Web 控制台 (Vue 3)  │  Mac 应用 (SwiftUI)       │├─────────────────────────────────────────────────────┤│                  服务层                              ││         GCDWebServer (内嵌 HTTP 服务器)              ││              SSE 实时推送                            │├─────────────────────────────────────────────────────┤│                  核心层                              ││    InterceptionManager  │  MockRuleEngine           ││    可视化拦截器         │  规则匹配 (LIFO)          │├─────────────────────────────────────────────────────┤│                  存储层                              ││    Keychain (规则持久化)                            │└─────────────────────────────────────────────────────┘

关键组件

1. 可视化拦截器

NMocker 的可视化拦截器会判断哪些请求需要拦截,并构建模拟响应或转发真实请求。

2. GCDWebServer 内嵌服务器

NMocker 使用 GCDWebServer 在 App 内启动轻量级 HTTP 服务器,提供 Web 控制台界面和 RESTful API。GCDWebServer 的优势在于:

  • 自动处理 iOS 后台任务,防止 App 被系统挂起
  • 支持异步响应和流式响应
  • 轻量级,无额外依赖

3. SSE 实时通信

通过 Server-Sent Events 实现日志实时推送,相比 WebSocket 更轻量,且无需复杂的握手协议。

4. Mac 应用

原生 SwiftUI 应用,通过 libimobiledevice 支持 USB 直连,即使手机和电脑不在同一局域网也能使用。

如何集成?

通过 CocoaPods(推荐)

pod 'NMocker', :configurations => ['Debug']

通过 Swift Package Manager

在 Xcode 中通过 File → Add Package Dependencies… 添加:

https://github.com/CodansYC/NMocker.git

基本使用

import NMocker// 启动服务(默认 .adaptive 模式)NMocker.shared.start()// 获取控制台地址if let url = NMocker.shared.serverURL {print("请在浏览器中打开: \(url)")}// 停止服务NMocker.shared.stop()

技术亮点与挑战

1. 可视化拦截的限制

可视化拦截虽然强大,但有一个众所周知的限制:无法拦截 WKWebView 中的请求。这是因为 WKWebView 运行在独立的进程中,不走 App 的 URL Loading System。

NMocker 主要面向 API 调试场景,针对的是 App 自身的网络请求。如果需要调试 WebView 内容,可以结合 WKNavigationDelegate 作为补充方案。

2. 多模式拦截策略

三种拦截模式的设计,让开发者可以根据场景灵活选择:

  • 开发初期用 Eager 模式捕获所有请求
  • 日常开发用 Adaptive 模式自动适应使用习惯
  • 非调试时段用 Lazy 模式避免性能损耗

3. 跨平台控制台

Web 控制台基于 Vue 3 + TypeScript 构建,支持亮色/暗色模式自动适配,提供丰富的 JSON 编辑和查看功能。

Mac 应用则支持 USB 直连,无需依赖网络环境。

总结与展望

NMocker 的核心设计理念是 让网络调试更简单、更高效。通过可视化实现无侵入拦截,结合 Web 控制台和 Mac 应用,让开发者能够专注于业务逻辑,而不是在工具配置上浪费时间。

目前 NMocker 已经在 GitHub 开源,欢迎 Star 和贡献!

GitHub 仓库:https://github.com/CodansYC/NMocker

CocoaPods:https://cocoapods.org/pods/NMocker

*如果你对 NMocker 有任何建议或想法,欢迎在 GitHub 上提 Issue 或 PR!*

原创文章 · 作者:chao

欢迎转发,转载请联系作者