简介

yun2win-sdk-iOS提供iOS端完整解决方案,方便客户快速集成IM功能. SDK 提供的能力如下:

  • 注册
  • 登录
  • 用户会话
  • 联系人
  • 群组
  • 消息

开发准备

从以下网址下载SDK:

https://github.com/yun2win/yun2win-sdk-server

iOS目录结构如下:

  • Common:通用模块
    • Util:常用工具
    • Config:全局配置
    • Category:类别扩展
  • Classes:demo结构
    • ConversationList:用户会话列表
    • Conversation:用户会话界面
    • Contact:联系人
    • Setting:设置
    • Setting:登陆注册
  • Model:demo业务逻辑及实体
  • Yun2Win:SDK模块

注册

调用以下代码进行用户注册:

                        
[[Y2WUsers getInstance].remote registerWithAccount:@"account"
                                          password:@"password"
                                              name:@"name"
                                           success:^{

                                            // 注册成功

                                         } failure:^(NSError *error) {

                                            // 注册失败
                                         }];
                        
                    

登录

调用以下代码进行登录:


[[Y2WUsers getInstance].remote loginWithAccount:@"account"
                                       password:@"password"
                                        success:^(Y2WCurrentUser *currentUser) {

                                           // 登陆成功
                                           // currentUser为本次登陆用户的对象

                                      } failure:^(NSError *error) {

                                           // 登陆失败
                                      }];
                        

提醒

登录成功后可使用[Y2WUsers getInstance].getCurrentUser全局调用。

当前用户

登陆后可调用以下代码获取当前用户

                        
Y2WCurrentUser *currentUser = [Y2WUsers getInstance].getCurrentUser;
                        
                    

属性

当前用户对象包含以下属性:

                        
@property (nonatomic, strong) NSString *appKey;
@property (nonatomic, strong) NSString *secret;
@property (nonatomic, strong) NSString *token;
@property (nonatomic, strong) NSString *imToken;
@property (nonatomic, strong) Y2WContacts *contact
@property (nonatomic, strong) Y2WSessions *session
@property (nonatomic, strong) Y2WUserSessions *use
@property (nonatomic, strong) Y2WUserConversations
@property (nonatomic, strong) Y2WCurrentUserRemote
@property (nonatomic, strong) Y2WBridge *bridge;
                        
                    

远程方法

当前用户对象包含以下远程方法:

  • 同步获取用于连接y2wIM消息推送服务器的凭证
                                    
    [currentUser.remote syncIMTokenDidCompletion:^(NSError *error) {
    
        if (error) {
          // 同步失败
          return;
        }
    
        // 同步成功
    }];
                                    
                                

初始化

当前用户对象初始化时会做以下工作:

  1. 创建用户会话管理对象:userConversations
  2. 创建联系人管理对象:contacts
  3. 创建群组管理对象:userSessions
  4. 创建会话管理对象:sessions
  5. 使用数据库中的数据创建/填充以下对象:
    • 当前用户
    • 当前用户所有相关的用户列表(联系人,群成员包含的用户信息)
    • 用户会话列表
    • 联系人列表
    • 群组列表
    • 会话及会话成员列表

用户会话

用户会话由服务端管理,客户端不能主动创建,只需通过同步获取最新的用户会话信息,用户会话包含如下对象:

  • 用户会话管理对象UserConversations:包含同步时间戳,并负责管理用户会话列表
  • 用户会话对象UserConversation:包含用户会话信息

UserConversations

用户会话管理对象,管理列表,查询与同步等工作

属性

UserConversations包含以下属性:

                        
/**
 *  当前生命周期所维持的当前登录用户
 */
@property (nonatomic, weak) Y2WCurrentUser *user;

/**
 *  用户回话同步时间戳
 */
@property (nonatomic, strong) NSString *updatedAt;

/**
 *  远程方法封装对象
 */
@property (nonatomic, strong) Y2WUserConversationsRemote *remote;
                        
                    

方法

UserConversations包含以下本地方法

  • 添加和移除委托对象
                                    
    
    /**
     *  添加委托对象(此对象需要实现Y2WUserConversationsDelegate协议)
     *
     *  @param delegate 委托对象
     */
    [userConversations addDelegate:delegate];
    
    
    
    /**
     *  移除委托对象
     *
     *  @param delegate 委托对象
     */
    [userConversations removeDelegate:delegate];
    
                                    
                                
  • 获取用户会话
                                    
    /**
     *  通过目标ID和会话类型获取一个会话对象
     *
     *  @param targetId 会话目标ID(目标是个人为对方用户ID,否则为sessionId)
     *  @param type     会话类型(@"p2p",@"group")
     *  type == @"p2p":targetId = user.userId(对方);
     *  type == @"group":targetId = session.sessionId(会话ID)
     *  @return userConversation
     */
    Y2WUserConversation *userConversation = [userConversations getUserConversationWithTargetId:targetId
                                                                                          type:type];
                                    
                                
  • 获取用户会话列表
                                    
    /**
     * 获取用户会话列表
     * @returns @[userConversation1,userConversation2];
     */
    NSArray *userConversationArray = [userConversations getUserConversations];
                                    
                                

