TIMManager.h 17.2 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
/////////////////////////////////////////////////////////////////////
//
//                     腾讯云通信服务 IMSDK
//
//  模块名称:TIMManager  
//
//  模块功能:IMSDK 主核心模块,负责 IMSDK 的初始化、登录、创建会话、管理推送等功能。
//     
//  (1) 初始化:初始化是使用 TIMSDK 的前提,任何其它 API 的调用都应该在 initSdk 接口之后被调用。
//
//  (2) 登录:需要设置 SDKAppID,userID 和 userSig 才能使用腾讯云服务。
//
//  (3) 会话:一个会话对应一个聊天窗口,比如跟一个好友的 C2C 聊天,或者一个聊天群,都是一个会话。
//
//  (4) 推送:管理和设置 APNS 的相关功能,包括 token 和开关等。
//
/////////////////////////////////////////////////////////////////////


#ifndef ImSDK_TIMManager_h
#define ImSDK_TIMManager_h

#import "TIMComm.h"
#import "TIMCallback.h"

@class TIMGroupManager;
@class TIMFriendshipManager;


/**
 * IMSDK 主核心类,负责 IMSDK 的初始化、登录、创建会话、管理推送等功能。
 */
@interface TIMManager : NSObject

#pragma mark 一,初始化相关接口函数

/////////////////////////////////////////////////////////////////////////////////
//
//                      (一)初始化相关接口函数
//
/////////////////////////////////////////////////////////////////////////////////

/// @name 初始化相关接口
/// @{

/**
 *  1.1 获取管理器实例 TIMManager
 *
 *  @return 管理器实例
 */
+ (TIMManager*)sharedInstance;

/**
 *  1.2 初始化 SDK,设置全局配置信息
 *
 *  初始化 SDK 需要设置 TIMSdkConfig 信息,TIMSdkConfig 主要包含 sdkAppId 设置、Log 相关逻辑设置、数据库存储路径设置、网络监听设置等,
 *  其中 sdkAppId 的获取请参考官网文档 [跑通Demo(iOS与Mac)](https://cloud.tencent.com/document/product/269/32674)。
 *
 *  @param globalConfig 配置信息,全局有效,详情请参考 TIMComm.h 中的 TIMSdkConfig 定义。
 *  @return 0:成功;1:失败,config 为 nil
 */
- (int)initSdk:(TIMSdkConfig*)globalConfig;

/**
 *  1.3 反初始化
 */
- (void)unInit;

/**
 *  1.4 获取全局配置信息
 *
 *  @return 全局配置,详情请参考 TIMComm.h 中的 TIMSdkConfig 定义
 */
- (TIMSdkConfig*)getGlobalConfig;

/**
 *  1.5 设置用户配置信息
 *
 *  主要用来开启/关闭自动已读上报和已读回执,设置默认拉取的群组资料,群成员资料字段,监听用户登录状态、会话刷新、消息已读回执、文件上传进度、群组事件通知。
 *
 *  1. disableAutoReport 是否开启多终端同步未读提醒,这个选项主要影响多终端登录时的未读消息提醒逻辑。
 *        YES:只有当一个终端调用 setReadMessage() 将消息标记为已读,另一个终端再登录时才不会收到未读提醒;
 *         NO:消息一旦被一个终端接收,另一个终端都不会再次提醒。同理,卸载 APP 再安装也无法再次收到这些未读消息。
 *  2. enableReadReceipt 是否开启被阅回执,接收端设置,发送端才会生效。
 *        YES:接收者查看消息(setReadMessage)后,消息的发送者会收到 TIMMessageReceiptListener 的回调提醒;
 *         NO: 不开启被阅回执,默认不开启。
 *  3. groupInfoOpt 设置拉取群资料中的自定义字段。
 *  4. groupMemberInfoOpt 设置拉群成员资料中的自定义字段。
 *
 *  @note setUserConfig() 要在 initSdk() 之后 和 login() 之前调用。
 *
 *  @param config 配置信息,对当前 TIMManager 有效,详情请参考 TIMComm.h 中的 TIMUserConfig 定义
 *  @return 0:成功;1:失败,config 为 nil
 */
- (int)setUserConfig:(TIMUserConfig*)config;

/**
 *  1.6 获取用户配置信息
 *
 *  @return 当前 manager 绑定用户的配置,详情请参考 TIMComm.h 中的 TIMUserConfig 定义
 */
- (TIMUserConfig*)getUserConfig;

