在维护Bmob消息推送SDK的时候,有很多开发者会问到如何给某类用户进行推送,例如,在教学类的应用中你需要对60分以下的同学进行推送提醒,鼓励他们努力学习。下边我就详细阐述一下:
_User表结构
_Installation表结构
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