一步步教你集成IMSDK iOS SDK,实现即时聊天

时间:2022-10-02 03:23:40

写在前面的话

  • 目标读者:初接触IMSDK的iOS开发者
  • 阅读目标:一步一步指导开发者,如何在最短时间内将IMSDK集成到自己的APP中
  • 阅读背景:
    • 假设读者有最基本的iOS基础,比如笔者不足三个月iOS经验
    • 假设读者有现成的APP需要嵌入,比如笔者新建了一个单页模板
    • 假设读者有嵌入IMSDK的需求,比如笔者是为了演示而嵌入

集成步骤

  1. 创建爱萌即时通讯开发者帐号
  2. 创建应用,获取APP_KEY
  3. 下载IMSDK Lib包
  4. 集成SDK

名词约定

  • app_key - 在imsdk平台中唯一标识一款应用,24位
  • p2p消息 - 用户与用户之间的单聊信息,如QQ上的好友间的单聊信息

1. 创建爱萌即时通讯开发者帐号

如果您还未创建爱萌开发者帐号,请前往爱萌即时通讯官网注册。
其中,用户名、密码、邮件为必填项,其它均为可选项。

一步步教你集成IMSDK iOS SDK,实现即时聊天

2. 创建应用,获取APP_KEY

如下图,创建应用的表单分为三部分,分别是:基础信息、Android部分、iOS部分。iOS平台只需要填写基础信息和iOS部分

一步步教你集成IMSDK iOS SDK,实现即时聊天

  • 应用名称:必填项,用于在IMSDK平台
  • 图标:可选,目前仅仅在IMSDK平台上展现时用
  • 交友类型,创建后无法更改
    • 熟人交友,好友关系生效
    • 陌生人,黑名单生效
  • iOS环境:用于指定IM Server在发送APNs时,所使用的p12证书的环境,对应下面两个证书
  • APNs证书/密码(开发):调试时用的的APNs证书、密码
  • APNs证书/密码(生产):该证书用于Ad Hoc版本或者正式发布版本推送

一步步教你集成IMSDK iOS SDK,实现即时聊天
应用创建成功后,将跳转到应用设置页面。
系统生成关键信息:App Key和Master Secret Key。

3. 下载IMSDK iOS Lib

请前往IMSDK Lib下载页,下载iOS完整SDK。
包名结构:IMSDK-iOS_v[版本号]
解压Lib包:,其目录结构如下图。共包含两个目录,内容相仿,分别对应真机和模拟器开发

  • Release-iphoneos - 真机开始
  • Release-iphonesimulator - 模拟器开发

以模拟器开发库为例,Release-iphonesimulator共包含一个.a文件和两个子目录

  • libIMSDK.a - 静态库文件
  • PublicInterface - *面SDK接口头文件
  • PublicUI - UI控件头文件

一步步教你集成IMSDK iOS SDK,实现即时聊天

4. 集成SDK

下面以模拟器调试为例,演示如何快速集成IMSDK*面功能。

一步步教你集成IMSDK iOS SDK,实现即时聊天

该APP有两个界面如上图,当点击左侧的注册或登录,成功会切换至右侧界面;

1. 添加IMSDK Lib包(以模拟器为例)

将Release-iphonesimulator拖至项目中,并勾选“Copy items if needed…”

一步步教你集成IMSDK iOS SDK,实现即时聊天

最终项目目录结构如下

一步步教你集成IMSDK iOS SDK,实现即时聊天

2. 添加必要系统框架
* CoreLocation
* CoreTelephony
* SystemConfiguration
* ImageIO
* QuartzCore
* CoreTelephony

一步步教你集成IMSDK iOS SDK,实现即时聊天

3. 设置编译配置

设置链接选项:-licucore、 -ObjC

一步步教你集成IMSDK iOS SDK,实现即时聊天

