发送推送通知到iOS聊天离线用户的Openfire XMPP(send push notificat

2019-08-31 12:39发布

我有一个使用的Openfire的IOS聊天应用程序,我需要做的就是发送推送通知时,(1)不能以任何理由来传递消息,(2)应用程序处于挂起状态,即不能生成通知在其自己的。

我已阅读在这个最的相关问题/建议在计算器和其他地方,我已经结束了对我的问题几种解决方案。 我不是一个iOS开发者也没有我知道几天之前的Openfire或XMPP任何东西,所以我怕我对事物的认识可能不完整,我的解决方案可能是有缺陷的。

请证实了我对它的理解和建议,如果我失去了一些东西,或者有更好的办法。 还请表明它打算如何复杂,是实施下列特定的解决方案。

这里的挑战是当需要推而其中过程被启动,以识别,所以

1)一个方法是使用XMPP的XEP-0184执行检查,如果消息被传递。 要做到这一点,我们应该有一些标志交付iOS中的数据库,当传送接收响应形式另一端的更新消息。 因此,我们需要检查这个标志一小会儿后,如果交付的状态是假的,开始推动过程与消息。 看起来是一个复杂的解决方案(等待响应..检查标志和一段时间的滞后..不是很可观)

2)一个更直接的方法是做一些Openfire的,当时的Openfire无法提供它存储在离线表的消息,我们可以做的那部分有些拦截,并启动与消息推送过程。 这看起来是正确的做法,但我真的很害怕让那么多内的Openfire和改变一些东西的(这可能是也容易,别人谁的工作一点用的Openfire可以告诉?)

3)这是我的最后一招,这不是一个解决办法..但是如果我不能预期的时间内做是正确的(这是从现在开始每周),我们计划发送推送通知的所有消息。 oppenfire将takecare正常的聊天,而一推就会从我们的服务器发送的每一个消息,但是当应用程序在前台,我们做一些事情来处理不需要显示额外的推送消息,否则将收到一个推送每当有信息。 你们认为什么的这个临时办法解决(我们当然会尽快我们可以改变这一点),这是可行的(或我在这里失去了一些东西为好)。

PS谁能告诉了WhatsApp和其他流行的应用程序如何处理呢?

非常感谢您的帮助。

Answer 1:

XMPP需要一个持久套接字连接或整个XMPP会话过程中一个“老大难” BOSH连接。 我觉得你的挑战是,iOS版不允许你运行你的应用程序和插座的背景。 每当你的iOS应用云在后台的iOS杀死你的socket连接,并且您的Openfire服务器杀死你的XMPP会话。 这意味着用户下线 。 这也是为什么该用户收到的邮件转到离线存储的原因。

对不起,这个反应,但你的建议所有3个解决方案是可怕的黑客;-)。 如果你想拿出一个很好的解决方案,你必须非常深入到XMPP和iOS。 第一个星期是这个很短的时间内。

谁能告诉了WhatsApp和其他流行的应用程序如何处理呢?

他们保持XMPP会话的存活。 这仅适用于高度修改XMPP服务器,一些“XMPP客户端代理”,在其中间让你的会话状态下运行你的应用程序是在后台,或结合或两者兼而有之。



Answer 2:

我对你的解决方案。

- (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];


文章来源: send push notification to ios for chat to offline user, openfire xmpp