2014-03-12 51 views
4

我正在使用SocketRocket,但我無法在後臺傳遞消息。當我再次打開應用程序時,它會恢復連接(不重新連接),並且所有消息都會立即進入。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]]; 

線,但這並不能幫助任何東西。

你知道發生了什麼嗎?

謝謝!

+0

https://github.com/facebook/SocketRocket/issues/479 –

回答

1

我面臨同樣的問題,仍然沒有一個正確的答案。

如果主線程被凍結(應用程序在後臺),Socket Rocket似乎停止向分配的SRDelegate發送消息。

我甚至嘗試沒有成功的另一種方法:

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

但是,我沒有找到保持主線程解凍一種解決方法。 這不是很好,特別是因爲它會導致電池耗盡,但它的工作原理。

我注意到如果你的應用程序在後臺有位置更新,WebSocket繼續運行就好了。

爲了啓動定位服務,你可以做你的applicationDidEnterBackground如下:

[locationManger stopUpdatingLocation]; 

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

當回來了,你可以通過調用你的applicationWillEnterForeground下面的代碼阻止他們

Ofc您不僅需要在範圍內保留對locationManager的強大引用。

這不是目前推薦的解決方案,但如果沒有什麼工作......

0

嗨只是說對同一問題的工作。 新版本的套接字火箭可以幫助解決這個問題。 現在支持一些背景模式。 See source code

我還沒有測試,但我相信這應該有幫助(讓事情更接近最終解決方案)。

+0

我正在使用套接字火箭的最新版本,我仍然面臨這個問題。使用'0.4.2'。 FYI https://github.com/facebook/SocketRocket/issues/479 –

+0

對我來說它工作。如果我沒有記錯的話,那麼蘋果已經棄用了socket的VoIP標誌,所以目前它可能無法工作。根據我的經驗,這是蘋果公司的決定,因爲它很容易在應用程序被系統殺死後實現狀態,因爲它經常被喚醒。這發生在服務器被錯誤地實現或者當使用VoiP標誌的多個套接字(在這種情況下需要服務器的同步)時發生。唯一的選擇是使用推送通知。 –