如何在后台保持iphone ios websocket连接活着?

时间:2014-06-28 15:07:44

标签: ios iphone objective-c ipad socket.io

我使用SocketRocket创建了一个聊天应用程序,当我退出应用程序(进入后台模式)时,我想收到聊天消息!所以我可以通过称之为VoIP应用程序来做到这一点,但有些人说苹果将拒绝它从App Store,除非它也真的做VoIP。那么我怎么能这样做呢?如果这样做的唯一方法是将它称为VoIP应用程序whatsapp如何处理这种情况?

以下是我在后台保持应用程序活动所做的工作:

- (void)applicationDidEnterBackground:(UIApplication *)application
{


 NSLog(@"Application entered background state.");
    NSAssert(self.backgroundTask == UIBackgroundTaskInvalid, nil);
    self.didShowDisconnectionWarning = NO;

self.backgroundTask = [application beginBackgroundTaskWithExpirationHandler: ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Background task expired");
        if (self.backgroundTimer)
        {
            [self.backgroundTimer invalidate];
            self.backgroundTimer = nil;
        }
        [application endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    });
}];

dispatch_async(dispatch_get_main_queue(), ^{
    self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timerUpdate:) userInfo:nil repeats:YES];
});

}


- (void) timerUpdate:(NSTimer*)timer {
    UIApplication *application = [UIApplication sharedApplication];

    NSLog(@"Timer update, background time left: %f", application.backgroundTimeRemaining);

    if ([application backgroundTimeRemaining] < 60 && !self.didShowDisconnectionWarning)
    {
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];
        if (localNotif) {
            localNotif.alertBody = @"Background session will expire in one minute.";
            localNotif.alertAction = @"OK";
            localNotif.soundName = UILocalNotificationDefaultSoundName;
            [application presentLocalNotificationNow:localNotif];
        }
        self.didShowDisconnectionWarning = YES;
    }
    if ([application backgroundTimeRemaining] < 10)
    {
        // Clean up here
        [self.backgroundTimer invalidate];
        self.backgroundTimer = nil;

        [application endBackgroundTask:self.backgroundTask];
        self.backgroundTask = UIBackgroundTaskInvalid;
    }

}

2 个答案:

答案 0 :(得分:5)

我相信您唯一的选择是使用远程通知。您需要您的应用程序注册它们,并且您的服务器要检测您的应用程序何时未运行(即通过套接字连接),然后发送通知。

答案 1 :(得分:0)

你不能在后台保持你的TCP套接字,每当applicationDidEnterBackground调用断开套接字和applicationDidBecomeActive时,如何实现此功能连接套接字以便服务器知道客户端套接字断开然后将消息保存到脱机表。 Web服务器上有调度程序定期运行以发送推送通知。每当用户收到推送通知并且用户点击它时,您需要创建一个流程,以根据您在远程通知字典中获得的参数启动正确的对话。