android 中的 quickblox 推送通知集成

quickblox push notification integration in android

我正在我的应用程序中集成 quickblox。我已经成功地集成了聊天功能并且运行良好。但是推送通知功能不起作用。我已按照以下步骤整合推送通知。

  1. 在 Firebase 上创建一个项目。实现云消息并在主项目中集成googleJSON。

  2. 登录 quickblox 帐户在推送通知中添加 google 服务器密钥。

  3. 遵循 https://docs.quickblox.com/docs/android-push-notifications 文档,在添加 firebase cloude 消息后,我在 menifest 文件中添加以下内容。

    <meta-data android:name="com.quickblox.messages.TYPE" android:value="FCM" /> <meta-data android:name="com.quickblox.messages.SENDER_ID" android:value="@string/sender_id" /> <meta-data android:name="com.quickblox.messages.QB_ENVIRONMENT" android:value="DEVELOPMENT" />

并在清单中注册以下服务

`<service android:name="com.quickblox.messages.services.fcm.QBFcmPushListenerService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

<service android:name="com.quickblox.messages.services.fcm.QBFcmPushInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>`
  1. 我添加了自动推送通知并在 chatActivity 中的代码下方实现了它

`QBSettings.getInstance().setEnablePushNotification(false); // 默认为 true

        boolean isEnabled = QBSettings.getInstance().isEnablePushNotification();`
  1. 创建推送通知订阅

    QBSubscription 订阅 = 新 QBSubscription(QBNotificationChannel.GCM); subscription.setEnvironment(QBEnvironment.DEVELOPMENT); // 字符串 deviceId = ""; final TelephonyManager mTelephony = (TelephonyManager) BottomActivity.this.getSystemService( Context.TELEPHONY_SERVICE);

            deviceId = Settings.Secure.getString(BottomActivity.this.getContentResolver(),
                    Settings.Secure.ANDROID_ID);
         subscription.setDeviceUdid(deviceId);
         subscription.setRegistrationID(registrationID);
         subscription.setEnvironment(QBEnvironment.DEVELOPMENT);
         QBPushNotifications.createSubscription(subscription);
    
  2. 为推送通知注册接收者。

    LocalBroadcastManager.getInstance(this).registerReceiver(pushBroadcastReceiver, new IntentFilter(Consts.ACTION_NEW_FCM_EVENT));

  3. 发送推送消息。

    ` String outMessage = messageEditText.getText().toString().trim(); QBEvent qbEvent = new QBEvent(); qbEvent.setNotificationType(QBNotificationType.PUSH); qbEvent.setEnvironment(QBEnvironment.DEVELOPMENT);

                 qbEvent.setMessage(outMessage);
                 qbEvent.setPushType(QBPushType.GCM);
    
                 StringifyArrayList<Integer> userIds = new StringifyArrayList<>();
                 userIds.add(QBSessionManager.getInstance().getSessionParameters().getUserId());
    
                 userIds.add(qbChatDialog.getRecipientId());
                 Log.d(TAG, "My Id: " + qbChatDialog.getRecipientId());
                 qbEvent.setUserIds(userIds);
    
                 QBPushNotifications.createEvent(qbEvent).performAsync(new QBEntityCallback<QBEvent>() {
                     @Override
                     public void onSuccess(QBEvent qbEvent, Bundle bundle) {
    
                     }
    
                     @Override
                     public void onError(QBResponseException e) {
    
                         KeyboardUtils.hideKeyboard(messageEditText);
                         invalidateOptionsMenu();
                     }
                 });
    

    `

按照结果中的所有步骤操作后,我能够成功发送消息。我可以在 quickblox 管理面板中看到一条消息,它显示已发送的消息。订阅也被创建。但是我没有收到关于我的另一个 phone 的通知。但是当我尝试使用 firebase 云发送强制消息时,我能够收到在 firebase 上键入的消息。

任何人都可以指导我在这方面缺少什么吗?我是 quicblox 的新手。

您似乎已经可以收到推送,但是您的 BroadcastReceiver(从 QBFcmPushListenerService 扩展)没有做任何事情来向用户显示通知。请检查您是如何制作接收器的。我有一个例子给你:https://github.com/QuickBlox/quickblox-android-sdk/blob/master/sample-chat-java/app/src/main/java/com/quickblox/sample/chat/java/fcm/PushListenerService.java

请看一下这个功能:

public class PushListenerService extends QBFcmPushListenerService {
    private static final String TAG = PushListenerService.class.getSimpleName();
    private static final int NOTIFICATION_ID = 1;

    protected void showNotification(String message) {
        NotificationUtils.showNotification(App.getInstance(), SplashActivity.class,
                App.getInstance().getString(R.string.notification_title), message,
                R.drawable.ic_logo_vector, NOTIFICATION_ID);
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
    }

    @Override
    protected void sendPushMessage(Map data, String from, String message) {
        super.sendPushMessage(data, from, message);
        Log.v(TAG, "From: " + from);
        Log.v(TAG, "Message: " + message);
        if (ActivityLifecycle.getInstance().isBackground()) {
            showNotification(message);
        }
    }
}

还有回调“sendPushMessage”——它是关于接收推送消息的。这不是发送。这就像将它发送给用户:)

请关注:

if (ActivityLifecycle.getInstance().isBackground()) {
   showNotification(message);
}

这部分逻辑取决于应用程序行为。如果应用程序现在 运行 并且在前台 - 将不会显示通知。如果您删除此条件 - 将显示所有捕获的推送。

P.S。另一个建议是 - 系统禁用了您的应用程序显示通知的权限,如果上面的所有代码都已经实现,请检查这个。