如何修改野火应用服务生成用户名的策略
在野火IM Demo上,看到用户名是电话号码,容易泄漏隐私,因此demo上就把用户名隐藏了。有客户问如何按照自己的规则生成用户名,如何搜索仅仅匹配用户名。这里将以这个客户为例,讲一下如何对野火IM进行定制。首先看一下客户原始需求:
用户注册生成uid uid从1开始 点击用户头像时会显示手机号码 将手机号码换成现uid “我”页面 昵称下面显示uid 只允许使用uid查找添加好友 uid在客户端显示ID:1
1. 1. 野火IM的几个相关概念:
为了避免混淆,首先需要说明如下几个概念
用户ID(userId) 每个用户都在系统中有唯一一个ID,这个ID是这个用户的标示,不会重复,也不可能进行变更,在IM系统中所有的事务处理都是依据这个ID进行的。这个ID跟客户需要里的“用户ID”不是一个概念。
用户名(userName) 用户ID具有不可读性,这就需要一个可读的唯一的用户标示,这个就是用户名,这个名字在系统中具有唯一性,用户可以更改用户名。这个用户名就是客户提到的”用户ID”。微信中对应的就是“微信号”,这个是可以更改的,但一个”微信号”只能对应一个用户。
昵称(displayName) 这个就是昵称了,可以随便改,可以重复。
电话号码(mobile) 电话号码本来是用户的一个普通属性,但由于具有唯一性,所以很多时候也作为用户标示,在野火IM的demo中把用户ID和mobile都默认为电话号码了。这个例子其中就需要改这里的逻辑。
综上所说,客户所说用户ID就是野火IM系统中的用户名,对应微信的“微信ID”。下面就说一下怎么处理吧。
2. 2. 修改野火IM App Server
野火App Server需要修改源码,请下载0.29-1
或更新的代码。在ServiceImpl
对象中,找到userNameGenerator
变量
@Autowired
private PhoneNumberUserNameGenerator userNameGenerator;
修改为
@Autowired
private OrderedIdUserNameGenerator userNameGenerator;
然后编译打包就修改完成了。
这个两个不同的用户名生成策略,旧的是直接使用电话号码作为用户名,新的是在数据库中插入数据获取自增id,使用自增id作为用户名。客户可以扩展更适合自己的生成策略
App Server默认使用的是h2数据库,适合于开发,上线要切换成mysql,切换方法在应用的配置文件中有说明。
3. 3. 更新野火IM服务
野火IM服务在0.29-1
版本对搜索用户进行了修改。搜索用户有个fuzzy
的参数,fuzzy
为1时,模糊搜索用户昵称精确搜索用户名和电话号码;为0是只精确搜索用户名和电话号码。
4. 4. 客户端搜索时,改为精确搜索
需要分别在安卓和iOS客户端进行修改。
安卓的修改在UserSearchModule
对象中,把第二个参数改成false
ChatManager.Instance().searchUser(keyword, true, new SearchUserCallback() {
@Override
public void onSuccess(List<UserInfo> infos) {
userInfos.addAll(infos);
countDownLatch.countDown();
}
@Override
public void onFail(int errorCode) {
countDownLatch.countDown();
}
});
iOS的修改在WFCUAddFriendViewController.m
文件中,把第二个参数改为NO
[[WFCCIMService sharedWFCIMService] searchUser:searchString
fuzzy:YES
success:^(NSArray<WFCCUserInfo *> *machedUsers) {
...
}
error:^(int errorCode) {
...
}];
5. 5. 显示自己的信息时显示用户名
同样需要分别在安卓和iOS客户端修改。
在安卓的main_fragment_me.xml
文件中,找到accountTextView
控件,把这个控件的属性android:visibility="gone"
这一行去掉。改成如下所示:
<TextView
android:id="@+id/accountTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:singleLine="true"
android:text="@string/my_chat_account"
android:textColor="@color/gray2"
android:textSize="13sp"
/>
<!-- android:visibility="gone" -->
<!-- />-->
在iOS的WFCMeTableViewCell.m
文件中,把下面隐藏userNameLabel
的语句注释掉
- (UILabel *)userName {
if (!_userName) {
_userName = [[UILabel alloc] initWithFrame:CGRectMake(72, 48, [UIScreen mainScreen].bounds.size.width - 64, 20)];
[_userName setFont:[UIFont systemFontOfSize:16]];
_userName.textColor = [UIColor grayColor];
// _userName.hidden = YES;
[self.contentView addSubview:_userName];
}
return _userName;
}
6. 6. 显示别人用户信息时,显示用户名
同样需要分别在安卓和iOS客户端修改。
在安卓的UserInfoFragment
对象中,把隐藏用户名的语句注释掉,如下面代码所示:
private void setUserInfo(UserInfo userInfo) {
Glide.with(this).load(userInfo.portrait).apply(new RequestOptions().placeholder(R.mipmap.avatar_def).centerCrop()).into(portraitImageView);
nameTextView.setText("野火ID" + userInfo.name);
// nameTextView.setVisibility(View.GONE); //注释掉这里
nickyNameTextView.setText(userViewModel.getUserDisplayName(userInfo));
if (ChatManager.Instance().isMyFriend(userInfo.uid)) {
mobileTextView.setText("电话:" + userInfo.mobile);
mobileTextView.setVisibility(View.VISIBLE);
}
}
在iOSWFCUProfileTableViewController.m
文件中,把下面这句话注释掉
self.userNameLabel.hidden = YES;
7. 7. 最后
这样修改完后,UI布局上还需要简单调整一下,UI的源码都在,如果想要加什么东西也可以很容易地办到。