UserConversations包含以下远程方法

  • 同步用户会话
                                    
    /**
     * 激活用户会话同步
     * 同步完成后userConversations会通过协议方法通知实现了Y2WUserConversationsDelegate协议的对象
     */
    [userConversations.remote sync];
                                    
                                
  • 删除用户会话
                                    
    /**
     *  删除一个用户会话
     *  @param userConversation: 要删除的用户会话对象
     */
    [userConversations.remote deleteUserConversation:userConversation
                                             success:^{
    
                                                // 删除成功
    
                                           } failure:^(NSError *error) {
    
                                                // 删除失败
                                           }];
                                    
                                

UserConversation

用户会话对象,包含用户会话信息

属性

UserConversation包含以下属性:

                        
// 用户会话从属于用户会话管理对象,此处保存对其的引用
@property (nonatomic, weak) Y2WUserConversations *userConversations;

// 用户会话ID
@property (nonatomic, copy) NSString *userConversationId;

// 名字
@property (nonatomic, copy) NSString *name;

// 头像地址
@property (nonatomic, copy) NSString *avatarUrl;

// 会话类型@[@"p2p",@"group"]
@property (nonatomic, copy) NSString *type;

// 会话目标ID
@property (nonatomic, copy) NSString *targetId;

// 创建时间
@property (nonatomic, copy) NSString *createdAt;

// 更新时间
@property (nonatomic, copy) NSString *updatedAt;

// 未读消息数
@property (nonatomic, assign) NSUInteger unRead;

// 最新一条消息
@property (nonatomic, retain) Y2WMessage *lastMessage;

// 如果为YES, 表示服务器已删除了此实体,同步时请在客户端也删除
@property (nonatomic, assign) BOOL isDelete;

// 是否显示
@property (nonatomic, assign) BOOL visiable;

// 置顶标志
@property (nonatomic, assign) BOOL top;
                        
                    

方法

UserConversation包含以下方法

  • 获取名称
                                    
    /**
     *  获取此用户会话名
     */
    NSString *name = [userConversation getName];
                                    
                                
  • 获取头像
                                    
    /**
     *  获取此用户会话的头像地址
     */
    NSString *avatarUrl = [userConversation getAvatarUrl];
                                    
                                
  • 获取目标会话
                                    
    /**
     *  获取此用户会话的session
     */
    [userConversation getSessionDidCompletion:^(Y2WSession *session, NSError *error) {
    
        if (error) {
            // 获取失败
            return;
        }
    
        // 获取成功
    }];
                                    
                                

联系人

联系人包含如下对象:

  • 联系人管理对象Contacts:包含同步时间戳,并负责管理联系人列表
  • 联系人对象Contact:包含联系人信息

Contacts

联系人管理对象,管理列表,查询与同步等工作

属性

Contacts包含以下属性:

                        
// 联系人管理对象从属于某一用户,此处保存对用户的引用,通常为当前用户
@property (nonatomic,weak) Y2WCurrentUser *user;

// 同步时间戳,同步时使用此时间戳获取之后的数据
@property (nonatomic, copy) NSString *updatedAt;

// 远程方法封装对象
@property (nonatomic, strong) Y2WContactsRemote *remote;
                        
                    

方法

Contacts包含以下本地方法

  • 添加和移除委托对象
                                    
    /**
     *  添加委托对象(此对象需要实现Y2WContactsDelegate协议)
     *
     *  @param delegate 委托对象
     */
    [contacts addDelegate:delegate];
    
    
    
    /**
     *  移除委托对象
     *
     *  @param delegate 委托对象
     */
    [contacts removeDelegate:delegate];
                                    
                                
  • 获取联系人
                                    
    /**
     * 获取联系人
     * @param userId:用户id
     * @returns contact
     */
    Y2WContact *contact = [contacts getContactWithUID:userId];
                                    
                                
  • 获取联系人列表
                                    
    /**
     * 获取联系人列表
     * @returns @[contact1,contact2]
     */
    NSArray *contactArray = [contacts getContacts];
                                    
                                

Contacts包含以下远程方法

  • 同步联系人
                                    
    /**
     * 激活用户会话同步
     * 同步完成后contacts会通过协议方法通知实现了Y2WContactsDelegate协议的对象
     */
    [contacts.remote sync];
                                    
                                
  • 添加联系人
                                    
    // 根据名字和ID创建一个联系人对象
    Y2WContact *contact = [[Y2WContact alloc] init];
    contact.userId = userId;
    contact.name = name;
    
    /**
     * 添加联系人
     * @param contact: 联系人对象
     */
    [contacts.remote addContact:contact success:^{
    
        // 添加成功
    
    } failure:^(NSError *error) {
    
        // 添加失败
    }];
                                    
                                
  • 删除联系人
                                    
    /**
     * 删除联系人
     * @param contact: 联系人对象
     */
    [contacts.remote deleteContact:contact success:^{
    
        // 删除成功
    
    } failure:^(NSError *error) {
    
        // 删除失败
    }];
                                    
                                

