我有一个使用openfire的ios聊天应用程序,我需要做的是当消息(1)由于任何原因无法投递时发送推送通知,(2)应用程序处于挂起状态,即无法自行生成通知。
我已经在stackoverflow和其他地方阅读了关于这个问题的大多数相关问题/建议,并且我对我的问题得出了一些解决方案。我不是ios开发人员,几天前我对openfire或xmpp也一无所知,所以我担心我对事物的理解可能不完整,我的解决方案可能存在缺陷。
请确认我对此的理解,并建议我是否遗漏了什么或是否有更好的方法。还请建议实施下面列出的特定解决方案的复杂性。
这里的挑战是确定何时需要推送,以及在哪里启动进程,因此
1)一种方法是使用xmpp的xep-0184实现来检查消息是否已传递。要做到这一点,我们应该在ios数据库中有一些带有消息的已发送标志,当从另一端接收到已发送的响应时,会更新该标志。因此,我们需要在一段时间后检查此标志,如果传递的状态为false,则使用消息启动推送过程。看起来是一个复杂的解决方案(等待响应..检查具有一定时间延迟的标志..不是很令人印象深刻)
2)更直接的方法是在openfire中做一些事情,当openfire不能传递消息时,它将消息存储在离线表中,我们可以在这部分进行一些拦截,并用消息启动推送过程。这看起来是正确的方法,但我真的很害怕在openfire内部得到那么多东西并改变一些东西(这可能也很容易,一些使用过openfire的人可以说出来?)
3)这是我最后的办法,这不是解决办法。但如果我不能在预期的时间范围内(从现在起一周后)正确完成,我们计划为所有消息发送推送通知。oppenfire将负责正常聊天,而我们的服务器将为每条消息发送推送,但当应用程序在前台时,我们会做一些事情来处理不需要显示的额外推送消息,否则只要有消息就会收到推送。你们怎么看待这种临时的方式(我们当然会尽快改变它),这是可行的(或者我在这里也遗漏了一些东西)。
附言:谁能告诉我Whatsapp和其他流行的应用程序是如何处理这个问题的?
非常感谢你的帮助。
发布于 2014-04-29 10:00:41
我有一个解决方案给你。
- (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];
https://stackoverflow.com/questions/16097020
复制相似问题