NetworkResponseSpoofer
NetworkResponseSpoofer 是一个适用于 iOS、watchOS、tvOS 和 macOS 的网络响应记录和回放库。它基于 Foundation URL 加载系统 构建,以使记录和回放网络请求变得非常简单。
入门指南
在开始之前,将 Spoofer 框架导入您的应用程序委托中,并调用迁移方法。这将确保在发生更改的情况下,Spoofer DB 已迁移到最新版本。Spoofer 使用 Realm 作为数据库来存储所有网络响应,因此任何潜在的未来对数据库的更改都应在您的应用程序中反映出来。
# AppDelegate.swift
@import NetworkResponseSpoofer
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Run migrations first before accesing the Spoofer
// Pass the schema version (Optional) if you use Realm within your app as well and need to decide a specific schema version
Spoofer.runMigrations(newSchemaVersion: X)
// Do other setup stuff
return true
}
开始录制
Spoofer.startRecording(inViewController: self) // Provide scenario name using built-in UI
--OR--
Spoofer.startRecording(scenarioName: "Give a name to your scenario") // Provide scenario name directly from code
录制可以通过从 UI(BDD/UI 测试/手动交互)提供场景名称或通过代码(如果更愿意这样操作)来启动。每个场景都需要一个名称。一旦完成一轮录制(端到端),停止录制并将保存该会话下的请求和响应到该场景。
停止录制
Spoofer.stopRecording()
停止录制并将在应用程序的文档目录下保存场景(在 Documents/Spoofer/ 之下)。如果您使用的是内置UI,则不需要此方法。
开始回放
Spoofer.showRecordedScenarios(inViewController: self) // Shows a list of recorded scenarios, select one to start replay
--OR--
Spoofer.startReplaying(scenarioName: "Scenario name to replay") // Directly start replaying a recorded scenario
第一种方法显示文档目录中可用的已录制场景列表。从列表中点击场景将立即开始回放,并在场景内部提供响应。如果您已经知道场景名称并且不希望使用选择UI,请使用第二种方法。UI还允许配置Spoofer行为和切换一些设置,所以试一下。
停止回放
停止当前场景的回放
Spoofer.stopReplaying()
如果您使用的是内置UI,则不需要此方法。
导出和导入场景
Spoofer使用应用的沙箱文档文件夹来保存场景文件。文件位置也会打印在控制台上,以方便使用。应用程序的文档文件夹是一个易变的位置,因为模拟器重置和应用删除都会导致该文件夹被删除。因此,请在外部备份您的Spoofer套件,并使用脚本将它们在文件夹之间移动以进行备份。
拦截响应(可选配置)
欺骗器通过混淆默认和短暂的会话配置来插入其协议以进行网络拦截。如果这似乎不起作用,您可以在项目中创建一个URLSessionConfiguration扩展,并添加类似以下代码(针对默认和短暂的)以使欺骗器拦截通过URLSession发生的任何网络交互。然后使用欺骗配置而不是默认/短暂的配置。请注意,仅在调试配置中插入欺骗器协议。
extension URLSessionConfiguration {
static var spoofedDefault: URLSessionConfiguration {
let sessionConfig = URLSessionConfiguration.default
#if DEBUG
var protocolClasses = sessionConfig.protocolClasses
protocolClasses?.insert(SpooferRecorder.self, at: 0)
protocolClasses?.insert(SpooferReplayer.self, at: 0)
sessionConfig.protocolClasses = protocolClasses
#endif
return sessionConfig
}
}
文档
更多详细信息请参阅这里。
高级配置
白名单主机名
默认情况下,欺骗器将拦截并保存所有来自应用的HTTP请求和响应。如果需要选择,请提供以下包含您想要记录请求和响应的域的数组。一旦设置domainsToSpoof,则只有指定的域调用将被拦截。
Spoofer.hostNamesToSpoof(["example1.com","example2.com"])
黑名单主机名
黑名单与上述作用相反,允许忽略选择的主机名,同时欺骗器记录网络请求和响应。
Spoofer.hostNamesToIgnore(["example3.com","example4.com"])
黑名单路径
黑名单特定需要忽略的路径以不进行记录。
Spoofer.pathsToIgnore(["tracking","logging"])
忽略路径
如果端点有需要忽略的子域,可以按照以下方式设置。这样可以实现在一个域中记录的响应回放到另一个域。Spoofer通过正常化URL,将 example.qa.com 变为 example.com
Spoofer.subDomainsToNormalize(["DEV","QA","PREPROD"])
忽略查询参数
如果构造的URL包含动态出现和消失的查询参数,响应查找可能会在回放期间失败。为了避免这种情况,设置忽略规则,以便在比较URL之前移除这些查询参数。
Spoofer.queryParametersToNormalize(["node","swarm","cluster"])
忽略路径组件
如果构造的URL包含在环境之间变化的路径组件,响应查找可能会在回放期间失败。为了避免这种情况,为这样的路径组件设置忽略规则,以便在比较URL之前删除它们。
Spoofer.pathComponentsToNormalize(["v1","v1.1"])
替换路径范围
如果构造的URL包含提供类似响应并需要互换或删除的路径组件,可以设置替换。例如,在以下情况下,对于具有任何id值的行程的请求,将始终使用保存的行程响应。
Spoofer.pathRangesToReplace([URLPathRangeReplacement(start: "/trip/", end: nil, replacement: "")])
规范化查询值
Spoofer.normalizeQueryValues = true
查询值规范化在比较URL时会丢弃查询参数的值(而不是键)。对于大多数情况,这意味着如果查询参数键相同,则每个端点只保存一个响应。效果是
- 减少场景文件大小,节省一些存储空间。
- 对于同一端点,无论查询参数值如何,都会产生一致的响应
允许自签名证书
Spoofer.allowSelfSignedCertificate = true
允许spoofer从自签名证书授权域记录。
来自欺骗者的回拨
方法 1
如果您需要更新用户界面或响应用户欺骗状态变更,请实现 SpooferDelegate 协议,并使用代理回调进行操作。
class MyClass: SpooferDelegate {
init() {
// Some setup code
...
Spoofer.delegate = self
}
}
然后实现以下方法
func spooferDidStartRecording(scenarioName: String)
func spooferDidStopRecording(scenarioName: String, success: Bool)
func spooferDidStartReplaying(scenarioName: String, success: Bool)
func spooferDidStopReplaying(scenarioName: String)
方法 2
欺骗者在其状态变更时将触发以下通知。您可以订阅这些通知并执行任何相关操作。
- spooferStartedRecordingNotification
- spooferStoppedRecordingNotification
- spooferStartedReplayingNotification
- spooferStoppedReplayingNotification
故障排除
欺骗者使用 Apple 统一日志 (os_log) 发送内部操作和结果以供审查。在 mac 上打开 Console.app,搜索来自子系统 "com.hotwire.networkresponsespoofer" 的消息以查看来自欺骗者的消息。这将使您可以排除与记录/回放相关的问题。
要求(最新版本)
- iOS 10+ / macOS 10.11+ / tvOS 10.0+ / watchOS 4.0+
- Xcode 10+
- Swift 5+
安装
Cocoapods
pod "NetworkResponseSpoofer"
# or
pod "NetworkResponseSpoofer/SpooferUI" # Only for iOS, brings in the built-in UI to manage spoofed scenarios and settings
Carthage
github "HotwireDotCom/NetworkResponseSpoofer"