【问题标题】:XMPP app terminate and not recive messageXMPP 应用程序终止且未收到消息
【发布时间】:2016-08-06 03:44:50
【问题描述】:

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

1) 用户未在 XMPP 服务器中连接。用户离线。但我希望用户已连接并在线。喜欢Whats App(应用程序)。

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

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

这个方法没有被调用。那么,如何获取消息?

而且我也实现了 Pushnotification 但以这种方式同样的问题就像,当应用程序被 Kill 和 Terminate 时,这个方法不被调用,

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

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

另外,我们不能在 .plist 文件中设置 VOIP 标志,因为这种方式不合适,被苹果拒绝。

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

【问题讨论】:

  • 您找到解决方案了吗?

标签: ios objective-c iphone xmpp


【解决方案1】:

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. 如果您的应用程序处于后台或被终止或未启动,则系统将仅在顶部栏中显示通知,一旦用户点击通知,它将打开您的应用程序,然后该方法将被调用。

当然你不能使用VOIP。

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

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

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

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

当您的应用程序被最小化或终止时,请确保您与服务器以及组断开连接。使用以下方法断开和/或相关更改

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

希望这会对您有所帮助,我已经实现了与 WhatsApp 相同的实现预期结果。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      首先,如果您的应用程序被终止,那么您将在

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

      在带键的launchOptions字典中

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

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

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

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

      【讨论】:

        【解决方案4】:

        阅读以下文档会对您有所帮助。 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 时,它将停止接收消息。
        【解决方案5】:

        检查此link 并阅读Remote Notifications (iOS 7 and Greater) 部分,该部分结合Background Modes and Remote notifications 以在启动应用程序之前下载内容。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 1970-01-01
          • 2016-09-16
          • 1970-01-01
          相关资源
          最近更新 更多