Android Kotlin 項目集成 Firebase Cloud Messaging (FCM) 全攻略

Firebase Cloud Messaging (FCM) 是 Google 提供的跨平臺消息推送解決方案。以下是在 Android Kotlin 項目中集成 FCM 的詳細步驟。

一、前期準備

1. 創建 Firebase 項目

  1. 訪問 Firebase 控制臺
  2. 點擊"添加項目",按照向導創建新項目
  3. 項目創建完成后,點擊"添加應用"選擇 Android 應用

2. 獲取配置文件

  1. 輸入應用的包名(必須與 build.gradle 中的 applicationId 一致)
  2. 下載 google-services.json 文件
  3. 將該文件放到項目的 app 模塊根目錄下

二、項目配置

1. 項目級 build.gradle

// 在項目級的 build.gradle 文件中添加:
buildscript {dependencies {// 添加 Google Services 插件classpath 'com.google.gms:google-services:4.3.15'}
}

2. 應用級 build.gradle

// 在應用級的 build.gradle 文件頂部添加:
plugins {id 'com.android.application'id 'kotlin-android'id 'com.google.gms.google-services' // 添加這行
}dependencies {// FCM 核心庫implementation 'com.google.firebase:firebase-messaging:23.2.1'// 可選 - Kotlin 協程支持implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.4'// 可選 - 用于處理后臺消息implementation 'androidx.work:work-runtime-ktx:2.8.1'
}

三、實現 FCM 服務

1. 創建自定義 FirebaseMessagingService

import android.util.Log
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessageclass MyFirebaseMessagingService : FirebaseMessagingService() {private val TAG = "FCM_Service"/*** 當收到新消息時調用*/override fun onMessageReceived(remoteMessage: RemoteMessage) {Log.d(TAG, "From: ${remoteMessage.from}")// 檢查消息是否包含數據負載if (remoteMessage.data.isNotEmpty()) {Log.d(TAG, "Message data payload: ${remoteMessage.data}")// 在這里處理數據消息handleDataMessage(remoteMessage.data)}// 檢查消息是否包含通知負載remoteMessage.notification?.let {Log.d(TAG, "Message Notification Body: ${it.body}")// 在這里處理通知消息handleNotification(it)}}/*** 當新令牌生成時調用*/override fun onNewToken(token: String) {Log.d(TAG, "Refreshed token: $token")// 將新令牌發送到你的應用服務器sendRegistrationToServer(token)}private fun handleDataMessage(data: Map<String, String>) {// 實現你的數據消息處理邏輯// 例如:更新UI、顯示通知等}private fun handleNotification(notification: RemoteMessage.Notification) {// 實現你的通知處理邏輯// 例如:顯示系統通知}private fun sendRegistrationToServer(token: String) {// 實現將令牌發送到你的應用服務器的邏輯}
}

2. 在 AndroidManifest.xml 中注冊服務

<serviceandroid:name=".MyFirebaseMessagingService"android:exported="false"><intent-filter><action android:name="com.google.firebase.MESSAGING_EVENT" /></intent-filter>
</service>

四、獲取設備令牌

1. 創建 FCM 管理器類

import android.util.Log
import com.google.firebase.messaging.FirebaseMessaging
import kotlinx.coroutines.tasks.awaitobject FCMManager {private const val TAG = "FCM_Manager"/*** 獲取當前 FCM 令牌*/suspend fun getToken(): String? {return try {FirebaseMessaging.getInstance().token.await().also { token ->Log.d(TAG, "FCM Token: $token")}} catch (e: Exception) {Log.e(TAG, "Failed to get FCM token", e)null}}/*** 訂閱主題*/fun subscribeToTopic(topic: String) {FirebaseMessaging.getInstance().subscribeToTopic(topic).addOnCompleteListener { task ->if (task.isSuccessful) {Log.d(TAG, "Subscribed to $topic")} else {Log.e(TAG, "Subscribe to $topic failed", task.exception)}}}/*** 取消訂閱主題*/fun unsubscribeFromTopic(topic: String) {FirebaseMessaging.getInstance().unsubscribeFromTopic(topic).addOnCompleteListener { task ->if (task.isSuccessful) {Log.d(TAG, "Unsubscribed from $topic")} else {Log.e(TAG, "Unsubscribe from $topic failed", task.exception)}}}
}

2. 在應用啟動時獲取令牌

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 獲取 FCM 令牌lifecycleScope.launch {val token = FCMManager.getToken()// 可以將 token 發送到你的服務器}// 訂閱主題示例FCMManager.subscribeToTopic("news")}
}

五、處理通知點擊

1. 創建通知點擊處理 Activity

class NotificationHandlerActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_notification_handler)// 處理從通知傳遞過來的數據intent.extras?.let { extras ->// 解析 extras 中的數據并處理val message = extras.getString("key")// 根據消息內容跳轉到相應頁面}// 關閉 Activity(如果是僅用于處理點擊)finish()}
}

