3

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

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

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

我的想法:

  1. 在我的 nodejs 服务器上添加一个“loadHistory”方法,用于发送频道的所有历史记录。这样我的应用程序就可以调用某个 URL 并获得包含所有消息的 JSON 格式的响应。也许每次触摸表格项目时都应该这样做?

  2. 使用新的iOS7后台运行功能?(我不确定它是否可以让套接字保持活力)

  3. 实现一种方法让服务器知道消息是否已传递,如果无法传递,则将消息存储在数据库中。一旦客户端再次上线,它就会通过 tcp 发送消息。这将需要向服务器添加大量功能,因此如果可能,我希望避免这种情况。

4

2 回答 2

3

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

您可以使用 voip,但如果它被杀死,您的应用程序将无法接收消息。(如果您添加了 voip 模式但您的应用程序不是关于语音的,Apple 将阻止您的应用程序)

于 2013-10-28T09:48:53.317 回答
1

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

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

    在此处输入图像描述

  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);
    

在完成这些步骤之后,您的套接字也应该在后台接收消息,并且连接将处于活动状态,直到您在“applicationDidEnterBackground”中给出。

我希望这将有所帮助。谢谢

于 2013-10-28T09:42:08.660 回答