【Expo Android 推播整合 04】 裝置註冊:請求通知權限與通知種類介紹

更新 發佈閱讀 9 分鐘

上一篇中,我們完成了:

  • 初始化 Firebase 與 Azure Notification Hub
  • 成功從 Firebase 取得 FCM token
  • 註冊裝置至 Azure Notification Hub(使用 FCM v1 註冊格式)

這篇我們的目標是:

  • 如何顯示 前景通知
  • 如何 請求 Android 13+ 的通知權限
  • 如何處理 通知點擊事件(背景與關閉狀態)
  • 打包 APK

先來認識手機中的 App 通知類型!

App 通知行為分類

raw-image

請求 Android 13 通知權限

從 Android 13(API 33)開始,需要向使用者明確請求 POST_NOTIFICATIONS 權限。

import { PermissionsAndroid, Platform } from 'react-native'

async function requestAndroidNotificationPermission() {
if (Platform.OS === 'android' && Platform.Version >= 33) {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS
)
return granted === PermissionsAndroid.RESULTS.GRANTED
}
return true
}

顯示前景通知(App 開啟中)

當 App 正在使用中,通知不會由系統自動顯示。我們必須手動接收並彈出提醒。你也可以改用 Toast 或 Modal 呈現。

import messaging from '@react-native-firebase/messaging'
import { Alert } from 'react-native'

messaging().onMessage(async (remoteMessage) => {
Alert.alert('前景通知', remoteMessage.notification?.title || '收到通知')
})

背景狀態通知點擊

messaging().onNotificationOpenedApp((remoteMessage) => {
const messaage = remoteMessage?.data?.messaage
if (typeof messaage === 'string') {
Alert.alert('來自背景通知訊息:', messaage)
}
})

關閉狀態通知點擊

const initialMsg = await messaging().getInitialNotification()
const url = initialMsg?.data?.messaage
if (typeof messaage === 'string') {
Alert.alert('來自關閉通知訊息:', messaage)
}

完整程式碼

import { useEffect, useRef, useState } from 'react';
import { StyleSheet, PermissionsAndroid, Platform, Alert } from 'react-native';
import messaging from '@react-native-firebase/messaging';
import registerDeviceToAzure from '@/hooks/useAzureRegistration';

// 清理資源和取消事件監聽器
const cleanupFns = useRef<(() => void)[]>([])

export default function HomeScreen() {
useEffect(() => {
const setupPush = async () => {
try {
const granted = await requestAndroidNotificationPermission()
if (!granted) {
Alert.alert('未授權通知權限')
return
}

const authStatus = await messaging().requestPermission()
const enabled =
authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
authStatus === messaging.AuthorizationStatus.PROVISIONAL

if (!enabled) {
Alert.alert('FCM 權限未啟用')
return
}

const token = await messaging().getToken()
await registerDeviceToAzure(token)

const unsub1 = messaging().onMessage(async (remoteMessage) => {
Alert.alert('前景通知', remoteMessage.notification?.title || '收到通知')
})

const unsub2 = messaging().onNotificationOpenedApp((remoteMessage) => {
const url = remoteMessage?.data?.url
if (typeof url === 'string') {
Alert.alert('背景點通知跳轉:', url)
}
})

const initialMsg = await messaging().getInitialNotification()
const url = initialMsg?.data?.url
if (typeof url === 'string') {
Alert.alert('關閉狀態點通知跳轉:', url)
}

cleanupFns.current = [unsub1, unsub2]
} catch (err) {
Alert.alert('推播初始化錯誤', JSON.stringify(err))
}
}

setupPush()

return () => {
cleanupFns.current.forEach((unsub) => unsub())
}
}, [])

return ( ...);
}


我們已經完成裝置註冊與 App 端的通知顯示了 🎉

因為我們之前已經有使用 prebuild 生成 android 資料夾,接著只要在終端機執行

./gradlew assembleRelease

打包成功後,release APK 會放在 release 資料夾中

專案資料夾/android/app/build/outputs/apk/release

將 app-release.apk 放進手機完成安裝,就可以使用 Azure 做測試發送囉~

raw-image

相同文章發布於我的部落格

