I am working on Push notifications through Pinpoint using Firebase.
I am able to receive push notifications when the app is not in foreground. However I don't receive it when the app is open.
I looked at the PushListenerService code and it had something like this:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
Log.d(TAG, "Message: " + remoteMessage.getData());
final NotificationClient notificationClient= NofiticaiontProvider.getNotificationClient();
final NotificationDetails notificationDetails = NotificationDetails.builder()
.from(remoteMessage.getFrom())
.mapData(remoteMessage.getData())
.intentAction(NotificationClient.FCM_INTENT_ACTION)
.build();
NotificationClient.CampaignPushResult pushResult = notificationClient.handleCampaignPush(notificationDetails);
if (!NotificationClient.CampaignPushResult.NOT_HANDLED.equals(pushResult)) {
/**
The push message was due to a Pinpoint campaign.
If the app was in the background, a local notification was added
in the notification center. If the app was in the foreground, an
event was recorded indicating the app was in the foreground,
for the demo, we will broadcast the notification to let the main
activity display it in a dialog.
*/
if (NotificationClient.CampaignPushResult.APP_IN_FOREGROUND.equals(pushResult)) {
/* Create a message that will display the raw data of the campaign push in a dialog. */
final HashMap<String, String> dataMap = new HashMap<>(remoteMessage.getData());
broadcast(remoteMessage.getFrom(), dataMap);
}
return;
}
I thought of playing around the if statement (App in Foreground one)and that will give me proper results. But it turns out that the sdk has the logic inside to not to show notification if it is in foreground.
Here's a little snippet from the SDK
public final NotificationClient.CampaignPushResult handleCampaignPush(NotificationDetails notificationDetails) {
final String from = notificationDetails.getFrom();
final Bundle data = notificationDetails.getBundle();
final Class<?> targetClass = notificationDetails.getTargetClass();
String intentAction = notificationDetails.getIntentAction();
notificationChannelId = notificationDetails.getNotificationChannelId();
// Check if push data contains a Campaign Id
if (data == null || !data.containsKey(CAMPAIGN_ID_PUSH_KEY)) {
return NotificationClient.CampaignPushResult.NOT_HANDLED;
}
final boolean isAppInForeground = appUtil.isAppInForeground();
final String imageUrl = data.getString(CAMPAIGN_IMAGE_PUSH_KEY);
final String imageIconUrl = data.getString(CAMPAIGN_IMAGE_ICON_PUSH_KEY);
final String imageSmallIconUrl = data.getString(CAMPAIGN_IMAGE_SMALL_ICON_PUSH_KEY);
final Map<String, String> campaignAttributes = new HashMap<String, String>();
campaignAttributes.put(CAMPAIGN_ID_ATTRIBUTE_KEY, data.getString(CAMPAIGN_ID_PUSH_KEY));
campaignAttributes.put(CAMPAIGN_TREATMENT_ID_ATTRIBUTE_KEY, data.getString(CAMPAIGN_TREATMENT_ID_PUSH_KEY));
campaignAttributes.put(CAMPAIGN_ACTIVITY_ID_ATTRIBUTE_KEY, data.getString(CAMPAIGN_ACTIVITY_ID_PUSH_KEY));
this.pinpointContext.getAnalyticsClient().setCampaignAttributes(campaignAttributes);
log.info("Campaign Attributes are:" + campaignAttributes);
if (AWS_EVENT_TYPE_OPENED.equals(from)) {
return this.handleNotificationOpen(campaignAttributes, data);
}
// Create the push event.
String eventType = null;
if (isAppInForeground) {
eventType = AWS_EVENT_TYPE_RECEIVED_FOREGROUND;
} else {
eventType = AWS_EVENT_TYPE_RECEIVED_BACKGROUND;
}
Probably the eventType is the cause why notifications are not showing when the app is in foreground. Is there any alternate ways to bypass this? Other than extracting information and creating my own Notification?
I can't find any proper documentation for this. Can anyone help me out on this?
Everything just leads me to this document
There is no mystery - this is by design. Amazon SDK doesn't create corresponding notification when app is in foreground and your code in PushListenerService sends local broadcast instead.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.