发送推送通知给ios聊天离线用户,openfire xmpp

我有一个使用openfire的ios聊天应用程序,我需要做的是发送推送通知,当消息(1)无法交付任何原因,(2)应用程序处于暂停状态,即不能生成通知在其自己的。

我已经阅读了大部分有关这个在stackoverflow和其他地方的问题/build议,我已经得出了几个解决我的问题。 我不是一个ios开发者,在几天之前我也不了解openfire或xmpp,所以恐怕我对事物的理解可能不完整,我的解决scheme可能有缺陷。

请确认我的理解,并build议如果我错过了一些东西,或者如果有更好的方法。 请同时提出如何实施下面列出的特定解决scheme。

这里面临的挑战是确定何时需要推送以及何时启动过程

1)一种方法是使用xmpp的xep-0184实现来检查消息是否被传递。 要做到这一点,我们应该有一些交付标志与消息在ios数据库,这是更新时,从另一端收到交付的响应。 所以我们稍后需要检查这个标志,如果传递的状态是错误的,则启动消息的推送过程。 看起来是一个复杂的解决scheme(等待反应..检查国旗有一段时间滞后..不是很令人印象深刻)

2)更直接的方法是在openfire中做一些事情,当openfire不能传递一个消息的时候,它将它存储在离线表中,我们可以在那个部分做一些截取,并且启动消息的推送过程。 这看起来是正确的方法,但是我真的害怕在openfire中得到那么多东西,并且改变一些东西(也许很容易,有人用openfire做了一些工作可以告诉?)

3)这是我的最后手段,这不是一个解决scheme..但是如果我不能在预期的时间范围内(这是一个星期后)正确地做到这一点,我们计划发送所有消息的推送通知。 oppenfire会照顾正常的聊天,同时从我们的服务器发送每条消息的推送,但是当应用在前台时,我们会做一些事情来处理额外的推送消息,不需要显示,否则每当有一个推信息。 你们如何看待这种暂时的方式(我们当然必须尽快改变这种情况),这是可行的(或者我也错过了这里的一些东西)。

PS任何人都可以告诉Whatsapp和其他stream行的应用程序如何处理这个?

非常感谢您的帮助。

在整个XMPP会话期间,XMPP需要持久套接字连接或“永久性”BOSH连接。 我认为你的挑战是iOS不允许你在后台运行你的应用程序和套接字。 只要你的iOS应用程序在后台进入,iOS会杀死你的套接字连接,你的Openfire服务器就会终止你的XMPP会话。 这意味着用户下线 。 这也是该用户的传入消息进入脱机存储的原因。

对不起,这个回应,但你提出的所有3个解决scheme是可怕的黑客;-)。 如果你想提出一个好的解决scheme,你必须深入到XMPP和iOS。 1周是这个很短的时间。

任何人都可以告诉Whatsapp和其他stream行的应用程序如何处理这个?

他们保持XMPP会话活着。 这只适用于高度修改的XMPP服务器,其间有一些“XMPP客户端代理”,可以让您的会话保持运行状态,同时您的应用程序处于后台或两者兼有的状态。

我有你的解决scheme。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.ary_UserStatus = [NSMutableArray array]; NSMutableArray *ary_TempFromUserDefaults = [NSMutableArray array]; ary_TempFromUserDefaults = [[NSUserDefaults standardUserDefaults] valueForKey:@"KejdoUserStatus"]; if ([ary_TempFromUserDefaults count]>0) { self.ary_UserStatus = [[NSUserDefaults standardUserDefaults] valueForKey:@"KejdoUserStatus"]; } self.df_UserStatus = [[NSDateFormatter alloc] init]; [self.df_UserStatus setDateFormat: @"hh:mm a MM/dd/yyyy"]; } - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence { DDLogVerbose(@"%@: %@ - %@", THIS_FILE, THIS_METHOD, [presence fromStr]); NSString *str_UserName = [[presence from] user]; NSString *str_LastSeenDate = [self.df_UserStatus stringFromDate:[NSDate date]]; NSMutableDictionary *mdic_UserPresence = [[NSMutableDictionary alloc] init]; [mdic_UserPresence setValue:str_UserName forKey:@"Name"]; [mdic_UserPresence setValue:str_LastSeenDate forKey:@"Date"]; [mdic_UserPresence setValue:[presence type] forKey:@"Type"]; if ([self.ary_UserStatus count]>0) { int index; BOOL IS_exist=FALSE; for (int i=0; i<[self.ary_UserStatus count]; i++) { NSString *str_UserFromArray = [[self.ary_UserStatus objectAtIndex:i] valueForKey:@"Name"]; if ([str_UserName isEqualToString:str_UserFromArray]) { IS_exist = TRUE; index = i; [[NSUserDefaults standardUserDefaults] setObject:str_UserName forKey:@"Status"]; } else { } } if (IS_exist) { [self.ary_UserStatus replaceObjectAtIndex:index withObject:mdic_UserPresence]; } else { [self.ary_UserStatus addObject:mdic_UserPresence]; } } else { [self.ary_UserStatus addObject:mdic_UserPresence]; } [[NSUserDefaults standardUserDefaults] setObject:self.ary_UserStatus forKey:@"KejdoUserStatus"]; [[NSUserDefaults standardUserDefaults] synchronize]; [[NSNotificationCenter defaultCenter] postNotificationName:@"UserStatusChangeNotification" object:self]; } 

无论你在哪里发送消息给其他用户聊天。 做这个

  if(appDelegate.ary_UserStatus.count>0) { for (int i=0; i<[appDelegate.ary_UserStatus count]; i++) { if ([jid.user isEqualToString:[NSString stringWithFormat:@"%@",[[appDelegate.ary_UserStatus objectAtIndex:i] valueForKey:@"Name"]]]) { if ([[[appDelegate.ary_UserStatus objectAtIndex:i] valueForKey:@"Type"] isEqualToString:@"available"]) { // Do something like table reload. break; } else [self sendPushNotification]; } } } else [self sendPushNotification];