關於消息推送,你能夠知道這個

如何給某類用戶進行推送呢?

在維護Bmob消息推送SDK的時候,有不少開發者會問到如何給某類用戶進行推送,例如,在教學類的應用中你須要對60分如下的同窗進行推送提醒,鼓勵他們努力學習。下邊我就詳細闡述一下:git

一、設計後端雲數據庫表結構

_User表結構github

屬性 類型 說明
username String 用戶名
password String 密碼
score Integer 該用戶的分數
role Integer 該用戶的角色,0:老師,1:學生

_Installation表結構數據庫

屬性 類型 說明
installationId String 設備惟一標誌,SDK自動生成
user Pointer<_User> 該設備當前登陸用戶

二、推送思路

在用戶角色爲老師的狀況下,具備推送給其餘客戶端消息的功能,首先查詢角色爲學生的分數在60分如下的用戶,在根據查詢的結果做爲推送的條件進行推送。(爲了簡單理解,學生的分數會在註冊的時候自動隨機生成,在實際項目中須要老師爲學生打分。)後端

三、關鍵代碼

3.一、登陸以及註冊成功以後修改_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.二、退出登陸成功後修改_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.三、在老師角色下向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());
        }

    }
});

四、Demo下載地址

Demo下載地址:https://github.com/chaozhouzh...ide

相關文章
相關標籤/搜索