0

I reference resources

enter image description here

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.

1
  • I was tortured miserably. There is a network request in this WebView, which is not the requested resource file, but an interface. So it crashed on ios13.
    – luca
    Commented Jul 4, 2022 at 13:11

1 Answer 1

0

Try this before your request in your custom handler.

SEL selector = sel_registerName("_setLoadResourcesSerially:");
id webViewClass = NSClassFromString(@"WebView");
if ([webViewClass respondsToSelector:selector]) {
   [webViewClass performSelector:selector withObject:@NO];
}

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.

Not the answer you're looking for? Browse other questions tagged or ask your own question.