iPhone中的XMPP后台连接

Posted

技术标签:

【中文标题】iPhone中的XMPP后台连接【英文标题】:XMPP background connection in iPhone 【发布时间】:2017-08-22 09:28:12 【问题描述】:

我在 XMPP 聊天应用程序中使用静默推送通知。当应用程序未运行或未处于后台模式时,我想使用它连接到 XMPP 服务器。我收到静默推送通知,并启用了 xmppStream 的以下标志以进行后台连接。

xmppStream.enableBackgroundingOnSocket = YES;

但是当应用程序未运行并且无法连接到 XMPP 服务器时,仍不会调用 socketDidConnect 方法。

这样做的目的是将收到的消息状态发送到 XMPP 服务器。所以请指导我。

我不想为此使用 VoIP。所以请为我提供替代解决方案。

【问题讨论】:

我建议您开始考虑 VoIP,根据我的经验,这是唯一的解决方案。因为当应用程序未运行(或被用户杀死)时,即使您收到通知,也根本没有执行。 VoIP 让您有机会在后台唤醒应用程序并执行一些代码。 【参考方案1】:

按照以下步骤操作。这可以使用 VoIP 和 PushKit 框架实现。

    为您的应用启用 VoIP 服务证书。检查下图。

    为您的应用启用 IP 语音。检查下图。

    现在添加 PushKit.framework

    在 AppDelegate.h 文件中导入 PushKit 框架并添加其委托 PKPushRegistryDelegate

    AppDelegate.m 文件执行以下操作。

    A) 在 didFinishLaunchingWithOptions 方法中添加以下代码。

    PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    voipRegistry.delegate = self;
    voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
    

    B) 添加PKPushRegistryDelegate的所有委托方法

    - (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type  NSLog(@"VoIP - did Invalidate Push Token for type - %@", type); 
    
    - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type 
    NSLog(@"VoIP - got Push with payload: %@ and Type: %@", payload.dictionaryPayload, type);
    
    NSDictionary *dictAps = [payload.dictionaryPayload valueForKey:@"aps"];
    if ([dictAps valueForKey:@"content-available"] != nil) 
    NSLog(@"Silent VoIP");
    
    //Fetch payload info and create local notification and fire that local notification.
    UILocalNotification *voipNotification = [[UILocalNotification alloc] init];
    voipNotification.alertTitle = @"Silent VoIP";
    voipNotification.alertBody = [dictAps valueForKey:@"alert"];
    voipNotification.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] presentLocalNotificationNow:voipNotification];
    
    //Call xmpp connection method here.
    if (xmppStream == nil)  [self setupStream]; 
    if ([xmppStream isDisconnected])  [self connect]; 
    
    
    
    - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type 
    NSLog(@"VoIP - device Token: %@", credentials.token);
    
    NSString *newToken = credentials.token.description;
    newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSLog(@"VoIP token is: %@", newToken);
    [obj_DataModel setVoIPToken:newToken]; //Store token in somewhere for further use.
    
    

    为此,我从服务器传递了以下有效负载。

    "aps":"alert":"Testing...","badge":1,"sound":"default","content-available":1
    

我希望这对您有所帮助。如果您有任何疑问,请询问我。

【讨论】:

我按照您提到的相同步骤进行操作,但苹果拒绝了您无法将 VoIP 添加到此功能的应用程序的应用程序。

以上是关于iPhone中的XMPP后台连接的主要内容,如果未能解决你的问题,请参考以下文章

iPhone Jabber/XMPP 客户端...“TURN 连接失败”

iPhone 的 xmpp

XMPP - iphone sdk 中的用户搜索?在 iphone sdk 中使用 XEP-0055?

如何通过 XMPP 将 AOL 集成到 iPhone 应用程序中

XMPP Chat for iPhone 中的注册流程

XMPP Server for iPhone 中的好友列表问题