crossapp webview控件的一个坑

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();
}

当敲了一通代码之后,满以为事情会按照期望的方向进行,但是结果却是,再次打开app,直接自动退出了 。

再次分析:既然将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


你可能感兴趣的:(crossapp webview控件的一个坑)