2. 在 AndroidManifest.xml 中配置

<activityandroid:name=".NotificationHandlerActivity"android:exported="true"android:theme="@style/Theme.AppCompat.Translucent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>

六、測試 FCM 功能

1. 使用 Firebase 控制臺測試

  1. 在 Firebase 控制臺中選擇你的項目
  2. 進入 Cloud Messaging 部分
  3. 點擊"發送第一條消息"
  4. 填寫通知標題、內容等
  5. 選擇目標設備或主題
  6. 發送測試消息

2. 使用 cURL 命令測試

curl -X POST \'https://fcm.googleapis.com/fcm/send' \-H 'Authorization: key=YOUR_SERVER_KEY' \-H 'Content-Type: application/json' \-d '{"to": "DEVICE_TOKEN","notification": {"title": "測試通知","body": "這是一條測試消息","click_action": ".NotificationHandlerActivity"},"data": {"key1": "value1","key2": "value2"}}'

七、常見問題解決

  1. 收不到通知

    • 檢查設備是否聯網
    • 確認 google-services.json 配置正確
    • 檢查應用是否被強制停止
  2. 令牌獲取失敗

    • 確保 Google Play 服務可用
    • 檢查設備是否支持 GMS
  3. 后臺消息不觸發

    • 確認服務已在 Manifest 中正確聲明
    • 檢查 Android 版本是否限制了后臺服務
  4. 通知圖標不顯示

    • 確保有默認通知圖標
    • 在 Manifest 中添加元數據:
      <meta-dataandroid:name="com.google.firebase.messaging.default_notification_icon"android:resource="@drawable/ic_notification" />
      

八、最佳實踐

  1. 令牌管理

    • 每次應用啟動時檢查令牌
    • onNewToken 中及時更新服務器上的令牌
  2. 消息處理

    • 區分數據消息和通知消息
    • 對于重要消息,考慮添加 WorkManager 任務確保處理
  3. 用戶體驗

    • 為通知設置合適的渠道
    • 提供清晰的點擊行為
  4. 安全性

    • 使用 HTTPS 傳輸令牌
    • 在服務器端驗證消息來源

通過以上步驟,你的 Android Kotlin 應用已經成功集成了 FCM 推送通知功能。你可以根據需要進一步擴展功能,如實現富媒體通知、分組通知等高級特性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903759.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

搭建PCDN大節點,服務器該怎么配

搭建P2P大節點時&#xff0c;服務器要怎么配呢&#xff1f;需要綜合考慮硬件性能、網絡帶寬、存儲能力、系統架構以及安全性等多個方面&#xff0c;以確保節點能夠高效、穩定地運行。 一、硬件配置 CPU&#xff1a;選擇高性能的多核處理器&#xff0c;以滿足高并發處理需求。核…

(done) 吳恩達版提示詞工程 8. 聊天機器人 (聊天格式設計,上下文內容,點餐機器人)

