如何修改野火应用服务生成用户名的策略

在野火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的源码都在,如果想要加什么东西也可以很容易地办到。

2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-10-31 11:49:14

results matching ""

    No results matching ""