基于iOS套接字的聊天,如何接收应用在后台时发送的消息?

时间:2013-10-28 09:15:55

标签: ios iphone objective-c

为了好玩,我已经构建了一个基于套接字的聊天应用程序。它是通过带有nodejs服务器的tcp套接字来说的。它成功地来回发送消息。但是,当我按下主页按钮并将我的应用程序放在后台时出现问题 - 此时套接字似乎“暂停”,并且在此期间发送的所有消息都将丢失。

我已经在应用程序处于后台时设置了推送通知,但由于套接字在应用程序中未激活,因此消息永远不会真正到达应用程序。

我应该如何处理?我有什么选择? 我有一些想法,但我喜欢这里关于人们如何处理这个问题的一些意见。

我的想法:

  
      
  1. 在我的nodejs服务器上添加“loadHistory”方法,该方法发送通道的所有历史记录。这样我的应用就可以调用某个URL并获得一个   JSON与所有消息形成响应。也许这应该在每次触摸一个表项时完成?

  2.   
  3. 利用新的iOS7后台运行功能? (我不确定是否有可能使套接字保持活着)

  4.   
  5. 为服务器实现一种方式,以了解是否已传递邮件,如果邮件无法传递,则将邮件存储在   数据库。一旦客户端再次上线,它就会发送   tcp上的消息。这将需要许多附加功能   如果可能的话,服务器如此想要避免这种情况。

  6.   

2 个答案:

答案 0 :(得分:3)

如果您想要离线消息,则需要第三种方式,对于您收到的每条消息,您需要向服务器发送通知以告知消息已发送,并且当您连接时,您应该获取丢失的消息

你可以使用voip,但是你的应用程序如果被杀了就无法收到消息。 (如果你添加了voip模式,但你的应用不是语音,苹果会阻止你的应用)

答案 1 :(得分:1)

我还在TCP套接字上做了一些工作。我通过以下步骤提供了后台支持:

  1. 在plist文件中添加“必需的背景模式”键。

    enter image description here

  2. 在AppDelegate.m文件中添加此代码

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
    #if __IPHONE_OS_VERSION_MIN_REQUIRED >= 40000
        if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)] && [[UIDevice currentDevice] isMultitaskingSupported])
        {
            NSLog(@"Keep timeout alive");
    
            [application setKeepAliveTimeout:600 handler: ^{
                NSLog(@"applicationDidEnterBackground:: setKeepAliveTimeout:handler^");//task as you want to do
            }];
        }
    
    #else
        LogInfo(@"applicationDidEnterBackground (Not supported)");
    #endif
    }
    
  3. 在TCP连接成功后获取读写CFStream套接字对象时,添加此代码

    CFReadStreamSetProperty(yourCFReadStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    CFWriteStreamSetProperty(yourCFWriteStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
    
  4. 在完成这些步骤后,您的套接字也应该在后台接收消息,并且连接将一直处于活动状态,直到您在“applicationDidEnterBackground”中给出为止。

    我希望这会有所帮助。感谢