本文介绍iOS和macOS版本AIMSDK的支持系统、集成方法和简单使用示例,通过本文您将了解如何进行SDK集成。

支持系统

iOS支持iOS 8.0及以上,Xcode 11.2.1。

macOS支持OS X 10.12及以上。

集成方法

  1. App导入所需依赖
    // DingPaaS基座SDK
    pod 'dps4ios', 'x.x.x.x'
    // 钉钉定制版 sqlite
    pod 'xlite', '1.0.2.9'
    // OpenSSL 1.1.1
    pod 'BabaSSL', '1.1.1-h.c09a949f-2'
    // 钉钉网络库
    pod 'GaeaNetwork', '2.0.0.8'
    // DingPaaS OC 绑定框架
    pod 'DmojoSupport4ios', '1.0.1.12'
    // IM SDK
    pod 'DingPaaSAIM4ios', '3.0.0.12'
    说明 上述依赖库均为静态库依赖。
  2. 启动DingPaaS引擎
    // 创建引擎,仅需创建一次
    [DPSPubEngine CreateDPSEngine];
    
    // 获取引擎实例
    DPSPubEngine *engine = [DPSPubEngine GetDPSEngine];
    
    // 获取DingPaaS设置
    DPSPubSettingService *settingService = [engine getSettingService];
    // 设置必要信息
    [settingService setAppKey:@"appKey"];
    [settingService setAppID:@"apitest"];
    // 设置本地数据库/数据存储路径, 该路径必须存在,并可有可写权限
    [settingService setDataPath:@"..."];
    // 设备唯一ID
    [settingService setDeviceId:@"..."];
    // 构造UA所需的参数
    [settingService setAppName:@"..."];
    [settingService setAppVersion:@"..."];
    [settingService setAppLocale:@"..."];
    [settingService setOSName:@"..."];
    [settingService setOSVersion:@"..."];
    [settingService setDeviceName:@"..."];
    [settingService setDeviceType:@"..."];
    [settingService setDeviceLocale:@"..."];
    [settingService setTimeZone:@"..."];
    [settingService setEnvType:DPSEnvType::DPSEnvTypeEnvTypeOnline];
    // 向 DingPaaS 服务申请的长链接域名
    [settingService setLonglinkServerAddress:@"..."];
    // 向 DingPaaS 服务申请的文件上传服务域名
    [settingService setFileUploadServerAddress:@"..."];
    //设置登录token获取回调
    [self.settingService SetAuthTokenCallback:self];
    // Token 回调 delegate
    #pragma mark DPSAuthTokenCallback
    - (void)onCallback:(nonnull NSString *)userId onGot:(nullable DPSAuthTokenGotCallback *)onGot reason:(DPSAuthTokenExpiredReason)reason {
        [self requestTokenWithCompletion:^(NSError *error) {
            if (error == nil) {
                DPSAuthToken *authToken = [[DPSAuthToken alloc] init];
    
                authToken.accessToken = self.authToken.accessToken;
                authToken.refreshToken = self.authToken.refreshToken;
    
                [onGot onSuccess:authToken];
            } else {
                [onGot onFailure:(int32_t)error.code errorMsg:error.localizedDescription];
            }
        }];
    }
    
    // ----
    
    // 注册 IM 模块
    DPSModuleInfo* info = [AIMPubModule GetModuleInfo];
    [engineInstance registerModule:info];
    
    // 启动引擎,为异步,成功后,将回调listener.onSuccess()
    [engineInstance startWithBlock:^{
        if (completion) {
            callBack(nil);
        }
    } onFailure:^(DPSError * _Nonnull error) {
        if (completion) {
            callBack(error);
        }
    }];

