如果我打开它,我的应用程序不断崩溃,按主屏幕,等待大约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(代码= 1,地址= 0x5)-taken从您的 other question),但我确实注意到WebSocket消息正在被缓冲,所以它可能是你离开应用程序在背景足够长的时候,你会遇到可能导致这次崩溃的内存压力问题.但是,在研究这个问题的过程中,我确实设法通过源自WebThread的EXC_BAD_ACCESS使应用程序可靠崩溃,因此我将在此处发布详细信息,希望它可能对您或其他人有用.
For the purposes of this question,my WebSocket server simply broadcast the time every second to any connected clIEnts.
正如我所提到的,我注意到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(代码= 1,地址= 0x5.原因是评估当应用程序返回到前台时,对openWebSocket()的JavaScript调用.将openWebSocket()的执行延迟几毫秒就解决了问题.通过appDIDBecomeActive方法看起来像这样:
- (voID)appDIDBecomeActive:(NSNotification *)notification{ [self.webVIEw stringByEvaluatingJavaScriptFromString:@"setTimeout(openWebSocket,5);"];}
再次运行应用程序,WebSocket连接已建立,消息已收到,应用程序已落后.几秒钟后,当我将应用程序带回到前台时,应用程序没有崩溃,并且消息开始再次通过WebSocket连接.
总结以上是内存溢出为你收集整理的iOS App崩溃 – 我怀疑它与使用WebSockets的UIWebView有关全部内容,希望文章能够帮你解决iOS App崩溃 – 我怀疑它与使用WebSockets的UIWebView有关所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)