提醒

添加或删除联系人后使用同步方法更新联系人

Contact

联系人对象

属性

Contact包含以下属性:

                        
/**
 *  联系人从属于联系人管理对象,此处保存对其的引用
 */
@property (nonatomic, weak) Y2WContacts *contacts;

/**
 *  联系人ID
 */
@property (nonatomic, copy) NSString *contactId;

/**
 *  联系人的用户ID
 */
@property (nonatomic, copy) NSString *userId;

/**
 *  联系人名字
 */
@property (nonatomic, copy) NSString *name;

/**
 *  联系人用户姓名的拼音(格式为每个字的拼音为一个元素组成的数)
 *  示例:
 *     姓名:张三
 *     拼音:@[@"zhang",@"san"];
 */
@property (nonatomic, strong) NSArray *pinyin;

/**
 *  当前登录用户对联系人的备注
 */
@property (nonatomic, copy) NSString *title;

/**
 *  当前登录用户对联系人的备注拼音
 */
@property (nonatomic, copy) NSString *titlePinyin;

/**
 *
 */
@property (nonatomic, copy) NSString *remark;

/**
 *  联系人创建时间
 */
@property (nonatomic, copy) NSString *createdAt;

/**
 *  联系人更新时间
 */
@property (nonatomic, copy) NSString *updatedAt;

/**
 *  联系人头像URl
 */
@property (nonatomic, copy) NSString *avatarUrl;

/**
 *  如果为YES, 表示服务器已删除了此实体,同步时请在客户端也删除
 */
@property (nonatomic, assign) BOOL isDelete;

/**
 *  联系人的本身用户对象
 */
@property (nonatomic, strong) Y2WUser *user;
                        
                    

方法

Contact包含以下方法

  • 获取用户会话
                                    
    /**
     *  获取此联系人的用户会话
     */
    Y2WUserConversation *userConversation = [contact getUserConversation];
                                    
                                
  • 获取session
                                    
    /**
     *  获取当前用户与此联系人的session对象
     */
    [contact getSessionDidCompletion:^(Y2WSession *session, NSError *error) {
    
        if (error) {
            // 获取失败
            return;
        }
    
        // 获取成功
    }];
                                    
                                

群组

群组在项目中定义为"收藏到群组列表的多人会话",群组包含如下对象:

  • 群组管理对象UserSessions:包含同步时间戳,并负责管理群组列表
  • 群组对象UserSession:包含群组信息

UserSessions

群组管理对象,管理列表,查询与同步等工作

属性

UserSessions包含以下属性:

                        
/**
 *  群组管理对象从属于某一用户,此处保存对用户的引用,通常为当前用户
 */
@property (nonatomic, weak) Y2WCurrentUser *user;

/**
 *  远程方法封装对象
 */
@property (nonatomic, strong) Y2WUserSessionsRemote *remote;

/**
 *  同步时间戳,同步时使用此时间戳获取之后的数据
 */
@property (nonatomic, copy) NSString *updatedAt;
                        
                    

方法

UserSessions包含以下本地方法

  • 初始化
                                    
    /**
     *  创建一个用户群组管理对象,初始化并添加依赖
     */
    Y2WUserSessions *userSessions = [[Y2WUserSessions alloc] initWithCurrentUser:currentUser];
                                    
                                
  • 添加和移除委托对象
                                    
    /**
     *  添加委托对象(此对象需要实现Y2WUserSessionsDelegate协议)
     *
     *  @param delegate 委托对象
     */
    [userSessions addDelegate:delegate];
    
    
    
    /**
     *  移除委托对象
     *
     *  @param delegate 委托对象
     */
    [userSessions removeDelegate:delegate];
                                    
                                
  • 获取群组列表
                                    
    /**
     *  获取群组列表
     *
     *  @return @[userSession1,userSession2];
     */
    NSArray *userSessionArray = [userSessions getUserSessions];
                                    
                                

UserSessions包含以下远程方法

  • 同步群组
                                    
    /**
     * 激活用户会话同步
     * 同步完成后userSessions会通过协议方法通知实现了Y2WUserSessionsDelegate协议的对象
     */
    [userSessions.remote sync];
                                    
                                
  • 收藏群组
                                    
                                        /**
                                        * 收藏群组
                                        * @param sessionId:会话Id
                                        * @param name:群组名称
                                        * @param avatarUrl:群组头像
                                        * @param cb
                                        */
                                        userSessions.remote.add(sessionId, name, avatarUrl, function(err){
                                        if(err){
                                        alert("收藏群组失败:" + err);
                                        return;
                                        }
                                        alert("收藏群组成功");
                                        })
                                    
                                
  • 取消收藏群组
                                    
    /**
     *  取消收藏群组
     *
     * @param userSession: 要移除的群组对象
     */
    [userSessions.remote deleteUserSession:userSession success:^{
    
        // 删除成功
    
    } failure:^(NSError *error) {
    
        // 删除失败
    }];
                                    
                                

