[JAVA] [FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot

Aperçu

Envoyez un message à votre appareil Android à l'aide du service FCM de Google. Envoyez des messages à l'aide d'une API serveur prenant en charge HTTP v1 afin de pouvoir recevoir des notifications push sur votre appareil Android.

Préparation

Préparez un compte Firebase Console et connectez-vous.

Entrez le nom du projet (n'importe quel nom) Région Analytics et facturation: Japon Appuyez sur Créer un projet

Émission d'un certificat et obtention d'une clé SHA-1

keytool -exportcert -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore

Vous serez invité à entrer votre mot de passe.

android

J'ai pu le publier à.

Collez la sortie de la clé SHA-1 sur la console lorsque vous avez émis debug.keystore dans le certificat de signature SHA-1 (facultatif) pour le débogage.

Appuyez sur Enregistrer l'application.

Créer un nouveau projet dans Android Studio (activité vide)

Téléchargez google-services.json et placez-le directement sous l'application Android Studio.

Ajout des services suivants à AndroidManifest.xml.

        <service
            android:name="com.example.shosakaguchi.notifytest.FcmMessagingService"
            >
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <service
            android:name="com.example.shosakaguchi.notifytest.FcmInstanceIdService"
            >
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>

Ajout des dépendances suivantes à l'application build.gradle.

    api 'com.google.firebase:firebase-core:+'
    api 'com.google.firebase:firebase-messaging:+'
    api 'com.fasterxml.jackson.core:jackson-databind:+'
    api 'com.google.firebase:firebase-auth:+'

Ajoutez les dépendances suivantes au projet build.gradle + apply google-services.

dependencies {
api "com.google.firebase:firebase-messaging:10.2.4"
}
apply plugin: 'com.google.gms.google-services'

Reconstruisez le projet.

Générez la classe suivante dans Android Studio.

Une classe qui hérite de FirebaseMessagingService (le contenu est vide)

Le nom de classe arbitraire étend FirebaseMessagingService

Classe héritant de FirebaseInstanceIdService

Tout nom de classe étend FirebaseInstanceIdService
    @Override
    public void onTokenRefresh() {
        // Get updated InstanceID token.
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();
        Log.d(TAG, "Refreshed token: " + refreshedToken);

    }

Ajout de code pour obtenir des jetons et des jetons de terminal dans MainActivity.java.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //get device token
        FcmInstanceIdService sv = new FcmInstanceIdService();
        sv.onTokenRefresh();
    }
}

Exécutez le projet sur l'appareil qui reçoit la notification push.

Notez les jetons qui apparaissent dans la console Logcat sur Android Studio.

Implémentation de l'API serveur (Spring boot)

Créez un nouveau projet Spring à l'aide de STS sur Eclipse.

Ajoutez les dépendances suivantes à build.gradle.

	compile('com.fasterxml.jackson.core:jackson-databind:+')
	compile('com.google.firebase:firebase-admin:+')

À partir de la tâche Gradle, appuyez sur buildDependents.

Préparez les informations suivantes à partir de la page des paramètres de la page de la console Firabase. -URL du point de terminaison de destination POST https://fcm.googleapis.com/v1/projects/全般ページのプロジェクトID/messages:send"

· Clé privée Cliquez sur le compte de service sur la page des paramètres de la console Firabase Appuyez sur "Générer une nouvelle clé privée" dans l'onglet SDK d'administration Firebase. Honyara.json sera téléchargé, alors placez-le dans le dossier de ressources approprié de votre projet Spring.

Implémentation de la méthode d'initialisation

	public static void initializeToken() throws IOException{
		FileInputStream serviceAccount = new FileInputStream("Chemin de la clé privée téléchargé");

		FirebaseOptions options = new FirebaseOptions.Builder()
		    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
		    .setDatabaseUrl("https://ID du projet.firebaseio.com")
		    .build();

		FirebaseApp.initializeApp(options);
	}

Implémentation de la méthode d'acquisition des jetons d'accès

	public static  String getAccessToken() throws IOException {
		  GoogleCredential googleCredential = GoogleCredential
		      .fromStream(new FileInputStream("Chemin de la clé privée téléchargé"))
		      .createScoped(Arrays.asList("https://www.googleapis.com/auth/firebase.messaging"
		    		  ));
		  googleCredential.refreshToken();
		  return googleCredential.getAccessToken();
	}

Pour le moment, pour envoyer un message lorsque l'application serveur est exécutée, la classe principale doit être traitée.

