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

  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 <objc/runtime.h>


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值