UserSession

群组对象,包含群组信息

属性

UserSession包含以下属性:

                        
/**
 *  会话从属于会话管理对象,此处保存对其的引用
 */
@property (nonatomic, weak) Y2WUserSessions *userSessions;

/**
 *  群组ID
 */
@property (nonatomic, copy) NSString *userSessionId;

/**
 *  会话ID
 */
@property (nonatomic, copy) NSString *sessionId;

/**
 *  群组名
 */
@property (nonatomic, copy) NSString *name;

/**
 *  头像地址
 */
@property (nonatomic, copy) NSString *avatarUrl;

/**
 *  会话创建时间
 */
@property (nonatomic, copy) NSString *createdAt;

/**
 *  会话更新时间
 */
@property (nonatomic, copy) NSString *updatedAt;

/**
 *  删除标志
 */
@property (nonatomic, assign) BOOL isDelete;
                        
                    

方法

UserSession包含以下本地方法

  • 获取用户会话
                                    
    /**
     *  获取此用户群组的用户会话
     */
    Y2WUserConversation *userConversation = [userSession getUserConversation];
                                    
                                
  • 获取session
                                    
    /**
     *  获取此用户群组的session对象
     */
    [userSession getSessionDidCompletion:^(Y2WSession *session, NSError *error) {
    
        if (error) {
            // 获取失败
            return;
        }
    
        // 获取成功
    }];
                                    
                                

Session

Session:会话

  • 会话管理对象Sessions:负责管理会话集合
  • 会话对象Session:包含会话信息,并负责管理该会话的成员与消息

Sessions

会话管理对象,管理会话集合

属性

Sessions包含以下属性:

                        
/**
 *  群组管理对象从属于某一用户,此处保存对用户的引用,通常为当前用户
 */
@property (nonatomic, weak)Y2WCurrentUser *user;

/**
 *  远程方法封装对象
 */
@property (nonatomic, retain) Y2WSessionsRemote *remote;
                        
                    

方法

获取会话

                        
/**
 * 获取会话
 * @param targetId 会话目标ID
 * type: @"p2p",targetId=user.userId(对方用户);
 * type: @"group",targetId=session.sessionId(会话ID)
 * @param type @[@"p2p",@"group"] 会话场景类型
 */
[sessions getSessionWithTargetId:targetId
                            type:type
                         success:^(Y2WSession *session) {

                            // 获取成功,返回session对象

                       } failure:^(NSError *error) {

                            // 获取失败
                       }];
                        
                    

重要

  1. 此方法先在本地搜索,如果本地不存在将去服务器获取,此方法必定会返回session

Sessions包含以下远程方法

  • 添加会话
                                    
    /**
     * 添加会话
     * @param type:@[@"p2p",@"group"]:会话场景类型
     * @param name:名称
     * @param secureType:@[@"public",@"private"]:安全类型,通常使用private
     * @param avatarUrl:头像地址
     */
    [sessions.remote addWithName:name
                            type:type
                      secureType:secureType
                       avatarUrl:avatarUrl
                         success:^(Y2WSession *session) {
    
                            // 创建成功,返回session对象
    
                       } failure:^(NSError *error) {
    
                            // 创建失败
                       }];
                                    
                                

Session

会话对象,包含会话信息,并负责管理该会话的成员与消息

属性

Session包含以下属性:

                        
/**
 *  会话从属于会话管理对象,此处保存对其的引用
 */
@property (nonatomic, weak) Y2WSessions *sessions;

/**
 *  用于本地查找
 */
@property (nonatomic, copy) NSString *targetID;

/**
 *  会话唯一标识码
 */
@property (nonatomic, copy) NSString *sessionId;

/**
 *  会话名称
 */
@property (nonatomic, copy) NSString *name;

/**
 *  会话类型
 */
@property (nonatomic, copy) NSString *type;

/**
 *  会话的头像地址
 */
@property (nonatomic, copy) NSString *avatarUrl;

/**
 *  会话中会话成员创建时间
 */
@property (nonatomic, copy) NSString *createMTS;

/**
 *  会话中会话成员更新时间
 */
@property (nonatomic, copy) NSString *updateMTS;

/**
 *  会话创建时间
 */
@property (nonatomic, copy) NSString *createdAt;

/**
 *  会话更新时间
 */
@property (nonatomic, copy) NSString *updatedAt;

/**
 *  消息管理对象
 */
@property (nonatomic, strong) Y2WMessages *messages;

/**
 *  会话成员管理对象
 */
@property (nonatomic, strong) Y2WSessionMembers *members;
                        
                    

SessionMember

SessionMember:会话成员

  • 会话成员管理对象SessionMembers:负责管理会话成员同步,增删等操作
  • 会话成员对象SessionMember:包含会话成员信息

SessionMembers

会话成员管理对象,负责管理会话成员同步,增删改查等操作

