为了好玩,我已经构建了一个基于套接字的聊天应用程序。它是通过带有nodejs服务器的tcp套接字来说的。它成功地来回发送消息。但是,当我按下主页按钮并将我的应用程序放在后台时出现问题 - 此时套接字似乎“暂停”,并且在此期间发送的所有消息都将丢失。
我已经在应用程序处于后台时设置了推送通知,但由于套接字在应用程序中未激活,因此消息永远不会真正到达应用程序。
我应该如何处理?我有什么选择? 我有一些想法,但我喜欢这里关于人们如何处理这个问题的一些意见。
我的想法:
在我的nodejs服务器上添加“loadHistory”方法,该方法发送通道的所有历史记录。这样我的应用就可以调用某个URL并获得一个 JSON与所有消息形成响应。也许这应该在每次触摸一个表项时完成?
利用新的iOS7后台运行功能? (我不确定是否有可能使套接字保持活着)
- 醇>
为服务器实现一种方式,以了解是否已传递邮件,如果邮件无法传递,则将邮件存储在 数据库。一旦客户端再次上线,它就会发送 tcp上的消息。这将需要许多附加功能 如果可能的话,服务器如此想要避免这种情况。
答案 0 :(得分:3)
如果您想要离线消息,则需要第三种方式,对于您收到的每条消息,您需要向服务器发送通知以告知消息已发送,并且当您连接时,您应该获取丢失的消息
你可以使用voip,但是你的应用程序如果被杀了就无法收到消息。 (如果你添加了voip模式,但你的应用不是语音,苹果会阻止你的应用)
答案 1 :(得分:1)
我还在TCP套接字上做了一些工作。我通过以下步骤提供了后台支持:
在plist文件中添加“必需的背景模式”键。
在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
}
在TCP连接成功后获取读写CFStream套接字对象时,添加此代码
CFReadStreamSetProperty(yourCFReadStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
CFWriteStreamSetProperty(yourCFWriteStreamObj, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
在完成这些步骤后,您的套接字也应该在后台接收消息,并且连接将一直处于活动状态,直到您在“applicationDidEnterBackground”中给出为止。
我希望这会有所帮助。感谢