热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记录一个老问题:UIWebView加载网页中进入后台崩溃

UIWebView加载网页中进入后台崩溃网页中使用了OpenGLES绘制,根据Apple的要求,这个不能在后台绘制的(AnOpenGLESapplica
  1. UIWebView加载网页中进入后台崩溃
    网页中使用了OpenGL ES绘制,根据Apple的要求,这个不能在后台绘制的(An OpenGL ES application will be terminated if it attempts to execute OpenGL ES commands in the background.),解决方案:

  • 就是网页提供绘制开始和停止的接口供原生在进入后台和切换到前台时使用,但是我们使用的是其他厂家提供的链接,没有此接口。
  • 在前后台切换时,停止和重新加载UIWebView,调用stopLoading但是还是会在后台绘制,并不能停止OpenGL ES的绘制,所以排除此方法。
  • 改用WKWebView,因为这是Apple的bug,所以使用最新的API去替换,但是其他厂家提供的链接不支持WKWebView
  • 在Apple Forum中有开发者指出这是Apple的bug,并提供了解决方法,在进入后台时调用webView:enableGL方法设置为NO,进入前天后,调用webView:enableGL方法设置为YES

#import typedef void (*CallFuc)(id, SEL, BOOL);
typedef BOOL (*GetFuc)(id, SEL);
-(BOOL)webView:(UIWebView*)view enableGL:(BOOL)bEnable
{BOOL bRet = NO;do{Ivar internalVar = class_getInstanceVariable([view class], "_internal");if (!internalVar){NSLog(@"enable GL _internal invalid!");break;}UIWebViewInternal* internalObj = object_getIvar(view, internalVar);Ivar browserVar = class_getInstanceVariable(object_getClass(internalObj), "browserView");if (!browserVar){NSLog(@"enable GL browserView invalid!");break;}id webbrowser = object_getIvar(internalObj, browserVar);Ivar webViewVar = class_getInstanceVariable(object_getClass(webbrowser), "_webView");if (!webViewVar){NSLog(@"enable GL _webView invalid!");break;}id webView = object_getIvar(webbrowser, webViewVar);if (!webView){NSLog(@"enable GL webView obj nil!");}if(object_getClass(webView) != NSClassFromString(@"WebView")){NSLog(@"enable GL webView not WebView!");break;}SEL selector = NSSelectorFromString(@"_setWebGLEnabled:");IMP impSet = [webView methodForSelector:selector];CallFuc func = (CallFuc)impSet;func(webView, selector, bEnable);SEL selectorGet = NSSelectorFromString(@"_webGLEnabled");IMP impGet = [webView methodForSelector:selectorGet];GetFuc funcGet = (GetFuc)impGet;BOOL val = funcGet(webView, selector);bRet = (val == bEnable);}while(NO);return bRet;
}

  • 上一个方法中能解决一定概率的崩溃问题,但是不能从根本上解决,还是存在一定概率的崩溃,所以改用进入后台时,加载空白页面,移除UIWebView,清除delegate,销毁UIWebView。为什么还需要销毁呢?

因为只加载空白页的话,回到前台在加载之前的URL,那么加载出来之后点击返回的时候,会多了一层空白页,而不是返回上一个视图

参考地址:https://stackoverflow.com/questions/34891639/uiwebview-update-in-background-ive-got-a-exc-bad-access


推荐阅读
author-avatar
mobiledu2502937981
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有