iOS App崩溃 - 我怀疑它与使用WebSockets的UIWebView有关

 任我闯2502871177 发布于 2023-02-06 14:52

我目前没有使用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在后台执行任何操作?我试过停止加载,由于某种原因没有成功,或者它仍会崩溃.

1 个回答
  • 我无法重现确切的问题(WebThread: EXC_BAD_ACCESS (code=1, address=0x5)从你的其他问题中找到了) - 但是我确实注意到WebSocket消息正在被缓冲,所以如果你在背景中留下足够长的应用程序,你可能会遇到内存压力问题可能是导致此次崩溃的原因.

    然而,在研究这个问题的过程中,我还是设法使应用程序可靠地崩溃EXC_BAD_ACCESS源自WebThread所以我会在这里,希望它可能使用到您或其他人张贴的细节.

    出于这个问题的目的,我的WebSocket服务器只是每秒向任何连接的客户端广播时间.

    正如我所提到的,我注意到UIWebView在应用程序背景时缓冲了WebSocket消息.为了防止这种情况,我想在将应用程序移动到后台时关闭WebSocket连接.

    在我托管UIWebView的视图控制器中,我UIApplicationWillResignActiveNotification为该选择器注册了一个选择器,我在我的网页中调用了一个调用closeWebSocket对象的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连接.

    2023-02-06 14:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有