当用户在quickblox的ios中离线时获取消息

时间:2014-07-24 10:12:41

标签: ios iphone quickblox

我在我的项目,聊天应用程序中使用了chatblox的IOS聊天API,现在一切正常......当用户在线时,或应用程序未从后台删除时,他正在推动聊天页面中的通知和消息.. 但是当应用程序从后台删除时,他正在获取推送通知,但消息没有显示在聊天页面中,它只出现在推送通知中...我把我的问题发给了quickblox支持,他们给了我一个代码来替换我的项目,现在我的问题代码在这里:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:  (NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    cManager = [ConnectionManager sharedMannager];
    [cManager sendNetworkIdUpdate:[[DataManager sharedCenter]currentnetworkIdentifier]];

    [QBSettings setApplicationID:-----];
    [QBSettings setAuthorizationKey:@"--------"];
    [QBSettings setAuthorizationSecret:@"--------"];
    [QBSettings setAccountKey:@"--------"];

    [cManager getBlockedList];

    if (launchOptions != nil) {
        NSLog(@"Launched from push notification");
        NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        NSLog(@"%@",launchOptions);
        [[DataManager sharedCenter]setPushData:[notification valueForKeyPath:@"aps.user_info"]];
        // Do something with the notification dictionary

    }

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application{
    if ([[[DataManager sharedCenter]currentUser]userChatId]){
        [QBUsers logOutWithDelegate:[ChatService instance]];
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    if ([[DataManager sharedCenter]chat_user] != nil) {
        [[QBChat instance] loginWithUser:[[DataManager sharedCenter]chat_user]];
    }
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    BOOL isLoggedIntoChat = [[QBChat instance] isLoggedIn];

    if (isLoggedIntoChat) {
        [[QBChat instance] logout];
    }
}

- (void)applicationDidBecomeActive:(UIApplication *)application{
    if ([[UIApplication sharedApplication]applicationIconBadgeNumber]>0){
        [UIApplication sharedApplication].applicationIconBadgeNumber=0;
        [cManager clearBadge];
    }

    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    /*if ([[[DataManager sharedCenter]currentUser]userChatId]){
     [QBUsers logOutWithDelegate:[ChatService instance]];
     }*/

    if ([[LocalStorageService shared]messagesHistory] && [[[DataManager sharedCenter]currentUser]userId]){
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[[LocalStorageService shared]messagesHistory]];
        [[[DataManager sharedCenter]defaults]setObject:data forKey:[NSString stringWithFormat:@"%@%@",[[[DataManager sharedCenter]currentUser]userId],kMessageHistoryBlock]];
        [[[DataManager sharedCenter]defaults]synchronize];
    }
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    NSString* devToken = [[[[deviceToken description]
                            stringByReplacingOccurrencesOfString:@"<"withString:@""]
                           stringByReplacingOccurrencesOfString:@">" withString:@""]
                          stringByReplacingOccurrencesOfString: @" " withString: @""];
    NSLog(@"Update Token: %@",devToken);

    [cManager sendPushTokenUpdate:devToken];
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"Opend from push notification");
    NSLog(@"%@",userInfo);

    UIApplicationState state = [[UIApplication sharedApplication]applicationState];
    if (state != UIApplicationStateActive){

        if ([userInfo valueForKeyPath:@"aps.user_info"]){
            [[DataManager sharedCenter]setPushData:[userInfo valueForKeyPath:@"aps.user_info"]];
            [[NSNotificationCenter defaultCenter]postNotificationName:kShowPush  object:nil];

        }

    }

    [[NSNotificationCenter defaultCenter]postNotificationName:kUpdateTables object:nil];
    [cManager clearBadge];
}

问题仍然存在! ,请帮忙吗?

1 个答案:

答案 0 :(得分:0)

您必须进行正确的聊天注销。服务器应该确定您的用户处于离线状态

首先,请参阅后台模式文档中的聊天http://quickblox.com/developers/SimpleSample-chat_users-ios#Chat_in_background_mode

尝试在applicationWillTerminate和applicationDidEnterBackground中进行聊天注销:

- (void)applicationWillTerminate:(UIApplication *)application
{
    [[QBChat instance] logout];
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    [[QBChat instance] logout];
}