XMPP应用程序终止并且无法接收消息。

7

我正在开发一款XMPP应用。

当我停止并关闭我的应用程序时,会出现以下两个问题:

1)用户没有连接到XMPP服务器。用户处于离线状态。但我希望用户在线并连接,就像WhatsApp应用一样。

2)此时我无法从XMPP服务器端接收任何消息。

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

这个方法并没有被调用,那么我该如何获取消息呢?

此外,我还实现了推送通知,但是同样存在一个问题,当应用程序被杀死或终止时,这个方法也不会被调用。

- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 

请指导我如何正确操作并建议我如何像Whats App应用程序一样工作。

此外,我们无法在.plist文件中设置VOIP标志,因为这种方式不正确,会被苹果拒绝。

我的目标只是让通知像Whats App一样工作。


你找到解决方案了吗? - Dhaval Bhimani
5个回答

6

1)用户没有连接XMPP服务器。 用户处于离线状态。 但是我想让用户保持连接并在线。 像WhatsApp(应用程序)。

一旦您关闭或最小化WhatsApp,用户将变为离线状态(在iPhone4s上测试),在此状态下收到的消息为推送通知。

2)我无法从XMPP服务器端获取任何消息,

  • (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

该方法只在应用程序处于活动状态时被调用。 因此,当您杀死应用程序后,您无法在此处获取消息。

- (void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 

以下情况将调用此方法:

  1. 如果您的应用程序处于活动状态并收到任何新的推送通知。
  2. 如果您的应用程序在后台或已关闭或未启动,则系统仅会在顶部栏中显示通知,一旦用户点击通知,它将打开您的应用程序,然后调用该方法。

当然,您不能使用VOIP。

WhatsApp在用户活跃时显示自定义通知。

您需要为每个对话消息发送推送通知。在这种情况下:

  1. 如果用户处于活动状态,则在应用程序中显示您的自定义通知。
  2. 如果用户处于非活动状态(即已关闭或最小化的应用程序),则系统将在通知中心中显示通知。

当用户点击通知时,系统将启动应用程序,并且您必须检查应用程序启动条件(从哪个来源启动应用程序),并根据条件加入服务器/聊天(如果您正在使用群聊,则加入群组)。

一旦使用您的名称/昵称加入服务器,您将获得最近的聊天记录。您还可以获取历史记录,需要在加入聊天服务器/群组时指定。

确保在应用程序最小化或关闭时从服务器和组中断开连接,并使用以下方法进行断开连接和/或相关更改:

 1. - (void)applicationDidEnterBackground:(UIApplication *)application
 2. - (void)applicationWillTerminate:(UIApplication *)application

希望这能帮到您,我已经实现了相同的方法来达到WhatsApp预期的结果。

4
当你的应用被杀死时,XMPP将停止所有服务。因此,您可以向服务器发送Web服务请求以通知其 - 您已下线。
然后服务器可以向您发送推送通知来传达所有聊天内容。

2

2

首先,如果您的应用程序被终止,则会在Push Notification数据中收到通知。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

launchOptions 字典中,使用键来...
 if (launchOptions)
    {
        if ([launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey])
        {
        // Your code
        }
    }

其次,您可以使用后台获取功能来检索用户的消息,使用后台获取时,您可以连接您的流并从XMPP服务器获取消息。

注意:WhatsApp (iOS) 版本在您打开应用程序时立即获取消息,它会连接到流然后获取消息。

但是,您可以实现自己的逻辑来定制功能。


2

请阅读以下文档,它将对您有所帮助。 http://xmpp.org/extensions/xep-0168.html

当用户的在线状态设置如下时,我们需要添加优先级:

-(void)GoOnline{

XMPPPresence *goOnline = [XMPPPresence presence];
NSXMLElement *priority = [NSXMLElement elementWithName:@"priority" stringValue:@"-1"];
[goOnline addChild:priority];
[xmppStream sendElement:goOnline];
}

现在,如果您想了解更多有关优先级的信息,以及它的作用和工作原理,请阅读上面链接中的文档。

希望这可以帮助您 :)


它不起作用。当我们将优先级设置为-1时,它将停止接收消息。 - Parth Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接