使用示例

  • 创建用户实例及登录
    // 创建用户 manager
    DPSPubEngine *engine = [DPSPubEngine GetDPSEngine];
    // 创建 1234 用户实例,异步,通过listener监听是否创建完成(内部会进行数据库初始化等操作)
    [engine createDPSManagerWithBlock:@"1234"
    onSuccess:^(DPSPubManager *_Nullable manager) {
        // ...
    }
    onFailure:^(DPSError *_Nonnull error) {
        // ...
    }];
    
    ...
    // 创建manager成功后,获取对应用户的Manger
    DPSPubManager* manager = [engine getDPSManager@"1234"];
    DPSAuthService* authService = [manager getAuthService];
    [authService addListener: self];
    
    #pragma mark -DPSPubAuthListener
    /**
     * 连接状态事件
     * @param status      网络状态
     */
    - (void)onConnectionStatusChanged:(DPSConnectionStatus)status {
    }
    /**
     * 登录token获取失败事件
     * @param errorCode  获取登录token失败错误值
     * @param errorMsg   获取登录token失败错误信息
     */
    - (void)onGetAuthCodeFailed:(int32_t)errorCode errorMsg:(nonnull NSString *)errorMsg {
        
    }
    /**
     * 本地登录事件
     * 如果本地已有登录信息,创建账号后会立即回调;反之会等待网络登录成功之后回调
     */
    - (void)onLocalLogin {
    }
    /**
     * 被踢事件
     * @param message     被踢下线时附带的消息
     */
    - (void)onKickout:(nonnull NSString *)message {
    }
    /**
     * 其他端设备在(离)线情况
     * @param type        事件类型(1:事件通知,包括上下线,2:状态通知,在线状态)
     * @param deviceType 设备类型
     * (0:default,1:web,2:Android,3:iOS,4:Mac,5:Windows,6:iPad)
     * @param status      设备状态(1:上线或在线,2:下线或离线)
     * @param time        时间(上线或下线时间)
     */
    - (void)onDeviceStatus:(int32_t)type deviceType:(int32_t)deviceType status:(int32_t)status time:(int64_t)time {
    }
    /**
     * 下载资源cookie变更事件
     * @param cookie      新cookie
     */
    - (void)onMainServerCookieRefresh:(nonnull NSString *)cookie {
    }
    
    // ----
    
    [authService login];
    
    // 退出登录,当用户主动登出时调用,正常退出应用无需调用,下次启动可免登,内部自动刷新token
    [authService logout];
  • IM相关:获取会话列表
    // 获取用户(1234)对应的 IM module 实例
    AIMPubModule* imModule = [AIMPubModule GetModuleInstance:@"1234"];
    // 获取会话服务
    AIMPubConvService* convService = [imModule getConvService];
    // 获取100条会话列表
    [convService listLocalConversationsWithOffsetWithBlock:0
        count:200
        onSuccess:^(NSArray<AIMPubConversation *> *_Nonnull conversations) {
            // 注:SDK 的回调均在单独的callback 线程,不能进行UI操作,也不能进行耗时的操作
        }
        onFailure:^(DPSError *_Nonnull error) {
        }];
  • IM相关:创建会话
    // 获取用户(1234)对应的 IM module 实例
    AIMPubModule* imModule = [AIMPubModule GetModuleInstance:@"1234"];
    // 获取会话服务
    AIMPubConvService* convService = [imModule getConvService];
    
    // 创建单聊
    AIMPubConvCreateSingleConvParam *param = [AIMPubConvCreateSingleConvParam new];
    NSArray *userIds = @[uid, @"1234"]; // 对方及自己的账号
    param.uids = userIds;
    
    [convService createSingleConversationWithBlock:param 
        onSuccess:^(AIMPubConversation * _Nonnull conv) {
        // 创建成功
        } onFailure:^(DPSError * _Nonnull error) {
        // 创建失败
        }];
    
    // 创建群聊
    AIMPubGroupService* groupService = [imModule getGroupService];
    AIMPubGroupCreateGroupConvParam *param = [AIMPubGroupCreateGroupConvParam new];
    param.title = @“title”
    [groupService createGroupConversationWithBlock:param 
        onSuccess:^(AIMPubConversation * _Nonnull conv) {
        NSLog(@"创建群聊成功:cid=%@", conv.appCid);
      } onFailure:^(DPSError * _Nonnull error) {
        //创建群聊失败
      }];
  • IM相关:发送消息
    // 获取 MsgService
    AIMPubModule* imModule = [AIMPubModule GetModuleInstance:@"1234"];
    AIMPubMsgService* msgService = [imModule getMsgService];
    
    // 构造文本消息内容
    AIMMsgTextContent* textContent = [[AIMMsgTextContent alloc] init];
    textContent.text = @"Hello ";
    
    // 构造消息内容
    AIMMsgContent* msgContent = [[AIMMsgContent alloc] init];
    msgContent.contentType = AIMMsgContentTypeContentTypeText;
    msgContent.textContent = textContent;
    
    // 构造消息
    AIMPubMsgSendMessage* sendMessage = [[AIMPubMsgSendMessage alloc] init];
    sendMessage.content = msgContent;
    sendMessage.receivers = conv.userids;
    sendMessage.cid = conv.cid;
    
    [msgService sendMessageWithBlock:sendMessage onProgress:^(double progress) {
        
    } onSuccess:^(AIMPubMessage * _Nonnull msg) {
        [AIMSimpleLogger logInfo:@"sending message success"];
    } onFailure:^(DPSError * _Nonnull error) {
        NSString *errorDetail = [NSString stringWithFormat:@"sending message failed with error:%@", error];
        [AIMSimpleLogger errorInfo:[NSString stringWithFormat:@"%@", errorDetail]];
    } userData:@{}];
  • IM相关:接收消息
    // 获取 MsgService
    AIMPubModule* imModule = [AIMPubModule GetModuleInstance:@"1234"];
    AIMPubMsgService* msgService = [imModule getMsgService];
    
    [msgService addMsgListener:self]
    
    ////////
    - (void)onAddedMessages:(NSArray<AIMPubMessage*> *)messages {
        // 收到新消息的回调,可通过newMsg.type 区分是自己发送的,或在线/离线状态收到的消息
    }
    
    - (void)onRemovedMessages:(nonnull NSArray<AIMPubMessage*>*)msgs {
        // 消息被删除的回调
    }
    
    - (void)onStoredMessages:(nonnull NSArray<AIMPubMessage*>*)msgs {
        // 消息入库时的回调,如拉消息时,会存入本地数据库
        // 可在该回调内进行消息的加工处理
    }