在维护Bmob消息推送SDK的时候,有很多开发者会问到如何给某类用户进行推送,例如,在教学类的应用中你需要对60分以下的同学进行推送提醒,鼓励他们努力学习。下边我就详细阐述一下:
1、设计后端云数据库表结构
_User表结构
属性 | 类型 | 说明 |
---|---|---|
username | String | 用户名 |
password | String | 密码 |
score | Integer | 该用户的分数 |
role | Integer | 该用户的角色,0:老师,1:学生 |
_Installation表结构
属性 | 类型 | 说明 |
---|---|---|
installationId | String | 设备唯一标志,SDK自动生成 |
user | Pointer<_User> | 该设备当前登录用户 |
2、推送思路
在用户角色为老师的情况下,具有推送给其他客户端消息的功能,首先查询角色为学生的分数在60分以下的用户,在根据查询的结果作为推送的条件进行推送。(为了简单理解,学生的分数会在注册的时候自动随机生成,在实际项目中需要老师为学生打分。)
3、关键代码
3.1、登录以及注册成功之后修改_Installation表的user属性为当前用户
/**
* 修改设备表的用户信息:先查询设备表中的数据,再修改数据中用户信息
*
* @param user
*/
private void modifyInstallationUser(final User user) {
BmobQuery<Installation> bmobQuery = new BmobQuery<>();
final String id = BmobInstallationManager.getInstallationId();
bmobQuery.addWhereEqualTo("installationId", id);
bmobQuery.findObjectsObservable(Installation.class)
.subscribe(new Action1<List<Installation>>() {
@Override
public void call(List<Installation> installations) {
if (installations.size() > 0) {
Installation installation = installations.get(0);
installation.setUser(user);
installation.updateObservable()
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
toastI("更新设备用户信息成功!");
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
toastE("更新设备用户信息失败:" + throwable.getMessage());
}
});
} else {
toastE("后台不存在此设备Id的数据,请确认此设备Id是否正确!\n" + id);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
toastE("查询设备数据失败:" + throwable.getMessage());
}
});
}
3.2、退出登录成功后修改_Installation表的user属性为空
/**
* 修改设备表的用户信息:先查询设备表中的数据,再修改数据中用户信息
*/
private void modifyInstallationUser() {
BmobQuery<Installation> bmobQuery = new BmobQuery<>();
final String id = BmobInstallationManager.getInstallationId();
bmobQuery.addWhereEqualTo("installationId", id);
bmobQuery.findObjectsObservable(Installation.class)
.subscribe(new Action1<List<Installation>>() {
@Override
public void call(List<Installation> installations) {
if (installations.size() > 0) {
Installation installation = installations.get(0);
User user = new User();
installation.setUser(user);
user.setObjectId("");
installation.updateObservable()
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
toastI("更新设备用户信息成功!");
/**
* TODO 更新成功之后再退出
*/
BmobUser.logOut();
startActivity(new Intent(mContext, LoginActivity.class));
finish();
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
toastE("更新设备用户信息失败:" + throwable.getMessage());
}
});
} else {
toastE("后台不存在此设备Id的数据,请确认此设备Id是否正确!\n" + id);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
toastE("查询设备数据失败:" + throwable.getMessage());
}
});
}
3.3、在老师角色下向60分以下的学生用户进行推送
BmobQuery<User> bmobQueryUser = new BmobQuery<>();
bmobQueryUser.addWhereEqualTo("role",1);
bmobQueryUser.addWhereLessThan("score",60);
bmobQueryUser.findObjects(new FindListener<User>() {
@Override
public void done(List<User> list, BmobException e) {
if (e==null){
for (User user:list){
BmobPushManager bmobPushManager = new BmobPushManager();
BmobQuery<BmobInstallation> query = BmobInstallation.getQuery();
query.addWhereEqualTo("user", user);
bmobPushManager.setQuery(query);
bmobPushManager.pushMessage("努力加油", new PushListener() {
@Override
public void done(BmobException e) {
if (e == null) {
Logger.e("推送成功!");
} else {
Logger.e("异常:" + e.getMessage());
}
}
});
}
}else {
toastE(e.getMessage());
}
}
});
4、Demo下载地址
Demo下载地址:https://github.com/chaozhouzhang/Push2User
官方交流群:
Bmob IM/PUSH Android:182897507