/**
 *  1.7 新消息接收监听
 *
 *  添加消息监听后,会在 TIMMessageListener 的 onNewMessage 收到回调消息,消息内容通过参数 TIMMessage 传递。
 *  消息的解析可参阅 [消息解析](https://cloud.tencent.com/document/product/269/9150#.E6.B6.88.E6.81.AF.E8.A7.A3.E6.9E.90) 。
 *
 *  @param listener 回调,详情请参考 TIMCallback.h 中的 TIMMessageListener 定义
 *  @return 0:成功;1:失败,listener 为 nil
 */
- (int)addMessageListener:(id<TIMMessageListener>)listener;

/**
 *  1.8 移除消息监听
 *
 *  @param listener 回调,详情请参考 TIMCallback.h 中的 TIMMessageListener 定义
 *  @return 0:成功;1:失败,listener 为 nil
 */
- (int)removeMessageListener:(id<TIMMessageListener>)listener;

/// @}

#pragma mark 二,登录相关接口
/////////////////////////////////////////////////////////////////////////////////
//
//                      (二)登录相关接口
//
/////////////////////////////////////////////////////////////////////////////////

/// @name 登录相关接口
/// @{
/**
 *  2.1 登录
 *
 *  1. 登录需要设置用户名 userID 和用户签名 userSig,userSig 生成请参 [UserSig 后台 API](https://cloud.tencent.com/document/product/269/32688)。
 *  2. 如果 userSig 过期,登录会返回 ERR_USER_SIG_EXPIRED:6206 错误码,收到错误码后请生成新的 userSig 重新登录。
 *  3. 用户在线情况下被踢,会在 TIMUserConfig 里面配置的 TIMUserStatusListener 监听器获取 onForceOffline 回调,收到回调后可以选择重新登录。
 *  4. 用户离线状态下被踢,会在用户重新登录时收到 (ERR_IMSDK_KICKED_BY_OTHERS:6208) 错误码,此时需要再次调用 login() 强制上线。
 *  5. 如果当前是登录中,则本次登录无效,本次回调不会有任何返回,登录结果会通过第一次登录的回调返回,可以通过 getLoginStatus() 获取登录状态。
 *  
 *  更多详情请参考 [用户状态变更](https://cloud.tencent.com/document/product/269/9148#5.-.E7.94.A8.E6.88.B7.E7.8A.B6.E6.80.81.E5.8F.98.E6.9B.B4)。
 *
 *  @param param 登录参数,详情请参考 TIMComm.h 中的 TIMLoginParam 定义
 *  @param succ  成功回调,详情请参考 TIMComm.h 中的 TIMLoginSucc 定义
 *  @param fail  失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败,请检查 param 参数是否正常
 */
- (int)login: (TIMLoginParam*)param succ:(TIMLoginSucc)succ fail:(TIMFail)fail;

/**
 *  2.2 自动登录
 *
 *  自动登录类似“记住密码”的功能,如果上一次已经成功登录,那么一段时间内都只需要传入用户名就可以完成登录。
 *  相比于普通的 login(TIMLoginParam) 接口,该接口可以减少 IM SDK 向您的服务器索要 UserSig 的频率,
 *  既可以加快登录速度,又能减少你的 UserSig 服务器压力,也在一定程度上降低了 UserSig 泄漏的风险。
 *
 *  1. 首次登录之后,SDK 会把登录信息存在在本地,下次登录即可调用自动登录
 *  2. 如果用户之前没有登录过,或则 APP 被卸载过,自动登录会报 ERR_NO_PREVIOUS_LOGIN:6026 错误,这个时候请调用 login 接口重新登录。
 *
 *  @param userID 自动登录用户名
 *  @param succ  成功回调,详情请参考 TIMComm.h 中的 TIMLoginSucc 定义
 *  @param fail  失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败,请检查 param 参数是否正常
 */
- (int)autoLogin:(NSString*)userID succ:(TIMLoginSucc)succ fail:(TIMFail)fail;

/**
 *  2.3 登出
 *
 *  退出登录,如果切换账号,需要 logout 回调成功或者失败后才能再次 login,否则 login 可能会失败。
 *
 *  @param succ 成功回调,登出成功
 *  @param fail 失败回调,返回错误码和错误信息
 *
 *  @return 0:发送登出包成功,等待回调;1:失败
 */
- (int)logout:(TIMLoginSucc)succ fail:(TIMFail)fail;

/**
 *  2.4 获取当前登录的用户
 *
 *  @return 如果登录返回用户的 userID,如果未登录返回 nil
 */
- (NSString*)getLoginUser;

/**
 *  2.5 获取当前登录状态
 *
 *  @return 登录状态,详情请参考 TIMComm.h 中的 TIMLoginStatus 定义
 */
- (TIMLoginStatus)getLoginStatus;

/// @}

