首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WKURLSchemeHandler在ios13上崩溃了,但是ios12或ios13后来很好

WKURLSchemeHandler在ios13上崩溃了,但是ios12或ios13后来很好
EN

Stack Overflow用户
提问于 2022-07-04 13:09:01
回答 1查看 109关注 0票数 0

I参考资源

在这里输入图像描述

这是我的崩溃堆栈

代码语言:javascript
复制
* 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

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

代码语言:javascript
复制
- (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];
}

}

代码语言:javascript
复制
- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask {
if ([self.hashTable containsObject:urlSchemeTask]) {
    [self.hashTable removeObject:urlSchemeTask];
}

}

我用代码拦截http & https按WKWebView类别

代码语言:javascript
复制
+ (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);
});

}

代码语言:javascript
复制
+ (BOOL)bbhandlesURLScheme:(NSString *)urlScheme {
if ([urlScheme isEqualToString:@"http"] || [urlScheme isEqualToString:@"https"]) {
    return NO;  //这里让返回NO,应该是默认不走系统断言或者其他判断啥的
} else {
    return [self bbhandlesURLScheme:urlScheme];
}

}

当webview包含一个网络接口请求时,webview在我的代码EXC_BAD_ACCESS *filePath = self filePath:urlSchemeTask.request上使用Thread 1: code=1( address=0x18)崩溃;这只发生在iOS 13上。在iOS 12、iOS 13.5或iOS 14、iOS15等上,它工作得很好。谁知道呢,请帮帮我。

EN

回答 1

Stack Overflow用户

发布于 2022-07-11 02:29:32

在您的自定义处理程序中的请求之前尝试这样做。

代码语言:javascript
复制
SEL selector = sel_registerName("_setLoadResourcesSerially:");
id webViewClass = NSClassFromString(@"WebView");
if ([webViewClass respondsToSelector:selector]) {
   [webViewClass performSelector:selector withObject:@NO];
}

感谢瑞克Huang.First,我试图通过webview instance.The crash also.Then调用这个方法,我在wkwebview源代码中查阅了这个方法,我看到这个方法是一个类方法。然后我尝试用webview类实例来调用它。效果很好。我很高兴。谢谢你再来一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72857291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档