点击本地通知与远程推送进行跳转

点击本地通知与远程推送进行跳转

运行状态

融云 SDK 根据 iOS App 运行的特性,主要有以下三种运行状态:

1、 前台状态 如字面意思,App 前台可见时 SDK 处于前台状态。此时 App 使用融云的长连接通道来收发消息.

2、 后台活动状态 当 App 刚进入后台, 系统冻结之前,SDK 处于后台活跃状态。此时 App 使用融云的长连接通道接收消息。

如果您使用 IMKit ,此时 SDK 收到消息会弹出本地通知(必须实现用户信息提供者和群组信息提供者,否则将不会有本地通知提示弹出)。

如果您使用 IMLib ,此时 SDK 不会弹出本地通知,如果您需要可以自己弹出本地通知提示。

3、 后台暂停状态当 App 进入后台 2 分钟之后或被杀进程或被冻结,SDK 将处于后台暂停状态。此时融云的长连接通道会断开,融云 Server 会通过 APNs 将消息以远程推送的形式下发到客户端。 此状态下如果有人给该用户发送消息,融云的服务器会根据 deviceToken 和推送证书将消息发送到苹果推送服务器,苹果服务器会将该消息推送到客户端。

获取通知点击事件与内容格式

点击通知栏的本地通知时,如果 App 没有被系统冻结,则您在 AppDelegate-application:didReceiveLocalNotification: 中可以捕获该消息。

// AppDelegate class

- (void)application:(UIApplication *)application
didReceiveLocalNotification:(UILocalNotification *)notification {

    NSDictionary *msgDic = [notification.userInfo objectForKey:@"rc"];
    
    NSString *cType = [msgDic objectForKey:@"cType"];//会话类型。PR 指单聊、 DS 指讨论组、
     GRP 指群组、 CS 指客服、SYS 指系统会话、 MC 指应用内公众服务、 MP 指跨应用公众服务。
    
    NSString *fId = [msgDic objectForKey:@"fId"];//消息发送者的用户 ID。
    
    NSString *oName = [msgDic objectForKey:@"oName"];//消息类型,参考融云消息类型表.消息标志;
    可自定义消息类型。
    
    NSString *targetId = [msgDic objectForKey:@"tId"];//Target ID 。

    /*
    cType根据得到字段转换成相应的conversationType
    其余信息可根据需求进行相应的操作
    */

    //跳转相应聊天会话View Controller对象
    RCConversationViewController *chat = [[RCConversationViewController alloc]init];
    
    //设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等,为转换后的值
    chat.conversationType = cType_Value;
    
    //设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID)   
    chat.targetId = targetId;
    
    //设置聊天会话界面要显示的标题
    chat.title = @"想显示的会话标题";
    
    //显示聊天会话界面
    if ([self.window.rootViewController isKindOfClass:
    [RCDNavigationViewController class]]) {
    
        [(RCDNavigationViewController *)self.window.rootViewController 
        pushViewController:chat animated:YES];
    } else {
        //........
    }

}

如果此时 App 已经被系统冻结,则您在 AppDelegate-application:didFinishLaunchingWithOptions: 中可以捕获该消息。

// AppDelegate class

- (BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 本地通知的内容
    UILocalNotification *localNotification = 
    launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

    //解析同理

    return YES;
}

详情请参照获取推送点击事件与内容格式

远程推送内容的获取

远程推送内容的获取

点击通知栏的远程推送时,如果 App 未被系统冻结,则您在 AppDelegate-application:didReceiveRemoteNotification:中可以捕获该消息。

// AppDelegate class

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo {
    // userInfo为远程推送的内容

    NSDictionary *msgDic = [userInfo objectForKey:@"rc"];
    
    NSString *cType = [msgDic objectForKey:@"cType"];//会话类型。PR 指单聊、 DS 指讨论组、 GRP 指群组、 CS 指客服、SYS 指系统会话、 MC 指应用内公众服务、 MP 指跨应用公众服务。
    
    NSString *fId = [msgDic objectForKey:@"fId"];//消息发送者的用户 ID。
    
    NSString *oName = [msgDic objectForKey:@"oName"];//消息类型,参考融云消息类型表.消息标志;可自定义消息类型。
    
    NSString *targetId = [msgDic objectForKey:@"tId"];//Target ID 。

    /*
    cType根据得到字段转换成相应的conversationType
    其余信息可根据需求进行相应的操作
    */

    //跳转相应聊天会话View Controller对象
    RCConversationViewController *chat = [[RCConversationViewController alloc]init];
    
    //设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等,为转换后的值
    chat.conversationType = cType_Value;
    
    //设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID)
    chat.targetId = targetId;
    
    //设置聊天会话界面要显示的标题
    chat.title = @"想显示的会话标题";
    
    //显示聊天会话界面
    if ([self.window.rootViewController isKindOfClass:[RCDNavigationViewController class]]) {
        [(RCDNavigationViewController *)self.window.rootViewController pushViewController:chat animated:YES];
    } else {
        //........
    }

}

如果此时 App 已经被系统冻结,则您在 AppDelegate-application:didFinishLaunchingWithOptions: 中可以捕获该消息。

    // AppDelegate class

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 远程推送的内容
    NSDictionary *remoteNotificationUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];

    ...//解析同理

    return YES;
}

详情请参照 远程推送文档