Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS应用程序崩溃-我怀疑这与使用WebSocket的UIWebView有关_Ios_Iphone_Objective C_Uiwebview_Websocket - Fatal编程技术网

iOS应用程序崩溃-我怀疑这与使用WebSocket的UIWebView有关

iOS应用程序崩溃-我怀疑这与使用WebSocket的UIWebView有关,ios,iphone,objective-c,uiwebview,websocket,Ios,Iphone,Objective C,Uiwebview,Websocket,我目前没有使用applicationWillResignActive/applicationWillEnterForeground或任何类似的工具,因为我不确定如何处理我遇到的这个问题 如果我打开应用程序,按主屏幕,等待大约5分钟,然后再次尝试返回应用程序,我的应用程序会不断崩溃 该应用程序主要是一个加载node.js驱动的websocket的UIWebView,因此我认为这是罪魁祸首 当用户离开应用程序时,我如何阻止UIWebView做任何事情(我猜需要使用applicationWillRes

我目前没有使用applicationWillResignActive/applicationWillEnterForeground或任何类似的工具,因为我不确定如何处理我遇到的这个问题

如果我打开应用程序,按主屏幕,等待大约5分钟,然后再次尝试返回应用程序,我的应用程序会不断崩溃

该应用程序主要是一个加载node.js驱动的websocket的UIWebView,因此我认为这是罪魁祸首

当用户离开应用程序时,我如何阻止UIWebView做任何事情(我猜需要使用applicationWillResignActive)。我已经玩了半打创意,我一辈子都无法让应用程序停止崩溃

我目前的想法是:

- (void)applicationWillResignActive:(UIApplication *)application
{
[[NSNotificationCenter defaulCenter] postNotificationName:@"EnterBackground" object:Nil userInfo: Nil];
}

…然后从那里编辑ViewController.m文件,对该页面上的UIWebView执行某些操作。问题是,什么会阻止UIWebView在后台执行任何操作?我已经尝试停止加载,但由于某些原因没有成功,否则它仍然会崩溃。

我无法重现确切的问题(
WebThread:EXC\u BAD\u ACCESS(code=1,address=0x5)
-取自您的),但我确实注意到WebSocket消息正在被缓冲,因此如果您将应用程序留在后台足够长的时间,您将遇到内存压力问题,这可能是导致此崩溃的原因

然而,在研究这个问题的过程中,我确实设法使应用程序可靠地崩溃,因为
EXC_BAD_访问
源于
WebThread
,因此我将在这里发布详细信息,希望它对您或其他人有用

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

正如我所提到的,我注意到当应用程序处于后台时,UIWebView正在缓冲WebSocket消息。为了防止出现这种情况,我想在将应用程序移到后台时关闭WebSocket连接

在托管UIWebView的视图控制器中,我为
UIApplicationWillResignActiveNotification
注册了一个选择器,在该选择器中,我在网页中调用了一个JavaScript函数,该函数在WebSocket对象上调用了
close

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;
}
- (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"); };
}
网页:

- (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;
}
- (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重新连接,因此我注册了另一个选择器,这次是为
UIApplicationIDBecMeactiveNotification
注册的,在该选择器中调用了另一个初始化WebSocket连接的函数

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;
}
- (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"); };
}
网页:

- (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;
}
- (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连接已建立,收到消息,应用程序已后台运行。几秒钟后,当我将应用程序带回前台时,应用程序没有崩溃,消息再次通过WebSocket连接发送。

您正在自定义NSURL协议吗?在webView控制器中执行诸如registerClass之类的操作?发布你的崩溃日志或web视图代码。你能找到你的应用程序崩溃的原因吗?显示崩溃的堆栈跟踪。回答不错@neilco。一个建议是,您是否可以不在Javascript中使用暂停/恢复事件?它们应该很好地转换为appWillResignActive/appDidBecomeActive。