属性

SessionMembers包含以下属性:

                        
/**
 *  会话成员管理对象从属于某一会话,此处保存对会话的引用
 */
@property (nonatomic, weak) Y2WSession *session;

/**
 *  远程方法封装对象
 */
@property (nonatomic, strong) Y2WSessionMembersRemote *remote;

/**
 *  会话成员创建时间,用于推送消息
 */
@property (nonatomic, strong) NSString *createdAt;

/**
 *  同步时间戳,同步时使用此时间戳获取之后的数据
 */
@property (nonatomic, strong) NSString *updatedAt;
                        
                    

方法

SessionMembers包含以下本地方法

  • 获取会话成员
                                    
    /**
     * 获取会话成员
     * @param userId:用户ID
     * @returns sessionMember
     */
    Y2WSessionMember *sessionMember = [sessionMembers getMemberWithUserId:userId];
                                    
                                
  • 获取会话成员列表
                                    
    /**
     * 获取会话成员列表
     * @returns @[sessionMember1,sessionMember2];
     */
    NSArray *sessionMemberArray = [sessionMembers getMembers];
                                    
                                

SessionMembers包含以下远程方法

  • 同步会话成员
                                    
    /**
     * 激活用户会话同步
     * 同步完成后sessionMembers会通过协议方法通知实现了Y2WSessionMembersDelegate协议的对象
     */
    [sessionMembers.remote sync];
                                    
                                
  • 添加会话成员
                                    
    /**
     * 构建成员对象
     * @param userId:用户id
     * @param name:用户名称
     * @param role:会话成员角色,master:群主;admin:管理员;user:一般成员
     * @param avatarUrl:头像地址
     * @param status:用户状态,active:有效;inactive:封禁
     */
    Y2WSessionMember *sessionMember = [[Y2WSessionMember alloc] init];
    sessionMember.name = name;
    sessionMember.userId = userId;
    sessionMember.avatarUrl = avatarUrl;
    sessionMember.role = role;
    sessionMember.status = status;
    
    
    /**
     * 添加会话成员
     */
    [sessionMembers.remote addSessionMember:sessionMember success:^{
    
        // 添加成功
    
    } failure:^(NSError *error) {
    
        // 添加失败
    }];
                                    
                                
  • 删除会话成员
                                    
    /**
     * 删除会话成员
     */
    [sessionMembers.remote deleteSessionMember:sessionMember success:^{
    
        // 删除成功
    
    } failure:^(NSError *error) {
    
        // 删除失败
    }];
                                    
                                

SessionMember

会话成员对象,包含会话成员信息

属性

SessionMember包含以下属性:

                        
/**
 *  会话成员从属于会话成员管理对象,此处保存对其的引用
 */
@property (nonatomic, weak) Y2WSessionMembers *sessionMembers;

/**
 *  会话成员唯一标识码
 */
@property (nonatomic, copy) NSString *sessionMemberId;

/**
 *  用户唯一标识码
 */
@property (nonatomic, copy) NSString *userId;

/**
 *  会话成员名称
 */
@property (nonatomic, copy) NSString *name;

/**
 *  成员头像
 */
@property (nonatomic, copy) NSString *avatarUrl;

/**
 *  联系人用户姓名的拼音(格式为每个字的拼音为一个元素组成的数)
 *  示例:
 *     姓名:张三
 *     拼音:@[@"zhang",@"san"];
 */
@property (nonatomic, strong) NSArray *pinyin;

/**
 *  创建时间
 */
@property (nonatomic, copy) NSString *createdAt;

/**
 *  修改时间
 */
@property (nonatomic, copy) NSString *updatedAt;

/**
 *  用户角色,"master", "admin", "user"
 */
@property (nonatomic, copy) NSString *role;

/**
 *  用户状态,有效(active),封禁(inactive)
 */
@property (nonatomic, copy) NSString *status;

/**
 *  如果为YES, 表示服务器已删除了此实体,同步时请在客户端也删除
 */
@property (nonatomic, assign) BOOL isDelete;

/**
 *  获取会话成员的用户信息
 */
@property (nonatomic, strong) Y2WUser *user;
                        
                    

消息

消息包含如下对象:

  • 消息管理对象Messages:包含同步时间戳,负责管理消息列表
  • 消息对象Message:包含消息信息

Messages

消息管理对象,包含同步时间戳,负责管理消息列表

属性

Messages包含以下属性:

                        
/**
 *  消息管理对象从属于某一会话,此处保存对会话的引用
 */
@property (nonatomic, weak) Y2WSession *session;

/**
 *  远程方法封装对象
 */
@property (nonatomic, retain) Y2WMessagesRemote *remote;

/**
 *  同步时间戳,同步时使用此时间戳获取之后的数据
 */
@property (nonatomic, copy) NSString *updateAt;

/**
 *  消息数量
 */
@property (nonatomic, assign, readonly) NSUInteger count;
                        
                    

方法

