dae*_*mon 5 iphone objective-c uiwebview websocket ios
我目前没有使用applicationWillResignActive/applicationWillEnterForeground或类似的东西,因为我不确定如何处理我遇到的这个问题.
如果我打开它,我的应用程序不断崩溃,按主屏幕,等待大约5分钟,并尝试再次返回应用程序.
该应用程序主要是一个UIWebView加载node.js驱动的websocket,所以我认为这是罪魁祸首.
当用户离开应用程序时,如何阻止UIWebView执行任何操作(applicationWillResignActive是我猜测需要使用的).我已经玩了六个想法,我不能为我的生活让应用程序停止崩溃.
我目前的想法:
- (void)applicationWillResignActive:(UIApplication *)application
{
[[NSNotificationCenter defaulCenter] postNotificationName:@"EnterBackground" object:Nil userInfo: Nil];
}
Run Code Online (Sandbox Code Playgroud)
...然后从那里编辑我的ViewController.m文件,对该页面上的UIWebView做一些事情.问题是,什么会阻止UIWebView在后台执行任何操作?我试过停止加载,由于某种原因没有成功,或者它仍会崩溃.
我无法重现确切的问题(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();"];
}
Run Code Online (Sandbox Code Playgroud)
网页:
function closeWebSocket() {
socket.close(); // socket is an instance of WebSocket
socket = undefined;
}
Run Code Online (Sandbox Code Playgroud)
我希望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();"];
}
Run Code Online (Sandbox Code Playgroud)
网页:
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"); };
}
Run Code Online (Sandbox Code Playgroud)
运行应用程序,建立WebSocket连接,收到消息,并将应用程序移至后台.几秒钟后,我将应用程序带回前台(通过点击应用程序图标),应用程序崩溃,类似于WebThread: EXC_BAD_ACCESS (code=1, address=0x5.造成这种情况的原因是评估openWebSocket()应用程序返回前台时的JavaScript调用.延迟执行openWebSocket()几毫秒就解决了这个问题.通过appDidBecomeActive方法最终看上去是这样的:
- (void)appDidBecomeActive:(NSNotification *)notification
{
[self.webView stringByEvaluatingJavaScriptFromString:@"setTimeout(openWebSocket, 5);"];
}
Run Code Online (Sandbox Code Playgroud)
再次运行应用程序,WebSocket连接已建立,消息已收到,应用程序已落后.几秒钟后,当我将应用程序带回到前台时,应用程序没有崩溃,并且消息开始再次通过WebSocket连接.
| 归档时间: |
|
| 查看次数: |
2538 次 |
| 最近记录: |