#pragma mark 三,会话管理器
/////////////////////////////////////////////////////////////////////////////////
//
//                      (三)会话管理器
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 会话管理器
/// @{

/**
 *  3.1 获取会话列表
 *
 *  一个会话对应一个聊天窗口,比如跟一个好友的 1v1 聊天,或者一个聊天群,都是一个会话。
 *
 *  @return 会话列表
 */
- (NSArray<TIMConversation *>*)getConversationList;

/**
 *  3.2 获取单个会话
 *
 *  TIMConversation 负责会话相关操作,包含发送消息、获取会话消息缓存、获取未读计数等。
 *
 *  @param type 详情请参考 TIMComm.h 里面的 TIMConversationType 定义
 *  @param conversationId 会话 ID
                          单聊类型(C2C)   :为对方 userID;
                          群组类型(GROUP) :为群组 groupId;
                          系统类型(SYSTEM):为 @""
 *
 *  @return 会话对象,详情请参考 TIMConversation.h 里面的 TIMConversation 定义
 */
- (TIMConversation*)getConversation:(TIMConversationType)type receiver:(NSString*)conversationId;

/**
 *  3.3 删除单个会话
 *
 *  @param type 会话类型,详情请参考 TIMComm.h 里面的 TIMConversationType 定义
 *  @param conversationId 会话 Id
 *                        单聊类型(C2C)   :为对方 userID;
 *                        群组类型(GROUP) :为群组 groupId;
 *                        系统类型(SYSTEM):为 @""
 *
 *  @return YES:删除成功;NO:删除失败
 */
- (BOOL)deleteConversation:(TIMConversationType)type receiver:(NSString*)conversationId;

/**
 *  3.4 删除单个会话和对应的会话消息
 *
 *  本接口与 deleteConversation() 的差异在于,deleteConversation() 只是删除单个会话,而本接口会额外把本地缓存的消息记录也一并删除掉。
 *  
 *  @note 本接口只能删除本地缓存的历史消息,无法删除云端保存的历史消息。
 *  @param type 会话类型,详情请参考 TIMComm.h 里面的 TIMConversationType 定义
 *  @param conversationId 会话 Id
 *                        单聊类型(C2C)   :为对方 userID;
 *                        群组类型(GROUP) :为群组 groupId;
 *                        系统类型(SYSTEM):为 @""
 *
 *  @return YES:删除成功;NO:删除失败
 */
- (BOOL)deleteConversationAndMessages:(TIMConversationType)type receiver:(NSString*)conversationId;

/// @}

#pragma mark 四,设置 APNs 推送
/////////////////////////////////////////////////////////////////////////////////
//
//                      (四)设置 APNs 推送
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 设置 APNs 推送
/// @{

/**
 *  4.1. 设置客户端 Token 和证书 busiId
 *
 *  token 是苹果后台对客户端的唯一标识,需要主动调用系统 API 向苹果请求获取,请求成功后,
 *  可以在 didRegisterForRemoteNotificationsWithDeviceToken 回调收到对应的 token 信息。
 *  具体实现见下面代码示例:
 *
 *  <pre>
 *
 *  //获取 token 代码示例
 *  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
 *    [[UIApplication sharedApplication] registerUserNotificationSettings:
 *        [UIUserNotificationSettings settingsForTypes:
 *            (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
 *    [[UIApplication sharedApplication] registerForRemoteNotifications];
 *  }
 *  else{
 *    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
 *        (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
 *  }
 * 
 *  //收到 token 代码示例
 *  -(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
 *    //回调的 deviceToken 就是需要的 token 信息
 *  }
 *
 *  </pre>
 *
 *  busiId 是推送证书 ID,是向 IM 控制台上传 iOS 证书(p.12)生成的,
 *  具体步骤请参考 [离线推送](https://cloud.tencent.com/document/product/269/9154)。
 *
 *  @param token 详情请参考 TIMComm.h 中的 TIMTokenParam 定义
 *  @param succ 成功回调,详情请参考 TIMComm.h 中的 TIMSucc 定义
 *  @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败,token 参数异常
 */
- (int)setToken:(TIMTokenParam*)token succ:(TIMSucc)succ fail:(TIMFail)fail;

/**
 *  4.2. 设置 APNS
 *
 *  设置 APNS,可设置单聊、群组推送声音,也可以设置是否开启推送。
 *
 *  @param config APNS 配置,详情请参考 TIMComm.h 中的 TIMAPNSConfig 定义
 *  @param succ   成功回调,详情请参考 TIMComm.h 中的 TIMSucc 定义
 *  @param fail   失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败,config 参数异常
 */