留言
avatar-img
留言分享你的想法!
avatar-img
Ann Chou的沙龍
17會員
32內容數
從藝術領域轉職到前端工程師,喜歡書寫學習歷程和技術文件,掌握經驗與隨時提取的感覺很好。
Ann Chou的沙龍的其他內容
2025/05/22
這篇文章說明如何在 Expo 專案中,透過 Firebase Cloud Messaging(FCM)與 Azure Notification Hub 整合推播通知。內容涵蓋取得 FCM token、生成 SAS token,以及使用 REST API 將裝置註冊至 Azure 通知中樞的完整流程。
2025/05/22
這篇文章說明如何在 Expo 專案中,透過 Firebase Cloud Messaging(FCM)與 Azure Notification Hub 整合推播通知。內容涵蓋取得 FCM token、生成 SAS token,以及使用 REST API 將裝置註冊至 Azure 通知中樞的完整流程。
2025/04/27
這篇文章說明如何在 Windows 電腦上設定 Android 推播通知,包含使用 Expo 串接 Firebase 和 Azure 的步驟。文章涵蓋 Firebase 和 Azure 的設定,以及 Android Studio 和 JDK 的配置。
2025/04/27
這篇文章說明如何在 Windows 電腦上設定 Android 推播通知,包含使用 Expo 串接 Firebase 和 Azure 的步驟。文章涵蓋 Firebase 和 Azure 的設定,以及 Android Studio 和 JDK 的配置。
2025/04/20
介紹在 React Native / Expo 中實作推播通知的方式,並比較使用 Expo Notifications 與整合 Firebase Cloud Messaging(FCM)或 Azure Notification Hubs 的差異。
2025/04/20
介紹在 React Native / Expo 中實作推播通知的方式,並比較使用 Expo Notifications 與整合 Firebase Cloud Messaging(FCM)或 Azure Notification Hubs 的差異。
看更多
你可能也想看
Thumbnail
這篇文章是一位咖啡愛好者分享他在雙11前的購物規劃。他不僅推薦了自己喜愛的咖啡豆品牌(如李董、音樂家系列)與手沖器材,還分享了實用的挑豆技巧。同時,他記錄了一項個人實驗:剛加入「蝦皮分潤計畫」,想測試透過分享真心喜愛的商品,是否能為自己的咖啡開銷「回血」。
Thumbnail
這篇文章是一位咖啡愛好者分享他在雙11前的購物規劃。他不僅推薦了自己喜愛的咖啡豆品牌(如李董、音樂家系列)與手沖器材,還分享了實用的挑豆技巧。同時,他記錄了一項個人實驗:剛加入「蝦皮分潤計畫」,想測試透過分享真心喜愛的商品,是否能為自己的咖啡開銷「回血」。
Thumbnail
出國旅行時,準備充分的行李能讓旅程更加輕鬆愉快!本文整理了大人旅行的全方位行李清單,從護照、信用卡到各種旅行好物一應俱全。特別是防盜小物、瞬熱熱水壺和過濾蓮蓬頭等必備單品,讓你的旅行更舒適、安全。此外,還介紹了蝦皮分潤計劃,讓你在購物的同時還能輕鬆賺取分潤,無論是準備行李還是購物分享,都是不錯的選擇
Thumbnail
出國旅行時,準備充分的行李能讓旅程更加輕鬆愉快!本文整理了大人旅行的全方位行李清單,從護照、信用卡到各種旅行好物一應俱全。特別是防盜小物、瞬熱熱水壺和過濾蓮蓬頭等必備單品,讓你的旅行更舒適、安全。此外,還介紹了蝦皮分潤計劃,讓你在購物的同時還能輕鬆賺取分潤,無論是準備行李還是購物分享,都是不錯的選擇
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
需求情境: 為了讓多人使用 App,必須有驗證程序,以識別特定使用者,存取各自擁有的資源。 解決方案: 引用 google 所提供的雲端服務平台 Firebase,其中有多種驗證功能可選用。基於個人對 google 的偏愛,決定先採用 google signin 的方法,實作 login lo
Thumbnail
公告佈達看似簡單,但如何做好才是關鍵。 只有透過適時而有效的公告,才能確保重要訊息的及時傳達,促進員工的共識和配合 最終提升整體的運營效率,為企業持續發展注入動力!
Thumbnail
公告佈達看似簡單,但如何做好才是關鍵。 只有透過適時而有效的公告,才能確保重要訊息的及時傳達,促進員工的共識和配合 最終提升整體的運營效率,為企業持續發展注入動力!
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
在這篇教學中,我們將學習如何使用 Google Apps Script 來連結 LINE Notify,以便於你的應用程式或自動化工作流程中發送通知。LINE Notify 是 LINE 提供的服務,可以讓你透過 LINE 帳號來發送自訂的通知訊息。
Thumbnail
在這篇教學中,我們將學習如何使用 Google Apps Script 來連結 LINE Notify,以便於你的應用程式或自動化工作流程中發送通知。LINE Notify 是 LINE 提供的服務,可以讓你透過 LINE 帳號來發送自訂的通知訊息。
Thumbnail
本文章將介紹如何在LINE Notify上設定及使用權杖(access token)來進行通知功能。透過此API,可以使用curl或JAVA CODE來讓結果顯示在Line上面,達到及時的通知效果。
Thumbnail
本文章將介紹如何在LINE Notify上設定及使用權杖(access token)來進行通知功能。透過此API,可以使用curl或JAVA CODE來讓結果顯示在Line上面,達到及時的通知效果。
Thumbnail
本課程學習如何提取共同屬性,透過 Style 樣式包,套用至每個按鈕。來提升佈局的可讀性和好維護性。
Thumbnail
本課程學習如何提取共同屬性,透過 Style 樣式包,套用至每個按鈕。來提升佈局的可讀性和好維護性。
Thumbnail
本課程學習如何使用 Intent 簡單跳頁,切換兩個 Activity。
Thumbnail
本課程學習如何使用 Intent 簡單跳頁,切換兩個 Activity。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
Thumbnail
本課程學習如何在 Kotlin 程式碼檔案中,設定 ImageView 圖片元件,顯示本地端圖片。
Thumbnail
本課程學習如何使用 Android Studio 建立的第一個應用程式專案:Hello World。
Thumbnail
本課程學習如何使用 Android Studio 建立的第一個應用程式專案:Hello World。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。
Thumbnail
根據初學者設計了 Kotlin 程式語言的基礎課程,從 Android Studio 到 Android App 開發,提供完整指引。由基礎開始,傳授開發技巧。課程分為三部分:環境安裝、常用元件與界面設計,以及高階技巧如 DataStore、Room 資料儲存與網路處理。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News