我正在使用SocketRocket,但我无法在后台传递消息。当我再次打开应用程序时,它会恢复连接(不重新连接),并立即出现消息。
这是我的连接代码:
- (void)_reconnect {
_websocket.delegate = nil;
[_websocket close];
NSString *host = @"ws://localhost:3030/primus";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:host]];
[request setValue:[NSString stringWithFormat:@"<%@>", apiKey] forHTTPHeaderField:@"Authentication"];
_websocket = [[SRWebSocket alloc] initWithURLRequest:request];
[_websocket setDelegateOperationQueue:[NSOperationQueue new]];
_websocket.delegate = self;
[_websocket open];
if (DEBUG) {
NSLog(@"Using: %@", host);
}
}
我也没有尝试过
[_websocket setDelegateOperationQueue:[NSOperationQueue new]];
行,但这无济于事。
您知道发生了什么事吗?
谢谢!
我正在面对同样的问题,但仍然没有正确的答案。
,如果主线程被冻结时,插座火箭似乎停止向分配的srdelegate发送消息(当应用程序在后台时)。
我什至尝试过没有成功的其他方法:
[_webSocket setDelegateDispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)];
但是,我确实找到了使主线程未透明的解决方法。这不是很好,尤其是因为它会导致电池排干,但是可以工作。
我注意到,如果您的应用程序在后台时具有位置更新,则Websocket继续运行正常。
为了启动位置服务,您可以在ApplicationDendenterBackground上进行以下操作:
CLLocationManager* locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
回来时,您可以通过在应用程序WillenterForeground上调用以下代码来阻止它们:
[locationManger stopUpdatingLocation];
ofc,您将需要强烈参考locationmanager,而不仅仅是在范围内。
这不是迄今为止推荐的解决方案,但是如果什么都没有起作用...
hi刚刚说明在同一问题上工作。新版本的插座火箭可以帮助解决此问题。现在支持一些背景模式。请参阅源代码。
我还没有测试过,但我敢肯定这应该有所帮助(使事情更接近最终解决方案)。