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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (252)

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

我已经阅读了大部分关于这个在stackoverflow和其他地方的相关问题/建议,我已经对我的问题得出了几个解决方案。我不是一个ios开发者,也没有在几天之前知道有关openfire或xmpp的任何信息,所以我担心我对事物的理解可能不完整,我的解决方案可能有缺陷。

请确认我对它的理解,并建议我是否缺少某些东西或者是否有更好的方法。还请提出实施下面列出的特定解决方案的复杂程度。

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

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

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

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

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

提问于
用户回答回答于

我有个解决办法给你。

- (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];
用户回答回答于

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

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

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

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

扫码关注云+社区

领取腾讯云代金券