wkurlschemehandler在ios13上坠毁,但是ios12或ios13以后它的工作正常

发布于 2025-02-12 21:09:15 字数 6582 浏览 0 评论 0原文

我参考资源

https://i.sstatic.net/cugjs.png“ rel =” nofollow noreferrer“>在这里输入图像描述

这是我的崩溃堆栈,

* 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

这是我的自定义方案处理程序中的代码

- (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];
}

}

我拦截了http&amp; https by wkwebview类别带有代码

+ (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];
}

}

当WebView包含网络接口请求时,WebView在我的代码nsstring上遇到了线程1:exc_bad_access(code = 1,地址= 0x18),我的代码nsstring *filepath *filepath = [self filepath = [self filepath:urlschemetask.request.request.requeest.requeest.requeest.requeest.requeest.requeest.requeest.requeest.requeest.request];这仅在iOS 13上发生。在ios12,ios13.5或ios14 、IOS15上,它效果很好。谁知道这一点,请帮助我。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

回心转意 2025-02-19 21:09:15

在您的自定义处理程序中请求之前先尝试一下。

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

感谢您的Rick Huang.first我尝试通过WebView实例调用此方法。此外,我也会在WKWebView源代码中咨询此方法,我看到此方法是类方法。然后,我尝试使用WebView类实例调用此。它效果很好。我很高兴。谢谢再一次。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文