Messages包含以下本地方法

  • 添加和移除委托对象
                                    
    /**
     *  添加委托对象(此对象需要实现Y2WMessagesDelegate协议)
     *
     *  @param delegate 委托对象
     */
    [messages addDelegate:delegate];
    
    
    
    /**
     *  移除委托对象
     *
     *  @param delegate 委托对象
     */
    [messages removeDelegate:delegate];
                                    
                                
  • 发送消息
                                    
    /**
     * 发送消息
     */
    [messages sendMessage:message];
    
    
    /**
     * 重发消息
     */
    [messages resendMessage:message];
                                    
                                

Messages包含以下远程方法

  • 保存消息
                                    
    /**
     *  保存一条消息到session
     *
     *  @param message 要保存的消息对象
     */
    [messages.remote storeMessages:message success:^(Y2WMessage *message) {
    
        // 保存成功,返回保存的消息
    
    } failure:^(NSError *error) {
    
        // 保存失败
    }];
                                    
                                
  • 同步消息
                                    
    /**
     * 激活用户会话同步
     * 同步完成后messages会通过协议方法通知实现了Y2WMessagesDelegate协议的对象
     */
    [messages.remote sync];
                                    
                                
  • 获取历史消息
                                    
    /**
     *  获取历史消息
     */
    [messages.remote getLastMessageDidCompletionBlock:^(NSArray *messageList) {
    
        // 获取历史消息成功,返回消息数组
    
    } failure:^(NSError *error) {
    
        // 获取历史消息失败
    }];
                                    
                                

    提醒

    方法待定

Message

消息对象,包含消息信息

属性

Message包含以下属性:

                        
/**
 *  消息对象从属于消息管理对象,此处保存对其的引用
 */
@property (nonatomic, weak) Y2WMessages *messages;

/**
 *  消息内容
 */
@property (nonatomic, retain) NSDictionary *content;

/**
 *  消息文字内容
 */
@property (nonatomic, copy) NSString *text;

/**
 *  会话的唯一标识符
 */
@property (nonatomic, copy) NSString *sessionId;

/**
 *  消息唯一的标示码
 */
@property (nonatomic, copy) NSString *messageId;

/**
 *  消息的发送者
 */
@property (nonatomic, copy) NSString *sender;

/**
 *  消息类型["text"|"image"|"video"|"audio"|"file"]
 */
@property (nonatomic, copy) NSString *type;

/**
 *  消息状态["storing"|"stored"|"storefailed"]
 */
@property (nonatomic, copy) NSString *status;

/**
 *  消息创建时间
 */
@property (nonatomic, copy) NSString *createdAt;

/**
 *  消息更新时间
 */
@property (nonatomic, copy) NSString *updatedAt;

/**
 *  删除标志
 */
@property (nonatomic, assign) BOOL isDelete;
                        
                    

y2wIM推送服务

Y2WIM推送服务

  • SDK为核心的消息同步协议实现,完成与服务器之间的信息交换。
  • Y2WIMSDK核心类IMCient:SDK是基于核心协议实现的完整的IM功能,实现了不同类型消息的收发,会话管理,群组,好友等功能。

IMClient

获取yun2winIMSDK的核心类

通过此方法,获取yun2winIMSDK,访问对象中的属性和方法。

                     
/**
 *  获取yun2winIMSDK的核心类
 *
 *  @return 获取yun2winIMSDK
 */
+ (instancetype)shareY2WIMClient;
                     
                 

初始化yun2winIMSDK

初始化yun2winIMSDK,在初始化SDK所有功能之前,必须先初始化SDK.

                     
/**
 *  初始化TOKEN和UID
 *
 *  @param token 从平台获取token
 *  @param uid 从平台获取appkey
 */
- (void)registerWithToken:(NSString *)token UID:(NSString *)uid;
                     
                 

与yun2win服务器建立连接

在App整个生命周期,您只需要调用一次此方法与yun2win服务器建立连接。 之后无论是网络出现异常或者App有前后台的切换等,SDK都会负责自动重连。

                     
/**
 *  与yun2win服务器建立连接
 */
- (void)connect;
                     
                 

与yun2win服务器断开连接

因为SDK在前后台切换或者网络出现异常都会自动重连,会保证连接的可靠性。 所以除非您的App逻辑需要登出,否则一般不需要调用此方法进行手动断开。

                     
/**
 *  与yun2win服务器断开连接
 */
- (void)disconnect;
                     
                 

向yun2win服务器推送消息

向yun2win服务器推送消息.

IMSession:推送目标

  • 通过IMSessionProtocol协议建立IMSession
  • 推送消息时,imSession只有两个属性,id和mts
  • id表示将消息推送到哪个会话
  • mts(membersTimeStamp)是会话成员时间戳,会话成员变更时,此时间戳会更新,当发送消息时,推送服务器根据mts判断推送服务器保存的成员与业务服务器会话成员是否一致

IMMessage:推送内容

  • 通过IMMessageProtocol协议建立IMMessage
  • 为保证业务数据的安全性,yun2win推送服务默认只推送同步通知,不推送任何实质内容
  • message也可由用户自定义推送任何信息
                     
