点击本地通知与远程推送进行跳转
运行状态
融云 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;
}
详情请参照 远程推送文档