如何在后台保持 iphone ios websocket 连接处于活动状态?

Posted

技术标签:

【中文标题】如何在后台保持 iphone ios websocket 连接处于活动状态?【英文标题】:How to keep iphone ios websocket connection alive while in the background? 【发布时间】:2014-08-19 12:36:39 【问题描述】:

我使用SocketRocket创建了一个聊天应用程序,当我退出应用程序时(进入后台模式)我想接收聊天消息!所以我可以通过将其称为 VoIP 应用程序来做到这一点,但有人说 Apple 会从 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;
    


【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢,但我不认为其他应用程序正在使用 APNS 来做到这一点,我已经跟踪了许多聊天应用程序,当应用程序在后台时,它似乎使用远程通知! @MKAlatrash,你是说他们做还是不做?【参考方案2】:

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

【讨论】:

以上是关于如何在后台保持 iphone ios websocket 连接处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?

如何在 iPhone 上打开音乐(ipod 库)?

IOS 网络编程 + 后台保持连接

苹果手机怎么设置后台运行时不自动关闭?

如何在后台应用程序时从 JavaScript 发出通知/警报 - PhoneGap iPhone/iOS

如何保持用户 iPhone 的显示屏处于开启状态?