/**
 *  推送消息
 *
 *  @param session 对象IMSession
 *  @param message 推送消息体
 */
- (void)sendMessageWithSession:(id)session Message:(id)message;                     
                 

更新会话

更新会话成员,保存推送消息到位。

  • 推送服务器不保存任何业务数据,不包含会话成员的个人信息,但必须同步业务服务器中会话成员的id,以便推送到位
  • 更新会话时,imSession需要额外的members属性,存放多个会话成员信息
  • 更新会话操作只有在以下两种情况下调用
    1. 推送服务器不存在此会话,此时需要将当前会话所有成员更新到推送服务器
    2. 推送服务器mts过期,此时推送服务器将返回服务端mts,客户端需要将此时间之后的成员变更(新增/删除)更新到推送服务器
                     
/**
 *  推送更新会话消息
 *
 *  @param session 通过IMSessionProtocol协议建立IMSession
 *  @param message 通过IMMessageProtocol协议建立会话成员消息体
 */
- (void)updateSessionWithSession:(id)session Message:(id)message;
                     
                 

StatusDefine

各类状态码定义

网络连接状态码

                 
/**
 *  网络连接状态码
 */
typedef NS_ENUM(NSInteger,ConnectionStatus) {
    /**
     *  正在连接
     */
    connecting          = 0,
    /**
     *  已连接
     */
    connected           = 1,
    /**
     *  重连
     */
    reconnecting        = 2,
    /**
     *  网络断开
     */
    networkDisconnected = 3,
    /**
     *  断开连接
     */
    disconnected        = 100
};
                 
             

消息推送返回码

                    
/**
 *  消息推送返回码
 */
typedef NS_ENUM(NSInteger,ConnectionReturnCode) {
     /**
      *  协议错误
      */
     unacceptableProtocolVersion = 3,
     /**
      *  用户ID无效
      */
     uidIsInvalid                = 4,
     /**
      *  imToken无效
      */
     tokenIsInvalid              = 5,
     /**
      *  imToken过期
      */
     tokenHasExpired             = 6,
     /**
      *  appkey无效
      */
     appKeyIsInvalid             = 7,
     /**
      *  被踢出,同类型设备重复登录时,之前设备收到提出信息
      */
     kicked                      = 10,
     /**
      *  服务器不可达
      */
     serverUnavailable           = 99,
     /**
      *  服务器内部错误
      */
     serverInternalError         = 100
};

                    
                

发送消息的回执

                     
/**
 *  发送消息的回执
 */
typedef NS_ENUM(NSInteger,SendReturnCode) {
      /**
       *  推送成功
       */
      success                      = 20,
      /**
       *  推送超时
       */
      timeout_sendMessage          = 21,
      /**
       *  推送命令无效
       */
      cmdIsInvalid                 = 22,
      /**
       *  会话无效
       */
      sessionIsInvalid             = 23,
      /**
       *  会话ID无效
       */
      sessionIdIsInvalid           = 24,
      /**
       *  会话成员时间戳无效
       */
      sessionMTSIsInvalid          = 25,
      /**
       *  推送服务器不存在此会话
       */
      sessionOnServerIsNotExist    = 26,
      /**
       *  客户端会话成员时间戳过期
       */
      sessionMTSOnClientHasExpired = 27,
      /**
       *  推送服务器会员时间戳过期
       */
      sessionMTSOnServerHasExpired = 28,
      /**
       *  推送服务器会话成员无效
       */
      sessionMembersIsInvalid      = 29,
      /**
       *  推送内容是无效的JSON格式
       */
      invalidFormatOfJSONContent   = 30,
      /**
       *  会话成员不存在
       */
      sessionMembersIsNull         = 31
};

                     
                 

y2wIM用户使用手册

用户使用手册

自定义消息类型

以下是使用图片消息举例说明如何自定义消息类型,实际开发中可参考以下方式灵活使用

创建cell

在项目目录的Class/Conversation/BubbleView目录里面新建一个cell

创建model

在项目Model目录里面创建对应的数据模型

关联cell

在MessageModel.m 文件里 设置消息类型所关联cell

                        
- (NSString *)bubbleViewClassName {
    if ([self.message.type isEqualToString:@"image"]) return @"MessageImageBubbleView";
    return nil;
}
                        
                    

设置cell类型

在 MessageCellConfig.m文件里面设置cell类型

                        
+ (Class)cellClassWithMessageBase:(MessageBase *)base {
    if ([base.type isEqualToString:@"text"] ||
        [base.type isEqualToString:@"image"]) {

        return [MessageCell class];
    }
    return [MessageNotiCell class];
}
                        
                    

设置cell尺寸

