Kata Pengantar
Saya menyapa anda Baru-baru ini, saya menghadapi tantangan untuk mengatur pemberitahuan push di situs. Ini adalah pertama kalinya saya menemukan ini, dan
artikel ini banyak membantu saya. Itu sudah berisi uraian tentang sisi server, tetapi, dalam proses mempelajari topik ini, saya menemukan cara yang lebih nyaman untuk mengimplementasikan sarana perpustakaan Firebase itu sendiri. Sebenarnya, aku ingin memberitahumu tentang dia, karena Saya tidak dapat menemukan penjelasan yang jelas di Internet.
Artikel ini juga dapat bermanfaat bagi programmer di Node.js, Python, dan Go, karena perpustakaan juga tersedia dalam bahasa-bahasa ini.
Langsung ke intinya
Pada artikel ini, saya hanya akan berbicara tentang sisi server.
(Anda dapat mengonfigurasi bagian klien menggunakan artikel yang sama)
Jadi:
- Pertama, Anda perlu pergi ke situs , mendaftar dan membuat proyek.
- Selanjutnya, di sudut kiri atas, klik pada gir dan pilih "Pengaturan Proyek".
- Buka tab "Akun layanan", pilih bahasa yang menarik bagi kami, klik "buat kunci pribadi" dan unduh file yang dihasilkan
File JSON ini berisi konfigurasi yang diperlukan untuk pustaka Firebase.
Sekarang mari kita jaga servernyaUntuk kenyamanan, deklarasikan jalur ke file yang diunduh di application.properties
fcm.service-account-file = /path/to/file.json
Tambahkan dependensi yang diperlukan di pom.xml
<dependency> <groupId>com.google.firebase</groupId> <artifactId>firebase-admin</artifactId> <version>6.7.0</version> </dependency>
Buat kacang yang mengembalikan JSON kami:
@ConfigurationProperties(prefix = "fcm") @Component public class FcmSettings { private String serviceAccountFile; public String getServiceAccountFile() { return this.serviceAccountFile; } public void setServiceAccountFile(String serviceAccountFile) { this.serviceAccountFile = serviceAccountFile; } }
Konfigurasi objek
@Getter @Setter public class PushNotifyConf { private String title; private String body; private String icon; private String click_action; private String ttlInSeconds; public PushNotifyConf() { } public PushNotifyConf(String title, String body, String icon, String click_action, String ttlInSeconds) { this.title = title; this.body = body; this.icon = icon; this.click_action = click_action; this.ttlInSeconds = ttlInSeconds; } }
Bidang:
- judul - Daftar Isi
- isi - teks pemberitahuan
- ikon - tautan ke gambar
- click_action - tautan tempat pengguna akan pergi ketika mereka mengklik pemberitahuan (dengan nama, contoh dalam layanan)
Anda dapat menambahkan beberapa di antaranya, tetapi tidak semua browser akan menampilkan semuanya (di bawah ini adalah contoh dari Chroma)
- ttlInSeconds - waktu validitas pemberitahuan
Dan layanan, yang akan menjadi logika pengiriman notifikasi:
@Service public class FcmClient { public FcmClient(FcmSettings settings) { Path p = Paths.get(settings.getServiceAccountFile()); try (InputStream serviceAccount = Files.newInputStream(p)) { FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options); } catch (IOException e) { Logger.getLogger(FcmClient.class.getName()) .log(Level.SEVERE, null, e); } } public String sendByTopic(PushNotifyConf conf, String topic) throws InterruptedException, ExecutionException { Message message = Message.builder().setTopic(topic) .setWebpushConfig(WebpushConfig.builder() .putHeader("ttl", conf.getTtlInSeconds()) .setNotification(createBuilder(conf).build()) .build()) .build(); String response = FirebaseMessaging.getInstance() .sendAsync(message) .get(); return response; } public String sendPersonal(PushNotifyConf conf, String clientToken) throws ExecutionException, InterruptedException { Message message = Message.builder().setToken(clientToken) .setWebpushConfig(WebpushConfig.builder() .putHeader("ttl", conf.getTtlInSeconds()) .setNotification(createBuilder(conf).build()) .build()) .build(); String response = FirebaseMessaging.getInstance() .sendAsync(message) .get(); return response; } public void subscribeUsers(String topic, List<String> clientTokens) throws FirebaseMessagingException { for (String token : clientTokens) { TopicManagementResponse response = FirebaseMessaging.getInstance() .subscribeToTopic(Collections.singletonList(token), topic); } } private WebpushNotification.Builder createBuilder(PushNotifyConf conf){ WebpushNotification.Builder builder = WebpushNotification.builder(); builder.addAction(new WebpushNotification .Action(conf.getClick_action(), "")) .setImage(conf.getIcon()) .setTitle(conf.getTitle()) .setBody(conf.getBody()); return builder; } }
Saya: - Firebase, mengapa ada begitu banyak bangunan?
Firebase: - Karena
- Konstruktor digunakan untuk menginisialisasi FirebaseApp menggunakan file JSON kami.
- Metode sendByTopic () mengirimkan pemberitahuan kepada pengguna yang berlangganan topik tertentu.
- Metode subscribeUsers () berlangganan topik (topik) pengguna (clientTokens).
dapat dieksekusi secara tidak sinkron, untuk ini .subscribeToTopicAsync () digunakan
- Metode sendPersonal () mengimplementasikan pengiriman pemberitahuan pribadi kepada pengguna (clientToken)
- Metode createBuilder () membuat pesan
Hasil
Browser lain

Tidak ada ikon karena Ubuntu :)
Untuk meringkas
Intinya, perpustakaan Firebase mengumpulkan JSON untuk kami seperti ini:
{from: "Server key"β notification: {ββ title: " Habr" actions: (1) [βββ 0: Object { action: "https://habr.com/ru/top/", title: "" } ]ββ length: 1ββ body: "- "ββ image: "https://habrastorage.org/webt/7i/k5/77/7ik577fzskgywduy_2mfauq1gxs.png"ββ } βpriority: "normal"}
Dan di sisi klien, Anda sudah menguraikannya sesuka Anda.
Terima kasih atas perhatian anda!Tautan yang bermanfaat:
firebase.google.com/docs/reference/admin/java/reference/com/google/firebase/messaging/WebpushNotificationhabr.com/en/post/321924/#otpravka-uvedomleniy-s-serverafirebase.google.com/docs/web/setup