CAWebView 控件 也就是浏览器控件,可以在app里面嵌入网页。
使用方法可以查看 CAWebView.h 里面的方法。基本上包含了常用浏览器的操作,比如前进、后退、刷新、javascript执行等等。当然还有CAWebViewDelegate
提供给的四个很有用函数。
今天说的坑就是 webview控件显示在主界面的时候,回到系统桌面视图,再次打开 app,就会出现界面卡死现象。
当然这个是发生在安卓系统下面的,IOS不知道。
问题分析:
不加入webview控件,app不会出现卡死,加了之后就会出现。肯定是webview的问题了。
尝试办法:
1.程序进入后台之后,将 webview 从它的主视图移除,程序从后台恢复,将webview添加的 它的主视图里面。
涉及相关函数
AppDelegate.cpp文件下面的applicationDidEnterBackground() 和 applicationWillEnterForeground(),
如果不知道 程序启动流程的,建议看一下 Cocos2d-x高级开发教程.pdf,因为crossapp就是从cocos2dx移植过来的(当然肯定改了很多东西,不然一个游戏界面耗电量那是相当的惊人)。
建议使用 CClog 来调试 一些相关信息,能够帮助你更快的定位问题的所在。
下面是我在确认程序启动过程中 添加的一个调试信息。
// This function will be called when the app is inactive. When comes a phone call,it's be invoked too void AppDelegate::applicationDidEnterBackground() { CAApplication::getApplication()->stopAnimation(); //add MainPageViewController *pmain = MainPageViewController::getInstance(); if (pmain) { pmain->applicationDidEnterBackground(); } CCLog("----applicationDidEnterBackground"); // if you use SimpleAudioEngine, it must be pause // SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic(); }
再次分析:既然将webview移除视图不行,那么就之后删除掉,等下次进入的之后新建一个。说做就做,这次和期望的一样。
如果想恢复最后一次的网页,可以查看CAWebViewDelegate类
事情按照预期的方向进行着,但是查看日志会发现, applicationWillEnterForeground和applicationDidFinishLaunching 这两个函数调用 没有规则。大部分情况下都在调用applicationDidFinishLaunching这个函数,可能是硬件问题。
少部分时候回调用 applicationWillEnterForeground这个函数,但是这个函数只要一调用,有很大几率回出现黑屏情况。
继续分析,还是webview问题。webview控件在视图之前启动了,并且加入了试图控制器里面。但是程序开始的时候创建webview是没问题的。分析到这里,思路就出来了,
在 applicationWillEnterForeground函数里面,启动一个定时器。定时2秒之后(当app里面的控件都启动布局之后),再创建一个webview控件,添加到试图控制器里面。
代码如下:
// this function will be called when the app is active again void AppDelegate::applicationWillEnterForeground() { CAApplication::getApplication()->startAnimation(); //add MainPageViewController *pmain = MainPageViewController::getInstance(); if ( pmain) { pmain->applicationWillEnterForeground(); } CCLog("----applicationWillEnterForeground"); // if you use SimpleAudioEngine, it must resume here // SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic(); }
void MainPageViewController::applicationWillEnterForeground() { //重新生成WebControl //initWebControl(); CAScheduler::getScheduler()->schedule(schedule_selector(MainPageViewController::web_callback) , this , 2.2 ,false , 0 ); }
void MainPageViewController::web_callback(float index) { CCLog("----web_callback"); initWebControl(); }
void MainPageViewController::initWebControl() { deleteWebControl(); CADipRect re = getView()->getBounds(); re.size.height = re.size.height*0.9; pweb = CAWebView::createWithFrame( re ); if ( !pweb ) { CCLog("-----create webview error;"); exit(0); } else { this->getView()->addSubview(pweb); pweb->loadURL("https://www.baidu.com/"); CCLog("-----create webview successed;"); } }
当代码敲到这里的时候,调试OK