融雲認爲,每一個設計良好且功能健全的 App 都應該能夠在本地獲取、緩存並更新用戶信息。所以,融雲不維護用戶基本信息(用戶 Id、暱稱、頭像)。此外,App 提供用戶信息也避免了由於緩存導致的用戶信息更新不及時,App 中不同界面上的用戶信息不統一(比如:一部分 App 從 App 服務器上獲取並顯示,一部分由融雲服務器獲取並顯示),能夠獲得最佳的用戶體驗。
融雲提供了兩種方式從 App 的數據源顯示用戶暱稱和頭像。
1、設置用戶信息提供者
/**
* 設置用戶信息的提供者,供 RongIM 調用獲取用戶名稱和頭像信息。
*
* @param userInfoProvider 用戶信息提供者。
* @param isCacheUserInfo 設置是否由 IMKit 來緩存用戶信息。<br>
* 如果 App 提供的 UserInfoProvider
* 每次都需要通過網絡請求用戶數據,而不是將用戶數據緩存到本地內存,會影響用戶信息的加載速度;<br>
* 此時最好將本參數設置爲 true,由 IMKit 將用戶信息緩存到本地內存中。
* @see UserInfoProvider
*/
RongIM.setUserInfoProvider(new RongIM.UserInfoProvider() {
@Override
public UserInfo getUserInfo(String userId) {
return findUserById(userId);//根據 userId 去你的用戶系統裏查詢對應的用戶信息返回給融雲 SDK。
}
}, true);
融雲不保存用戶的信息,所以 getUserInfo方法需要去 App 的服務器異步的獲取用戶信息,不能實時返回用戶信息。這個時候需要在成功獲取到用戶信息的異步回調中使用refreshUserInfoCache來刷新用戶的信息。
/**
* 刷新用戶緩存數據。
* @param userInfo 需要更新的用戶緩存數據。
*/
RongIM.getInstance().refreshUserInfoCache(new UserInfo(用戶id, 用戶name, Uri.parse(頭像地址)));
2、使用消息攜帶用戶信息
當 App 本身沒有用戶系統或者因爲某些原因不方便使用上述用戶信息提供者的時候,可以使用消息攜帶用戶信息來發送給消息接收方。
(1) 設置當前用戶信息
/**
* 設置當前用戶信息,
* @param userInfo 當前用戶信息
*/
RongIM.getInstance().setCurrentUserInfo(new UserInfo(用戶id, 用戶name, Uri.parse(頭像地址)));
(2) 設置消息體內攜帶用戶信息
/**
* 設置消息體內是否攜帶用戶信息。
* @param state 是否攜帶用戶信息,true 攜帶,false 不攜帶。
*/
RongIM.getInstance().setMessageAttachedUserInfo(true);
接收方在接收到消息後,SDK 會自動從消息中取出用戶信息,並顯示到 UI 上。
注意:這種方式不要和用戶信息提供者混用,使用這種方式跟 iOS 互通時,需要 iOS 端也在消息裏攜帶用戶信息,這樣才能在兩端都可以正常顯示暱稱和頭像。