視頻&#xff1a;https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 別人的筆記&#xff1a;https://zhuanlan.zhihu.com/p/626966526 8. 聊天機器人&#xff08;Chatbot&#xff09; …

AtCoder Beginner Contest 403(題解ABCDEF)

A - Odd Position Sum #1.奇數數位和 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #include<queue> #include<cstring> #include<stack> #include&l…

【Game】Powerful——Abandoned Ruins(9)

文章目錄 1、新增古玩2、機關機制3、探索法寶4、智斗強敵5、地圖6、參考 2025 年 1 月迎來的新玩法——荒廢遺跡 每周四個寶藏鏟&#xff08;老玩法&#xff09;或者兩個遺跡線索&#xff08;新玩法&#xff09;&#xff0c;3 個寶藏鏟也可以換一個遺跡線索&#xff0c;之前沒時…

構建網頁版IPFS去中心化網盤

前言&#xff1a;我把它命名為無限網盤 Unlimited network disks&#xff08;ULND&#xff09;&#xff0c;可以實現簡單的去中心化存儲&#xff0c;其實實現起來并不難&#xff0c;還是依靠強大的IPFS&#xff0c;跟著我一步一步做就可以了。 第一步&#xff1a;準備開發環境…

國標GB28181視頻平臺EasyGBS在物業視頻安防管理服務中的應用方案?

一、方案背景? 在現代物業服務中&#xff0c;高效的安全管理與便捷的服務運營至關重要。隨著科技的不斷發展&#xff0c;物業行業對智能化、集成化管理系統的需求日益增長。EasyGBS作為一款基于國標GB28181協議的視頻監控平臺&#xff0c;具備強大的視頻管理與集成能力&#…

[Unity]設置自動打包腳本

