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 连接失败”
XMPP - iphone sdk 中的用户搜索?在 iphone sdk 中使用 XEP-0055?