4

我正在使用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]];

行,但这无济于事。

你知道发生了什么吗?

谢谢!

4

2 回答 2

1

我面临同样的问题,但仍然没有正确的答案。

如果主线程被冻结(当应用程序处于后台时),Socket Rocket 似乎停止向分配的 SRDelegate 发送消息。

我什至尝试过另一种方法但没有成功:

    [_webSocket setDelegateDispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)];

但是,我确实找到了保持主线程解冻的解决方法。这不是很好,特别是因为它会导致电池耗尽,但它确实有效。

我注意到,如果您的应用程序在后台进行位置更新,WebSocket 将继续正常运行。

为了启动位置服务,您可以在 applicationDidEnterBackground 上执行以下操作:

CLLocationManager* locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

回来时,您可以通过在 applicationWillEnterForeground 上调用以下代码来阻止它们:

[locationManger stopUpdatingLocation];

Ofc 你需要保持对 locationManager 的强引用,而不仅仅是在范围内。

到目前为止,这不是推荐的解决方案,但如果没有任何效果......

于 2014-05-06T13:50:38.290 回答
0

嗨,刚刚表示正在处理同样的问题。新版本的socket Rocket可以帮助解决这个问题。现在支持一些后台模式。见源代码

我还没有测试过,但我相信这应该会有所帮助(让事情更接近最终解决方案)。

于 2015-11-19T10:33:01.630 回答