4. 添加代码
  • 初始化IMSDK,根据实际业务确定初始化位置,通常在应用入口处,如AppDelegate。
    /* 在AppDelegate.m中,添加如下代码 */

    // 添加引用
    #import "IMSDK.h"
    #import "IMMyself.h"

    ...

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

        MainViewController *rootView = [[MainViewController alloc] init];
        rootView.title = @"我的测试应用";

        NSLog(@"IMSDK init");
        [g_pIMSDK initWithAppKey:@"{此处填写你在步骤2中生成的app_key}"];
        return YES;
    }


    // 以下代码用于IMSDK辅助功能,如接收APNs、set角标或者应用在前后台切换处理
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        [g_pIMSDK setDeviceToken:deviceToken];
    }

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
        NSLog(@"register remotoNotification failed with error:%@",error);
    }

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    }

    - (void)applicationWillEnterForeground:(UIApplication *)application {
        [g_pIMSDK applicationWillEnterForeground];
    }

    - (void)applicationDidEnterBackground:(UIApplication *)application {
        [g_pIMSDK applicationDidEnterBackground];
    }
  • 登录/注册代码
        /* 注册按钮的点击事件关键代码 */
        NSString *strCid = [_customUserIDTextField text];
        NSString *strPwd = [_passwordTextField text];

        NSLog( @"login - %@|%@", strCid, strPwd);


        [g_pIMMyself setCustomUserID:strCid];
        [g_pIMMyself setPassword:strPwd];
        [g_pIMMyself registerWithTimeoutInterval:0 success:^{
                MainViewController *mainView = [[MainViewController alloc] init];

                mainView.view.backgroundColor = RGB(255, 255, 255);
                [[self navigationController] pushViewController: mainViewanimated:YES];

            } failure:^(NSString *e) {
                NSLog(@"%@", e);
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"注册失败 - %@", e] message:e delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil,nil];

               [alertView show];
            }];
    /* 登录按钮的点击事件关键代码 */
    NSString *strCid = [_customUserIDTextField text];
    NSString *strPwd = [_passwordTextField text];

    NSLog( @"login - %@|%@", strCid, strPwd);


    [g_pIMMyself setCustomUserID:strCid];
    [g_pIMMyself setPassword:strPwd];
    [g_pIMMyself loginWithTimeoutInterval:0 success:^{
            MainViewController *mainView = [[MainViewController alloc] init];

            mainView.view.backgroundColor = RGB(255, 255, 255);
            [[self navigationController] pushViewController: mainViewanimated:YES];

        } failure:^(NSString *e) {
            NSLog(@"%@", e);
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"注册失败 - %@", e] message:e delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil,nil];

           [alertView show];
        }];
  • 发送消息代码
    /* 发送按钮关键代码 */

    NSString *strCid = [_txtCid text];
    NSString *strMsg = [_txtMsg text];

    NSLog( @"send text - %@|%@", strCid, strMsg);

    [g_pIMMyself sendText:strMsg toUser:strCid success:^{
            NSLog(@"send to %@ success", strCid);

            //呈现到UITextView
            [self appendTextToView:strCid msg:strMsg time:[NSDate date]];

            [_txtMsg setText:nil];
        } failure:^(NSString *e) {
            NSLog(@"%@", e);

            //呈现到UITextView
            [self appendTextToView:strCid msg:[NSString stringWithFormat:@"%@ - 发送失败", strMsg] time:[NSDate date]];
        } ];
  • 接收消息
    /* 接收消息关键代码 */
    // 在处理接收消息的类上实现协议IMMyselfDelegate,此处为第二个Controller
    @interface MainViewController ()<UITextFieldDelegate,IMMyselfDelegate>

    //实现协议的方法,在p2p消息到达时触发
    - (void)didReceiveText:(NSString *)text fromCustomUserID:(NSString *)customUserID serverSendTime:(UInt32)timeIntervalSince1970 {
        //呈现至UITextView
        [self appendTextToView:customUserID msg:text time:[NSDate dateWithTimeIntervalSince1970:timeIntervalSince1970]];

    }

至此,一个简单的聊天APP就完成了。


IMSDK下载 - http://www.imsdk.im/download
更多API - http://docs.imsdk.im/