
IM即时通讯
安全可靠、全球互通

实时音视频
流畅稳定、省钱省力
回答:
融云 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; }
详情请参照 远程推送文档