This is my crash stack
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x18)
frame #0: 0x00000001bbb513c4 WebCore`WebCore::blobRegistry() + 20
frame #1: 0x00000001bbb7c484 WebCore`WebCore::createHTTPBodyCFReadStream(WebCore::FormData&) + 32
frame #2: 0x00000001bbb7cec4 WebCore`WebCore::setHTTPBody(_CFURLRequest*, WebCore::FormData*) + 56
frame #3: 0x00000001bab1e48c WebCore`WebCore::ResourceRequest::doUpdatePlatformHTTPBody() + 120
frame #4: 0x00000001bbb763b4 WebCore`WebCore::ResourceRequestBase::updatePlatformRequest(WebCore::HTTPBodyUpdatePolicy) const + 68
frame #5: 0x00000001bab1d018 WebCore`WebCore::ResourceRequest::nsURLRequest(WebCore::HTTPBodyUpdatePolicy) const + 20
frame #6: 0x00000001ba39cb04 WebKit`WebKit::WebURLSchemeTask::nsRequest() const + 68
frame #7: 0x0000000102cd2b8c pregnancy`-[BBURLSchemeHandler webView:startURLSchemeTask:](self=0x00000002830f0f00, _cmd="webView:startURLSchemeTask:", webView=0x000000012ebaea00, urlSchemeTask=0x00000002830f60a0) at BBURLSchemeHandler.m:89:55
frame #8: 0x00000001ba343b34 WebKit`WebKit::WebURLSchemeHandlerCocoa::platformStartTask(WebKit::WebPageProxy&, WebKit::WebURLSchemeTask&) + 128
frame #9: 0x00000001ba39bb64 WebKit`WebKit::WebURLSchemeHandler::startTask(WebKit::WebPageProxy&, WebKit::WebProcessProxy&, unsigned long long, WebCore::ResourceRequest&&, WTF::CompletionHandler<void (WebCore::ResourceResponse const&, WebCore::ResourceError const&, WTF::Vector<char, 0ul, WTF::CrashOnOverflow, 16ul> const&)>&&) + 220
frame #10: 0x00000001ba36c9b4 WebKit`WebKit::WebPageProxy::startURLSchemeTaskShared(WTF::Ref<WebKit::WebProcessProxy, WTF::DumbPtrTraits<WebKit::WebProcessProxy> >&&, WebKit::URLSchemeTaskParameters&&) + 96
frame #11: 0x00000001ba36c91c WebKit`WebKit::WebPageProxy::startURLSchemeTask(WebKit::URLSchemeTaskParameters&&) + 52
frame #12: 0x00000001ba5bc888 WebKit`WebKit::WebPageProxy::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 22416
frame #13: 0x00000001ba149cd4 WebKit`IPC::MessageReceiverMap::dispatchMessage(IPC::Connection&, IPC::Decoder&) + 104
frame #14: 0x00000001ba398000 WebKit`WebKit::WebProcessProxy::didReceiveMessage(IPC::Connection&, IPC::Decoder&) + 32
frame #15: 0x00000001ba134684 WebKit`IPC::Connection::dispatchMessage(std::__1::unique_ptr<IPC::Decoder, std::__1::default_delete<IPC::Decoder> >) + 204
frame #16: 0x00000001ba1375bc WebKit`IPC::Connection::dispatchIncomingMessages() + 612
frame #17: 0x00000001c18b79fc JavaScriptCore`WTF::RunLoop::performWork() + 276
frame #18: 0x00000001c18b7cbc JavaScriptCore`WTF::RunLoop::performWork(void*) + 36
frame #19: 0x00000001b2aeca00 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
frame #20: 0x00000001b2aec958 CoreFoundation`__CFRunLoopDoSource0 + 80
frame #21: 0x00000001b2aec0f0 CoreFoundation`__CFRunLoopDoSources0 + 180
frame #22: 0x00000001b2ae723c CoreFoundation`__CFRunLoopRun + 1080
frame #23: 0x00000001b2ae6adc CoreFoundation`CFRunLoopRunSpecific + 464
frame #24: 0x00000001bca87328 GraphicsServices`GSEventRunModal + 104
frame #25: 0x00000001b6bf463c UIKitCore`UIApplicationMain + 1936
frame #26: 0x000000010372b920 pregnancy`main(argc=1, argv=0x000000016d4db7e8) at main.m:19:16
frame #27: 0x00000001b2970360 libdyld.dylib`start + 4
here is my code in my custom scheme handler
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask{
[self.hashTable addObject:urlSchemeTask];
NSString *filePath = [self filePath:urlSchemeTask.request];
BOOL resourceExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath];
if (resourceExist && filePath.length > 0) {
NSString *mineType = [self fileMIMETypeWithCAPIAtFilePath:filePath];
NSData *data = [NSData dataWithContentsOfFile:filePath];
[self sendRequestWithUrlSchemeTask:urlSchemeTask mimeType:mineType requestData:data];
} else {
[[[NSURLSession sharedSession] dataTaskWithRequest:urlSchemeTask.request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (!urlSchemeTask) {
return;
}
if ([self.hashTable containsObject:urlSchemeTask]) {
if (error){
[urlSchemeTask didFailWithError:error];
} else {
@try {
[urlSchemeTask didReceiveResponse:response];
[urlSchemeTask didReceiveData:data];
[urlSchemeTask didFinish];
} @catch (NSException *exception) {
} @finally {
}
}
[self.hashTable removeObject:urlSchemeTask];
}
});
}] resume];
}
}
- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask {
if ([self.hashTable containsObject:urlSchemeTask]) {
[self.hashTable removeObject:urlSchemeTask];
}
}
I intercept http & https by WKWebView category with code
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method originalMethod1 = class_getClassMethod(self, @selector(handlesURLScheme:));
Method swizzledMethod1 = class_getClassMethod(self, @selector(bbhandlesURLScheme:));
method_exchangeImplementations(originalMethod1, swizzledMethod1);
});
}
+ (BOOL)bbhandlesURLScheme:(NSString *)urlScheme {
if ([urlScheme isEqualToString:@"http"] || [urlScheme isEqualToString:@"https"]) {
return NO; //这里让返回NO,应该是默认不走系统断言或者其他判断啥的
} else {
return [self bbhandlesURLScheme:urlScheme];
}
}
When the webview contains a network interface request,the webview crashed with Thread 1: EXC_BAD_ACCESS (code=1, address=0x18) on my code NSString *filePath = [self filePath:urlSchemeTask.request]; This only occur on iOS 13. On iOS12、 iOS13.5 or ios14、 iOS15 and so on it works fine. Who knows this, please please help me.
Try this before your request in your custom handler.
Thanks for Rick Huang.First I try to call this method by webview instance.The crash also.Then I consult this method in wkwebview source code, I saw this method is a class method. Then I try to call this with webview class instance. It works good. I am very glad. Thanks for one more time.