NSURLProtocol在WebView中的使用

WebView 里的网络求拦截,NSURLProtocol可以说是个挺好用的工具。它让你可以自己动手控制 HTTP 求,比如要不要缓存、加密、甚至拦截一些 JS 求都可以做到。

NSURLProtocol是 Foundation 里的抽象类,想玩它,得先自己写个子类,重写canInit(with:)startLoading()这些方法,在启动的时候注册一下。看着有点麻烦,但其实还蛮清晰的。

比如你可以写一个CustomNSURLProtocol类,在canInit(with:)里判断 URL 是不是你关心的,再在startLoading()里用NSURLConnection去发求,响应回来后通知 WebView。响应也快,逻辑也不绕。

要注意哦,WKWebView里用NSURLProtocol的话得特殊,需要借助WKURLSchemeHandler,不然是没效果的。像NSURLProtocol-WebKitSupport-master这个项目就做了不少兼容的事,值得一看。

NSURLProtocol可以让你像中间人一样管控所有 WebView 发起的求,做测试、搞调试、加安全通道都还挺方便的。但用的时候别太贪心,拦太多也容易出 bug,尤其在 WKWebView 里。

如果你正好在做 Hybrid App,或者想拦一拦 WebView 的 JS 求,不妨研究下这个方法,灵活又实用

zip
NSURLProtocol-WebKitSupport-master (1).zip 预估大小:22个文件
folder
NSURLProtocol-WebKitSupport-master 文件夹
file
.gitignore 619B
folder
NSURLProtocol+WebKitSupport 文件夹
file
AppDelegate.h 294B
file
ReplacingImageURLProtocol.m 1KB
file
image.png 17KB
file
ViewController.h 232B
folder
Base.lproj 文件夹
file
Main.storyboard 6KB
file
LaunchScreen.storyboard 2KB
file
ReplacingImageURLProtocol.h 259B
file
RootViewController.m 1KB
folder
Assets.xcassets 文件夹
folder
AppIcon.appiconset 文件夹
file
Contents.json 1KB
file
main.m 351B
file
RootViewController.h 238B
file
Info.plist 2KB
file
AppDelegate.m 2KB
file
ViewController.m 2KB
file
README.md 953B
folder
NSURLProtocol+WebKitSupport.xcodeproj 文件夹
folder
project.xcworkspace 文件夹
file
contents.xcworkspacedata 172B
file
project.pbxproj 15KB
file
LICENSE 1KB
folder
Source 文件夹
file
NSURLProtocol+WebKitSupport.h 343B
file
NSURLProtocol+WebKitSupport.m 2KB
file
snapshot.gif 1.16MB
zip 文件大小:1.19MB