0

My serser uses Java with SpringBoot and my client is an expo react native app which uses typescript. I am really blocked by this feature: I want to sens push notifications. I tried a lot of methods, but I didn't succeed.

I tried to use Google FCM API to send the push notifications, but I noticed that I need the REGISTRATION TOKENS and I can't get them on the BE side.

In the official documentation is described the method, but using Android: https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.

I have something like:

The service

@Service
public class FirebaseMessagingService {

    private static final String FIREBASE_SERVER_KEY = server key from firebase project from cloud messaging section;
    private static final String FIREBASE_API_URL = "https://fcm.googleapis.com/fcm/send";

    @Async
    public CompletableFuture<String> send(HttpEntity<String> entity) {

        RestTemplate restTemplate = new RestTemplate();

        ArrayList<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(new HeaderRequestInterceptor("Authorization", "key=" + FIREBASE_SERVER_KEY));
        interceptors.add(new HeaderRequestInterceptor("Content-Type", "application/json"));
        restTemplate.setInterceptors(interceptors);

        String firebaseResponse = restTemplate.postForObject(FIREBASE_API_URL, entity, String.class);

        return CompletableFuture.completedFuture(firebaseResponse);
    }
}

And

The Controller

@Autowired
    FirebaseMessagingService firebaseMessagingService;

    @RequestMapping(value = "/send", method = RequestMethod.POST, produces = "application/json")
    public ResponseEntity<String> send(){

        JSONObject body = new JSONObject();
        body.put("to", "GM4nGHeift2zv4IDm9O75");
        body.put("priority", "high");

        JSONObject notification = new JSONObject();
        notification.put("title", "JSA Notification");
        notification.put("body", "Happy Message!");

        JSONObject data = new JSONObject();
        data.put("Key-1", "JSA Data 1");
        data.put("Key-2", "JSA Data 2");

        body.put("notification", notification);
        body.put("data", data);

        HttpEntity<String> request = new HttpEntity<>(body.toString());

        CompletableFuture<String> pushNotification = firebaseMessagingService.send(request);
        CompletableFuture.allOf(pushNotification).join();

        try {
            String firebaseResponse = pushNotification.get();

            return new ResponseEntity<>(firebaseResponse, HttpStatus.OK);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        return new ResponseEntity<>("Push Notification ERROR!", HttpStatus.BAD_REQUEST);
    }

When I try to send a notification, I receive the following error:

{
  "multicast_id": 385944902818046340,
  "success": 0,
  "failure": 1,
  "canonical_ids": 0,
  "results": [
    {
      "error": "InvalidRegistration"
    }
  ]
}

Do you have any idea about how should I proceed to get the registration tokens on a Java project and send push notifications to my Expo client?

Thanks

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

1 Answers1

0

my client is an expo react native app

Since FCM registration token is specific to each device/app combination, you'll need to get it inside your React Native app.

If you're using the regular JavaScript SDK for Firebase, follow the documentation on accessing the registration token in the JavaScript SDK.

If you're using the React Native Firebase library, follow the instructions here and here: Get FCM token in React-Native

Once you have the token, you can send it to your server, where you can then use it to send messages to that specific device/app combination.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Sounds good, but I have an Expo project and I tried but unfortunately the above methods were not compatible :( I tried to use both react native firebase library and JavaScript SDK for Firebase but I didn't succedd. :( – Anamaria Dragomir Mar 03 '22 at 17:47
  • Unfortunately Expo doesn't help me....I tried the https://expo.dev/notifications to send notifications and it worked. But as token I used something like an Expo token generated from my expo project: "Expo[-*******8...]". I can't understand how I could make them communicate... – Anamaria Dragomir Mar 03 '22 at 18:01