背景 我們經常會使用自動打包功能 文件名稱: AutoBuild.csusing System.IO; using System.Linq; using UnityEditor; using UnityEngine;public class AutoBuilder {[MenuItem("Build/GetCurrentBuildTarget")]public static void GetCurrentBuildTarget(){Debug.L…

正點原子STM32H743單片機實現ADC多通道檢測

目標 使用STM32CubeMX工具&#xff0c;配置ADC相關參數&#xff0c;實現在STM32H743單片機上獲取ADC多通道電壓值。共14個ADC引腳&#xff0c;ADC2有5個&#xff0c;ADC3有9個&#xff0c;全部設置單通道 ADC引腳 PF3PF4PF5PF10PC0PC2PC3PH2PH3PA3PB0PB1PA4PA5PA6 STM32cube…

深度學習基礎(四)——計算量(FLOPs)、參數量(Params)、計算速度(FLOPS/TOPS))

一、計算量FLOPs FLOPs&#xff0c;全稱為Floating Point Operations, (s為復數縮寫&#xff09;&#xff0c;浮點運算數&#xff0c;指模型完成一次前向傳播所需的浮點運算次數&#xff0c;可以理解為計算量&#xff08;模型的時間復雜度&#xff09;&#xff0c;用來衡量算法…

電子秤檢測管理系統開發實戰:從數據采集到可視化大屏

簡介 電子秤作為現代工業生產和商業流通中的核心計量設備,其準確性直接關系到產品質量和交易公平。針對仙貝生產企業的電子秤管理需求,我們開發了一套集電子秤檢測信息錄入、產品信息管理、實時稱重數據采集和后臺可視化大屏于一體的綜合管理系統。該系統基于Django框架構建…

Cesium添加WMS,WMTS,地形圖圖,3D Tiles數據

在 Cesium 中&#xff0c;你可以添加 WMS、WMTS、地形圖 和 3D Tiles 數據源。以下是詳細的實現方法&#xff1a; 1. 添加 WMS 服務 WMS&#xff08;Web Map Service&#xff09;是一種動態地圖服務&#xff0c;適用于加載柵格地圖圖層。 代碼示例 const viewer new Cesium…

數據庫基本概念:數據庫的定義、特點、分類、組成、作用

一&#xff1a;數據庫相關概念 1.1 定義 &#xff08;1&#xff09;數據庫&#xff1a;存儲數據的倉庫 &#xff08;2&#xff09;數據庫管理系統&#xff1a;模擬和管理數據庫的大型軟件 &#xff08;3&#xff09;SQL&#xff1a;操作關系型數據庫的編程語言&#xff0c;定義…

【項目篇之消息序列化】仿照RabbitMQ模擬實現消息隊列

實現消息序列化 為什么不使用JSON來序列化直接使用二進制序列化實現序列化方法toBytes()1&#xff1a; 創建內存緩沖區??2 &#xff1a;創建對象序列化通道?3&#xff1a;執行序列化操作?4&#xff1a;提取二進制數據&#xff0c;轉換成byte[]序列化圖示流程&#xff1a;序…

單片機-89C51部分:13、看門狗

飛書文檔https://x509p6c8to.feishu.cn/wiki/LefkwDPU7iUUWBkfKE9cGLvonSh 一、作用 程序發生死循環的時候&#xff08;跑飛&#xff09;&#xff0c;能夠自動復位。 啟動看門狗計數器->計數器計數->指定時間內不對計數器賦值&#xff08;主程序跑飛&#xff0c;無法喂…

C++23/26 靜態反射機制深度解析:編譯時元編程的新紀元

目錄 引言 一、C靜態反射的核心特性 1. 編譯時元數據獲取 2. 元信息操作的語法革新 3. 與現有特性的深度融合 二、應用場景&#xff1a;從理論到實踐 1. 序列化與反序列化 2. 領域特定語言&#xff08;DSL&#xff09;與代碼生成 3. 動態插件系統 4. 調試與元編程增強…

RISCV學習(5)GD32VF103 MCU架構了解

RISCV學習&#xff08;5&#xff09;GD32VF103 MCU架構了解 1、芯片內核功能簡介 GD32VF103 MCU架構&#xff0c;采用Bumblebee內核&#xff0c;芯來科技&#xff08;Nuclei System Technology&#xff09;與臺灣晶心科技&#xff08;Andes Technology&#xff09;聯合開發&am…

【Java學習筆記】遞歸

遞歸&#xff08;recursion&#xff09; 思想&#xff1a;把一個復雜的問題拆分成一個簡單問題和子問題&#xff0c;子問題又是更小規模的復雜問題&#xff0c;循環往復 本質&#xff1a;棧的使用 遞歸的注意事項 &#xff08;1&#xff09;需要有遞歸出口&#xff0c;否者就…

滲透測試中的那些“水洞”:分析與防御

1. Nginx 版本泄露 風險分析&#xff1a; Nginx 默認會在響應頭中返回 Server: nginx/x.x.x&#xff0c;攻擊者可利用該信息匹配已知漏洞進行攻擊。 防御措施&#xff1a; 修改 nginx.conf 配置文件&#xff0c;隱藏版本信息&#xff1a;server_tokens off;使用 WAF 進行信息…

基于C#開發的適合Windows開源文件管理器

使用DDD從零構建一個完整的系統 推薦一個功能強大且直觀的開源文件管理器&#xff0c;適用于Windows平臺。 01 項目簡介 該項目是一個基于C#開發、開源的文件管理器&#xff0c;適用于Windows&#xff0c;界面UI美觀、方便輕松瀏覽文件。此外&#xff0c;支持創建和提取壓縮…

實習入職的總結

我是4月14號入職的&#xff0c;到現在差不多已經三個禮拜了&#xff0c;今天想總結一下這段時間的工作情況&#xff0c;并給學弟學妹們提供一些指引。 目前&#xff0c;我所在的公司是一家初創企業&#xff0c;專注于IPC安防領域。作為一名大專生&#xff0c;我深知自己的學歷在…