TestProject.java

	public static void main(String[] args) {
		SpringApplication.run(PushAppTestApplication.class, args);
		System.out.println("start");

		try {
		//initialize firebasio
		initializeToken();

		//post param create
		URL url = new URL(URL du point de terminaison de destination du POST);
		HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
		httpURLConnection.setRequestMethod("POST");
		httpURLConnection.setRequestProperty("Authorization", "Bearer " + getAccessToken());
//		System.out.println("token" + getAccessToken());
		httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
		httpURLConnection.setDoOutput(true);

		httpURLConnection.connect();

		OutputStream out = httpURLConnection.getOutputStream();
		PrintStream ps = new PrintStream(out);
		ps.print(BODY partie du message de requête JSON (décrit plus loin));
		ps.close();

		//return response output
		InputStream is = httpURLConnection.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String s;
	    while ((s = reader.readLine()) != null) {
			System.out.println(httpURLConnection.getResponseMessage() + httpURLConnection.getResponseCode());
	        }
			reader.close();
			httpURLConnection.disconnect();
			} catch(Exception e) {
				e.printStackTrace();
		}
		System.out.println("end");
	}

BODY partie du message de requête JSON

	private final static String reqJson = "{\n" +
			"  \"message\":{\n" +
			"    \"token\" : \"Jetons apparaissant dans la console Logcat sur Android Studio",\n" +
			"    \"notification\" : {\n" +
			"      \"body\" : \"Message d'essai\",\n" +
			"      \"title\" : \"Titre du test\",\n" +
			"      }\n" +
			"   }\n" +
			"}";

C'est tout pour la mise en œuvre.

Cette fois, j'ai principalement implémenté l'envoi de notifications push vers un seul terminal. En pratique, il est nécessaire de bien réfléchir à l'hypothèse lors de l'envoi à plusieurs terminaux, à l'hypothèse du temps de transmission (cron batch etc.), au mécanisme pour envoyer le jeton d'appareil au serveur et à son stockage.

À partir de la prochaine fois, je voudrais vous présenter ces HowTos et exemples.

Je vous remercie pour votre travail acharné.

Recommended Posts

[FCM] Implémentation de la transmission de messages en utilisant FCM + Spring boot
Sortie de message (Spring boot)
Asynchronisation de la transmission des messages
Essayez d'utiliser Spring Boot Security
Modifier le message de validation Spring Boot
Personnalisation minimale de la page d'erreur Spring Boot (implémentation de l'interface ErrorController)
Exécution du traitement initial à l'aide de Spring Boot Command Line Runner
Mémorandum lorsque Spring Boot 1.5.10 → Spring Boot 2.0.0
Tutoriel Spring Boot à l'aide de l'authentification Spring Security
Implémentation de la validation à l'aide d'expressions régulières
La coopération des messages a commencé avec Spring Boot
Je veux contrôler le message d'erreur par défaut de Spring Boot
Erreur inconnue dans la ligne 1 de pom.xml lors de l'utilisation de Spring Boot dans Eclipse
[Android] Implémentation de ListView à défilement latéral à l'aide de RecyclerView
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (2)
Essayez d'utiliser Spring Boot avec VS Code
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (1)
Mémorandum WebMvcConfigurer de Spring Boot 2.0 (printemps 5)
Implémentation des onglets à l'aide de TabLayout et ViewPager
Implémentation de la fonction d'authentification des utilisateurs à l'aide de devise (3)
Traitement asynchrone avec Spring Boot en utilisant @Async
Comment diviser un fichier de message Spring Boot
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
Résumé de ce que j'ai appris sur Spring Boot
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Vérifions la sensation de Spring Boot + Swagger 2.0
Divers tableau de correspondance de Spring Framework et Spring Boot
Lorsque @Transactional of Spring Boot ne fonctionne pas
[JQuery] Procédure d'implémentation de la fonction de saisie semi-automatique [Java / Spring]
[Rails] Mise en œuvre du classement des nombres PV à l'aide de l'impressionniste
[Rails] Implémentation du diaporama d'images à l'aide de Bootstrap 3
Appliquer Twitter Bootstrap 4 à Spring Boot 2 à l'aide de Webjars
[Vérification] Comparaison de la vitesse de démarrage de Spring Boot et de Micronaut
Politique de contre-mesure CSRF et exemple de mise en œuvre dans une application REST utilisant "Spring Boot" + "EXT JS"
Défi Spring Boot
Faisons un disjoncteur pour le service backend à l'aide de l'actionneur de Spring Boot (partie 1)
Forme de botte de printemps
Spring Boot Rappelez-vous
gae + botte à ressort
Mise en œuvre de Google Sign-In à l'aide de l'authentification Google OAuth 2.0 (édition serveur)
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
Spécifiez le codage des ressources statiques dans Spring Boot
Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
[Note] Fichier de configuration lors de l'utilisation de Logback avec Spring Boot
La coopération des messages a commencé avec l'édition Spring Boot Apache Kafka
Exécution asynchrone des requêtes examinée dans Spring Boot 1.5.9
Un mémorandum de dépendance à Spring Boot2 x Doma2
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Accédez au h2db intégré de Spring Boot avec jdbcTemplate
05. J'ai essayé de supprimer la source de Spring Boot
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
J'ai essayé de réduire la capacité de Spring Boot