iOS中的UIWebView在WebThread中崩溃

17

我正在寻求一些建议或帮助来诊断我所见到的这个崩溃。目前,我认为这可能是一个webkit bug,但任何可能性都存在,请提供您可能有的任何见解:

Hello! I'm here to answer your questions. Please feel free to ask me anything.

我进一步调查了堆栈跟踪,并在此处找到了Subresourceloader的代码 (https://webkit.googlesource.com/WebKit/+/master/Source/WebCore/loader/SubresourceLoader.cpp)。

我的猜测是,在这个点上,m_resource被标记为NULL(****),导致了崩溃:

void SubresourceLoader::didReceiveResponse(const ResourceResponse& response)
{
    ASSERT(!response.isNull());
    ASSERT(m_state == Initialized);
    // Reference the object in this method since the additional processing can do
    // anything including removing the last reference to this object; one example of this is 3266216.
    Ref<SubresourceLoader> protect(*this);
    if (m_resource->resourceToRevalidate()) {  ****
        if (response.httpStatusCode() == 304) {
            // 304 Not modified / Use local copy
            // Existing resource is ok, just use it updating the expiration time.
            m_resource->setResponse(response);
            memoryCache()->revalidationSucceeded(m_resource, response);
            if (!reachedTerminalState())
                ResourceLoader::didReceiveResponse(response);
            return;
        }
        // Did not get 304 response, continue as a regular resource load.
        memoryCache()->revalidationFailed(m_resource);
    }
...

你知道是什么操作导致了这个问题吗?比如说你尝试在UIWebView中打开哪个URL,或者是已经加载的页面上你尝试点击链接吗?另外我猜测UIWebView使用的代码和Safari是一样的,可以在这里找到:https://trac.webkit.org/browser。 - John Tracid
这是在启动我的应用程序时发生的。我无法分享URL,因为它位于私有IP范围内。我认为这与HTML5应用程序缓存有关,因为我的网站正在使用它。 - 1800 INFORMATION
你只是在UIWebView中打开你的私人URL并得到了这个崩溃,是吗?而且这种情况经常发生(所以可以重现),在崩溃的同一位置? - John Tracid
是的。最近我在调查我们的应用程序反复崩溃时遇到了这个问题。过了一段时间,它进入了一个状态,在这个状态下,每次尝试启动应用程序时都会崩溃,需要用户重新安装。 - 1800 INFORMATION
启用您的Zombie,然后我们可以轻松地找到这个问题的根本原因。或者在此基础上修改您的问题。这样就更容易找出根本原因。 - Alok
如果一个简单的UIWebView崩溃了,那么Safari也会出现同样的问题。如果你能在Safari中重现这个问题,那么它可能是一个Webkit问题。否则,它可能与如何设置webview有关,无论是通过对webview输出口的弱引用还是对以编程方式设置的webview的强引用。如果你对缓存有疑问,那么在加载webview中的url之前,请查看此网址以清除缓存。https://dev59.com/iG035IYBdhLWcg3wW-v0 - Omar
1个回答

5
如果重新安装后它可以运行,那么您可以尝试在没有缓存的情况下进行URL请求,因为我认为这将产生相同的结果。
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:30];
[webView loadRequest:request];

我猜测某个资源的缓存出了问题。

如果我有机会的话,我会根据这个建议和评论中的其他想法尝试一些东西。感谢您的建议。 - 1800 INFORMATION

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接