- (int)setAPNS:(TIMAPNSConfig*)config succ:(TIMSucc)succ fail:(TIMFail)fail;

/**
 *  4.3. 获取 APNS 配置
 *
 *  @param succ 成功回调,返回配置信息,详情请参考 TIMComm.h 中的 TIMAPNSConfigSucc 定义
 *  @param fail 失败回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败
 */
- (int)getAPNSConfig:(TIMAPNSConfigSucc)succ fail:(TIMFail)fail;

/**
 *  4.4. APP 进后台
 *
 *  APP 进后台的时候需要主动调用 doBackground ,这个时候后台知道 APP 的状态,之后的消息会下发推送通知。
 *
 *  <pre>
 *
 *  - (void)applicationDidEnterBackground:(UIApplication *)application {
 *     TIMBackgroundParam  *param = [[TIMBackgroundParam alloc] init];
 *     [param setC2cUnread:unReadCount];
 *     [[TIMManager sharedInstance] doBackground:param succ:^() {
 *        // to do
 *     } fail:^(int code, NSString * err) {
 *        // to do
 *     }];
 *  }
 *
 *  </pre>
 *
 *  @param param 上报参数,详情请参考 TIMComm.h 中的 TIMBackgroundParam 定义
 *  @param succ  成功时回调,详情请参考 TIMComm.h 中的 TIMSucc 定义
 *  @param fail  失败时回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败
 */
- (int)doBackground:(TIMBackgroundParam*)param succ:(TIMSucc)succ fail:(TIMFail)fail;


/**
 *  4.5. APP 进前台
 *
 *  APP 进前台的时候需要主动调用 doForeground,这个时候后台知道 APP 的状态,之后的消息不会下发推送通知。
 *
 *  <pre>
 *
 *  - (void)applicationDidBecomeActive:(UIApplication *)application {
 *     [[TIMManager sharedInstance] doForeground:^() {
 *        //to do
 *     } fail:^(int code, NSString * err) {
 *        //to do
 *     }];
 *  }
 *
 *  </pre>
 *
 *  @param succ  成功时回调,详情请参考 TIMComm.h 中的 TIMSucc 定义
 *  @param fail  失败时回调,详情请参考 TIMComm.h 中的 TIMFail 定义
 *
 *  @return 0:成功;1:失败
 */
- (int)doForeground:(TIMSucc)succ fail:(TIMFail)fail;

/// @}

#pragma mark 五,未登录查看本地会话和消息
/////////////////////////////////////////////////////////////////////////////////
//
//                      (五)未登录查看本地会话和消息
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 未登录查看本地会话和消息
/// @{

/**
 *  5.1 在未登录的情况下加载本地存储
 *
 *  该接口相当于 login() 函数的无网络版本,适用于在用户没有网络(未登录)的情况下查看用户的本地会话和消息。
 *
 *  @note 如过已经 login() 成功,请不要调用此函数,否则会导致各种异常问题。
 *
 *  @param userID 用户名
 *  @param succ  成功回调,收到回调时,可以获取会话列表和消息
 *  @param fail  失败回调
 *  @return 0:加载成功;1:请求失败
 */
- (int)initStorage:(NSString*)userID succ:(TIMLoginSucc)succ fail:(TIMFail)fail;

///@}

#pragma mark 六,调试相关接口
/////////////////////////////////////////////////////////////////////////////////
//
//                      (六)调试相关接口
//
/////////////////////////////////////////////////////////////////////////////////
/// @name 调试相关接口
/// @{

/**
 *  6.1 获取版本号
 *
 *  @return 返回版本号,字符串表示,例如 v1.1.1
 */
- (NSString*)GetVersion;

/**
 *  6.2 打印日志
 *
 *  通过 ImSDK 提供的日志功能打印日志
 *
 *  @param level 日志级别,详情请参考 TIMComm.h 中的 TIMLogLevel 定义
 *  @param tag   模块 tag
 *  @param msg   要输出的日志内容
 */
- (void)log:(TIMLogLevel)level tag:(NSString*)tag msg:(NSString*)msg;

/**
 *  6.3 获取日志文件路径
 */
- (NSString*)getLogPath;

/**
 *  6.4 获取日志打印开启状态
 *
 *  您可以在 initSdk -> TIMSdkConfig -> disableLogPrint 设置日志是否打印
 *
 * @return YES:允许 log 打印;NO:不允许 log 打印
 */
- (BOOL)getIsLogPrintEnabled;

/**
 *  6.5 获取日志级别
 *
 *  @return 返回日志级别,详情请参考 TIMComm.h 中的 TIMLogLevel 定义
 */
-(TIMLogLevel) getLogLevel;

///@}

@end
#endif