美文网首页
iOS开发OC -- 环信即时通讯的使用

iOS开发OC -- 环信即时通讯的使用

作者: Hayley__ | 来源:发表于2017-09-07 15:23 被阅读124次

    一 环信简介

    成立于2013年4月,是一家国内领先的企业级软件服务提供商,于2016年荣膺“Gartner 2016 Cool Vendor”。产品包括国内上线最早规模最大的即时通讯云平台——环信即时通讯云,以及移动端最佳实践的全媒体智能云客服平台——环信客户互动云。
    相关链接

    二 sdk集成

    //集成环信SDK
    pod 'Hyphenate',
    //集成环信EaseUI
    pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git', :tag => '3.3.2'
    注意: 由于SDK改成了动态库,EaseUI引入的头文件Full版本和Lite版本不同,导致集成EaseUI失败。代码中包含了宏ENABLE_LITE的定义这个是为了区分集成Lite版本SDK还是Full版本SDK,当通过pod在集成EaseUILite时会在Build Settings> GCC_PREPROCESSOR_DEFINITIONS >ENABLE_LITE=1中定义ENABLE_LITE,集成EaseUI时则不会定义,所以开发者不需要关注这个字段,如果集成Lite版本SDK,建议使用
    //集成环信Lite版SDK
    pod 'HyphenateLite',
    //集成环信EaseUI
    pod 'EaseUILite', :git =>'https://github.com/easemob/easeui-ios-hyphenate-cocoapods.git', :tag => '3.3.2'
    
    *总之 真的是会遇到很多坑 各种冲突什么的 EaseUI中含有第三方(MBProgressHUD、MJRefresh、MWPhotoBrowser、SDWebImage) 需要大家注意 我最后是物理集成EaseUI :( 其实我更喜欢pod
    

    三 相关配置

    制作上传证书用于消息推送

    四 代码示例

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        
        //环信相关集成
        //AppKey:注册的AppKey,详细见下面注释。
        //apnsCertName:推送证书名(不需要加后缀),详细见下面注释。
        
        EMOptions *options = [EMOptions optionsWithAppkey:@"1110170830178623#mengzhu"];
        options.apnsCertName = @"iosAppProCer";
        [[EMClient sharedClient] initializeSDKWithOptions:options];
    
        //EaseUI
        [[EaseSDKHelper shareHelper] hyphenateApplication:application
                            didFinishLaunchingWithOptions:launchOptions
                                                   appkey:@"1110170830178623#mengzhu"
                                             apnsCertName:@"iosAppProCer"
                                              otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES]}];
        
        //环信推送
        EMPushOptions * pushOptions = [[EMClient sharedClient] pushOptions];
        //显示内容
        pushOptions.displayStyle = 1;
        //更新配置到服务器,该方法为同步方法,如果需要,请放到单独线程
        EMError *error = [[EMClient sharedClient] updatePushOptionsToServer];
        if(!error) {
            // 成功
        }else {
            // 失败
        }
        
        // 注册APNS离线推送  iOS8 注册APNS
        if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) {
            [application registerForRemoteNotifications];
            UIUserNotificationType notificationTypes = UIUserNotificationTypeBadge |
            UIUserNotificationTypeSound |
            UIUserNotificationTypeAlert;
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil];
            [application registerUserNotificationSettings:settings];
        }
        else{
            UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeBadge |
            UIRemoteNotificationTypeSound |
            UIRemoteNotificationTypeAlert;
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
        }
       
        // 设置应用程序的图标右上角的数字
        [application setApplicationIconBadgeNumber:0];
    
        //环信添加监听在线推送消息
        [[EMClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
        return YES;
    }
    
    // APP进入后台
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        [[EMClient sharedClient] applicationDidEnterBackground:application];
    }
    
    // APP将要从后台返回
    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        [[EMClient sharedClient] applicationWillEnterForeground:application];
    }
    
    // 当掉线时,iOS SDK 会自动重连,只需要监听重连相关的回调,无需进行任何操作。
    - (void)connectionStateDidChange:(EMConnectionState)aConnectionState
    {
    }
    //注册环信
    EMError *error = [[EMClient sharedClient] registerWithUsername:@"8001" password:@"111111"];
    if (error==nil) {
        NSLog(@"注册成功");
    }
    
    //登录环信 登录一次就可以设置 自动登录了 所以要先判断一次
    BOOL isAutoLogin = [EMClient sharedClient].options.isAutoLogin;
    if (!isAutoLogin) {
        EMError *error = [[EMClient sharedClient] loginWithUsername:@"11236655" password:@"112233"];
              if (!error) {
                   [[EMClient sharedClient].options setIsAutoLogin:YES];
                  }
      }
    
    //退出环信
    EMError *error = [[EMClient sharedClient] logout:YES];
    if (!error) {
        NSLog(@"环信退出成功");
     }
    
    //环信相关  其他设备登录
    - (void)userAccountDidLoginFromOtherDevice{}
    
    //创建聊天 可以直接使用或者继承于EaseMessageViewController
    //环信ID:@"8001"
    //聊天类型:EMConversationTypeChat
    EaseMessageViewController *chatController = [[EaseMessageViewController alloc] initWithConversationChatter:@"8001" conversationType:EMConversationTypeChat];
    
    //环信消息推送处理
    //注册和上传devicetoken
    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
        //环信注册通知
        [[EMClient sharedClient] bindDeviceToken:deviceToken];
    }
    - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
        NSString *str = [NSString stringWithFormat: @"Error: %@",err];
        MZLog(@"%@",str);
    }
    
    //监听环信在线推送消息
    - (void)messagesDidReceive:(NSArray *)aMessages{
        
        if (aMessages.count == 0) {
            return;
        }
        
        for (EMMessage * message in aMessages) {
            UIApplicationState state = [[UIApplication sharedApplication] applicationState];
            switch (state) {
                    //前台运行
                case UIApplicationStateActive:
                    [self showPushNotificationMessage:message];
                    break;
                    //待激活状态
                case UIApplicationStateInactive:
                    [self showPushNotificationMessage:message];
                    
                    break;
                    //后台运行
                case UIApplicationStateBackground:
                    [self showPushNotificationMessage:message];
                    break;
                    
                    
                default:
                    break;
            }
        }
    
    }
    
    //监听环信之后  发送本地通知
    - (void)showPushNotificationMessage:(EMMessage *)message{
        EMPushOptions *options = [[EMClient sharedClient] pushOptions];
        options.displayStyle = 1;
        [[UIApplication sharedApplication] cancelAllLocalNotifications];
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        notification.fireDate = [NSDate date]; //触发通知的时间
        if (options.displayStyle == 1) {
            EMMessageBody *messageBody = message.body;
            NSString *messageStr = nil;
            switch (messageBody.type) {
                case 1:{
                    messageStr = ((EMTextMessageBody *)messageBody).text;
                }
                    break;
                case 2:{
                    messageStr = @"发来一张图片";
                }
                    break;
                case 4:{
                    messageStr = @"发来ta的位置";
                }
                    break;
                case 5:{
                    messageStr = @"发来一段语音";
                }
                    break;
                default:
                    break;
            }
            
            notification.alertBody = [NSString stringWithFormat:@"%@",messageStr];
            notification.userInfo = @{@"msgtype":@(1),@"mid":message.messageId,@"f":message.from};
            notification.alertAction = NSLocalizedString(@"open", @"Open");
            notification.timeZone = [NSTimeZone defaultTimeZone];
            notification.repeatInterval = 0;
            notification.soundName= UILocalNotificationDefaultSoundName;
            //发送通知
            [[UIApplication sharedApplication] scheduleLocalNotification:notification];
            
            UIApplication *application = [UIApplication sharedApplication];
            application.applicationIconBadgeNumber += 1;
        }
    }
    
    //本地通知点击事件
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
        // 必须要监听--应用程序在后台的时候进行的跳转
        if (application.applicationState == UIApplicationStateInactive) {
            [self messageClickHandleWith:notification];
        }
    }
    
    //私信消息退推送点击事件
    - (void)messageClickHandleWith:(UILocalNotification *)notification
    {
        NSDictionary * dic = [notification userInfo];
        UIViewController * controller = [self getCurrentVC];
        MZOtherUserInfoModel * model = [MZOtherUserInfoModel new];
        model.uid = dic[@"mid"];
        model.nickname = dic[@"f"];
        MZMessageChatViewController * chat = [[MZMessageChatViewController alloc]initWithUserModel:model];
        [controller.navigationController pushViewController:chat animated:YES];
    }
    
    //获取当前controller
    - (UIViewController *)getCurrentVC
    {
        UIViewController *result = nil;
        UIWindow * window = [[UIApplication sharedApplication] keyWindow];
        //app默认windowLevel是UIWindowLevelNormal,如果不是,找到UIWindowLevelNormal的
        if (window.windowLevel != UIWindowLevelNormal)
        {
            NSArray *windows = [[UIApplication sharedApplication] windows];
            for(UIWindow * tmpWin in windows)
            {
                if (tmpWin.windowLevel == UIWindowLevelNormal)
                {
                    window = tmpWin;
                    break;
                }
            }
        }
        id  nextResponder = nil;
        UIViewController *appRootVC=window.rootViewController;
        //    如果是present上来的appRootVC.presentedViewController 不为nil
        if (appRootVC.presentedViewController) {
            nextResponder = appRootVC.presentedViewController;
        }else{
            
            UIView *frontView = [[window subviews] objectAtIndex:0];
            nextResponder = [frontView nextResponder];
        }
        
        if ([nextResponder isKindOfClass:[UITabBarController class]]){
            UITabBarController * tabbar = (UITabBarController *)nextResponder;
            UINavigationController * nav = (UINavigationController *)tabbar.viewControllers[tabbar.selectedIndex];
            //        UINavigationController * nav = tabbar.selectedViewController ; 上下两种写法都行
            result=nav.childViewControllers.lastObject;
            
        }else if ([nextResponder isKindOfClass:[UINavigationController class]]){
            UIViewController * nav = (UIViewController *)nextResponder;
            result = nav.childViewControllers.lastObject;
        }else{
            result = nextResponder;
        }
        return result;
    }
    
    //远程消息推送点击处理
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
        if(userInfo)
        {
          //
        }
    }
    

    暂时先 粗略记载 后续有时间会细化:)

    相关文章

      网友评论

          本文标题:iOS开发OC -- 环信即时通讯的使用

          本文链接:https://www.haomeiwen.com/subject/uypvjxtx.html