在 MessageBase.m 文件里面 设置cell的尺寸

                        
- (CGFloat)calculateCellHeight {
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat timeStampHeight = MessageFrame.timeStampHeight;
    CGFloat avatarMargin = MessageFrame.avatarMargin;
    CGFloat avatarSize = MessageFrame.avatarSize;
    CGFloat avatar_content_margin = 3;
    CGFloat contentMargin = 50;

    CGRect timeStampFrame = CGRectMake(0, 0, width, timeStampHeight * self.showDate);
    CGRect avatarFrame = CGRectMake(0, timeStampFrame.size.height + 10, avatarSize, avatarSize);
    CGSize contentSize = CGSizeZero;

    if ([self.type isEqualToString:@"image"]){
        NSDictionary *contentDict = self.content.parseJsonString;
        CGFloat width = [contentDict[@"width"] floatValue] ?: 150;
        CGFloat height = [contentDict[@"height"] floatValue] ?: 80;
        CGSize size = CGSizeMake(width, height);
        contentSize = AVMakeRectWithAspectRatioInsideRect(size,CGRectMake(0, 0, 200, 200)).size;
    }

    return avatarFrame.origin.y + contentSize.height + 20;
}
                        
                    

在 MessageModel.m 文件里 设置cell的尺寸

                        
- (void)calculateContent:(CGFloat)width {

    BOOL isMe = self.isMe;
    CGFloat avatar_content_margin = 3;
    CGFloat avatarMargin = self.cellConfig.avatarMargin;
    CGFloat contentMargin = 50;

    if (CGRectEqualToRect(_timeStampFrame, CGRectZero)) {

        _timeStampFrame = CGRectMake(0, 0, width, self.cellConfig.timeStampHeight * self.shouldShowTimeStamp);
    }


    if (CGRectEqualToRect(_avatarFrame, CGRectZero)) {

        _avatarFrame = CGRectMake(0, _timeStampFrame.size.height + 10, self.cellConfig.avatarSize, self.cellConfig.avatarSize);
        _avatarFrame.origin.x = isMe ? width - avatarMargin - self.cellConfig.avatarSize : avatarMargin;
    }


    if (CGRectEqualToRect(_contentFrame, CGRectZero)) {

        CGSize contentSize = CGSizeZero;

        if ([self.message.type isEqualToString:@"image"]) {
            NSDictionary *contentDict = self.message.content;
            CGFloat width = [contentDict[@"width"] floatValue] ?: 150;
            CGFloat height = [contentDict[@"height"] floatValue] ?: 80;
            CGSize size = CGSizeMake(width, height);
            contentSize = AVMakeRectWithAspectRatioInsideRect(size,CGRectMake(0, 0, 200, 200)).size;
        }

        _contentFrame = CGRectMake(isMe ? _avatarFrame.origin.x - contentSize.width - avatar_content_margin: _avatarFrame.origin.x + _avatarFrame.size.width + avatar_content_margin,
                                   _avatarFrame.origin.y,
                                   contentSize.width,
                                   contentSize.height);
    }
}
                        
                    

初始化model

在 Y2WBaseMessage.m 文件里 根据消息初始化对应的数据

                        
+ (instancetype)createMessageWithDict:(NSDictionary *)dict
{
    if ([dict[@"type"] isEqualToString:@"image"])
    {
        return [[Y2WImageMessage alloc]initWithValue:dict];
    }

    return [[Y2WSystemMessage alloc] initWithValue:dict];
}
                        
                    

创建消息

在 Y2WMessages.m 文件里创建一个 图片消息

                        
- (Y2WImageMessage *)messageWithImage:(UIImage *)image
{
    Y2WImageMessage *message = [[Y2WImageMessage alloc]init];
    message.sessionId = self.session.ID;
    message.sender = self.session.sessions.user.ID;
    message.type = @"image";
    message.status = @"storing";
    message.imagePath = [image writeJPGToQuality:0.5];
    message.thumImagePath = [image writeJPGToQuality:0.1];
    message.ID = [NSUUID UUID].UUIDString;
    message.content = @{@"width":[NSString stringWithFormat:@"%lf",image.size.width*0.1],
                        @"height":[NSString stringWithFormat:@"%lf",image.size.height*0.1]};
    return message;
}
                        
                    

发送消息

通过session发送消息

                        
Y2WImageMessage *message = [self.session.messages messageWithImage:image];
[self.session.messages sendMessage:message];
                        
                    

存取数据库

在 MessageBase.m 文件里 设置数据库存取消息类型

                        
- (BOOL)calculateNeedShowDate {
    if (!self.createdAt) {
        return NO;
    }
    if ([self.status isEqualToString:@"storing"]) {
        return NO;
    }
    if ([self.type isEqualToString:@"image"]) {
        MessageBase *lastBase = [[MessageBase objectsInRealm:self.realm where:@"sessionId == %@ AND createdAt < %@", self.sessionId, self.createdAt] sortedResultsUsingProperty:@"createdAt" ascending:YES].lastObject;

        if ([lastBase.ID isEqualToString:self.ID]) {
            return NO;
        }
        return [lastBase.createdAt minutesEarlierThan:self.createdAt] > 3;
    }
    return NO;
}