XMPP应用终止而不是回复消息

时间:2016-04-14 14:06:31

标签: ios objective-c iphone xmpp

我在XMPP应用程序中工作。 当我终止并杀死我的应用程序时,

1)XMPP服务器中未连接用户。用户离线。但我希望用户连接和在线。像Whats App(申请)。

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

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

此方法不是调用。那么,我如何获得消息?

而且我也实现了Pushnotification但是这样同样的问题就像,当应用程序杀死和终止时,这个方法不是调用,

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

所以,请以正确的方式指导我并建议我如何像应用程序一样工作(应用程序)。

另外,我们无法设置VOIP Flag In .plist文件因为这种方式不适合并被苹果拒绝。

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

5 个答案:

答案 0 :(得分:5)

  

1)XMPP服务器中未连接用户。用户离线。但我想要   用户已连接并已联机。像Whats App(申请)。

关闭或最小化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. 如果您的应用程序处于后台或已杀死或未启动,则系统将仅显示顶部栏上的通知,一旦用户点击通知,它将打开您的应用程序,然后该方法将被调用。
  3. 当然你不能使用VOIP。

    当用户在WhatsApp中处于活动状态时,WhatsApp会显示自定义通知。 您需要为对话的每条消息发送推送通知。在这种情况下

    1. 如果用户处于有效状态,则在应用中显示自定义通知。
    2. 如果用户处于非活动状态(即已杀死或最小化应用),系统将在通知中心显示通知。
    3. 当用户点击通知时,系统将启动应用程序,您必须检查应用程序启动条件(启动源应用程序)并根据条件加入服务器/聊天(如果您正在使用群组聊天,则检查组)。 / p>

      使用您的姓名/昵称加入服务器后,您将收到最近的聊天记录。您还可以获取历史记录,加入聊天服务器/组时需要指定。

      确保在应用程序最小化或被杀死时断开与服务器以及组的连接。使用以下方法断开连接和/或相关更改

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

      希望这会对你有所帮助,我已经实现了同样的目标,以达到WhatsApp的预期效果。

答案 1 :(得分:4)

当您的应用程序终止时,那个时候XMPP停用所有服务。因此,您可以将webservice发送到服务器,它可以告诉您 - 您处于离线状态。

然后,服务器可以发送推送通知所有聊天内容。

答案 2 :(得分:2)

首先,如果您的申请被终止,那么您将在

中收到Push Notification个数据
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
带有键

launchOptions字典中的

 if (launchOptions)
    {
        if ([launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey])
        {
        // Your code
        }
    }

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

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

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

答案 3 :(得分:2)

在启动应用之前,请先检查link并阅读Remote Notifications (iOS 7 and Greater)组合Background Modes and Remote notifications以下载内容的部分。

你会得到这个想法,你可以用你喜欢的语言obj-c或swift实现。

答案 4 :(得分: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];
}

现在要了解有关优先级,角色及其工作原理的更多信息,请阅读上述链接中的文档。

希望它可以帮助你:)