我目前没有使用applicationWillResignActive / applicationWillEnterForeground或任何类似的东西,因为我不确定如何确切地处理遇到的这个问题。
我的应用程序不断崩溃,如果我打开它,按下主屏幕,等待大约5分钟,并尝试重新进入应用程序。
这个应用程序主要是一个UIWebView,它加载了一个node.js驱动的websocket,所以我认为这就是罪魁祸首。
当用户离开应用程序时,我如何阻止UIWebView做任何事情/任何事情(我猜需要使用applicationWillResignActive)。我已经玩了六个想法,我无法让我的生活得到应用停止崩溃。
我现在的想法是:
- (void)applicationWillResignActive:(UIApplication *)application
{
[[NSNotificationCenter defaulCenter] postNotificationName:@"EnterBackground" object:Nil userInfo: Nil];
}然后,从...and编辑ViewController.m文件,对页面上的UIWebView做一些事情。问题是,什么能阻止UIWebView在后台做任何事情?我试过装腔作势,但由于某种原因没有成功,否则它还是会崩溃的。
发布于 2014-01-05 18:38:38
我无法重现确切的问题(从您的WebThread: EXC_BAD_ACCESS (code=1, address=0x5)-taken到other question),但我确实注意到WebSocket消息正在被缓冲,所以如果您将应用程序放在后台足够长的时间,您可能会遇到内存压力问题,这可能是造成这次崩溃的原因。
然而,在研究这个问题的过程中,我确实设法使应用程序与源自EXC_BAD_ACCESS的WebThread可靠地崩溃,所以我将在这里发布详细信息,希望它可能对您或其他人有用。
为了解决这个问题,我的WebSocket服务器每秒钟只向任何连接的客户端广播时间。
正如我提到的,我注意到当应用程序处于后台时,UIWebView正在缓冲WebSocket消息。为了防止这种情况,我想在应用程序被移到后台时关闭WebSocket连接。
在承载UIWebView的视图控制器中,我为UIApplicationWillResignActiveNotification注册了一个选择器,在该选择器中,我在网页中调用了一个在WebSocket对象上调用close的JavaScript函数。
ViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:nil];
}
- (void)appWillResignActive:(NSNotification *)notification
{
[self.webView stringByEvaluatingJavaScriptFromString:@"closeWebSocket();"];
}网页:
function closeWebSocket() {
socket.close(); // socket is an instance of WebSocket
socket = undefined;
}当应用程序移回前台时,我希望WebSocket重新连接,所以我注册了另一个选择器,这次是UIApplicationDidBecomeActiveNotification,在选择器中调用另一个函数来初始化WebSocket连接。
ViewController.m:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResignActive:)
name:UIApplicationWillResignActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
- (void)appWillResignActive:(NSNotification *)notification
{
[self.webView stringByEvaluatingJavaScriptFromString:@"closeWebSocket();"];
}
- (void)appDidBecomeActive:(NSNotification *)notification
{
[self.webView stringByEvaluatingJavaScriptFromString:@"openWebSocket();"];
}网页:
function openWebSocket() {
socket = new WebSocket("ws://" + document.location.host + "/ping");
socket.onopen = function () { console.log("Opened"); };
socket.onmessage = function (message) {
var log = $('#log');
log.html(message.data + '<br>' + log.html());
console.log(message.data);
};
socket.onclose = function () { console.log("Closed"); };
}运行该应用程序,建立WebSocket连接,接收消息,并将应用程序移到后台。几秒钟后,我将应用程序带回前台(点击应用程序图标),应用程序崩溃时出现了一个类似于WebThread: EXC_BAD_ACCESS (code=1, address=0x5的异常。造成这种情况的原因是应用程序返回到前台时对JavaScript对openWebSocket()的调用进行了评估。将openWebSocket()的执行延迟几毫秒就解决了这个问题。通过appDidBecomeActive方法,最终的结果如下:
- (void)appDidBecomeActive:(NSNotification *)notification
{
[self.webView stringByEvaluatingJavaScriptFromString:@"setTimeout(openWebSocket, 5);"];
}再次运行应用程序,建立WebSocket连接,接收消息,并备份应用程序。几秒钟后,当我把这个应用带回前台时,应用程序没有崩溃,消息又开始通过WebSocket连接。
https://stackoverflow.com/questions/20931120
复制相似问题