我目前没有使用applicationWillResignActive/applicationWillEnterForeground或类似的东西,因为我不确定如何处理我遇到的这个问题.
如果我打开它,我的应用程序不断崩溃,按主屏幕,等待大约5分钟,并尝试再次返回应用程序.
该应用程序主要是一个UIWebView加载node.js驱动的websocket,所以我认为这是罪魁祸首.
当用户离开应用程序时,如何阻止UIWebView执行任何操作(applicationWillResignActive是我猜测需要使用的).我已经玩了六个想法,我不能为我的生活让应用程序停止崩溃.
我目前的想法:
- (void)applicationWillResignActive:(UIApplication *)application { [[NSNotificationCenter defaulCenter] postNotificationName:@"EnterBackground" object:Nil userInfo: Nil]; }
...然后从那里编辑我的ViewController.m文件,对该页面上的UIWebView做一些事情.问题是,什么会阻止UIWebView在后台执行任何操作?我试过停止加载,由于某种原因没有成功,或者它仍会崩溃.
我无法重现确切的问题(WebThread: EXC_BAD_ACCESS (code=1, address=0x5)
从你的其他问题中找到了) - 但是我确实注意到WebSocket消息正在被缓冲,所以如果你在背景中留下足够长的应用程序,你可能会遇到内存压力问题可能是导致此次崩溃的原因.
然而,在研究这个问题的过程中,我还是设法使应用程序可靠地崩溃EXC_BAD_ACCESS
源自WebThread
所以我会在这里,希望它可能使用到您或其他人张贴的细节.
出于这个问题的目的,我的WebSocket服务器只是每秒向任何连接的客户端广播时间.
正如我所提到的,我注意到UIWebView在应用程序背景时缓冲了WebSocket消息.为了防止这种情况,我想在将应用程序移动到后台时关闭WebSocket连接.
在我托管UIWebView的视图控制器中,我UIApplicationWillResignActiveNotification
为该选择器注册了一个选择器,我在我的网页中调用了一个调用close
WebSocket对象的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
.造成这种情况的原因是评估openWebSocket()
应用程序返回前台时的JavaScript调用.延迟执行openWebSocket()
几毫秒就解决了这个问题.通过appDidBecomeActive
方法最终看上去是这样的:
- (void)appDidBecomeActive:(NSNotification *)notification { [self.webView stringByEvaluatingJavaScriptFromString:@"setTimeout(openWebSocket, 5);"]; }
再次运行应用程序,WebSocket连接已建立,消息已收到,应用程序已落后.几秒钟后,当我将应用程序带回到前台时,应用程序没有崩溃,并且消息开始再次通过WebSocket连接.