iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Mobile Development

即使明天老闆突然叫你用 React Native 也可以跟他說好沒問題系列 第 27

Day 27. 以 Notifee 與 React Native Firebase 實作遠端推播

  • 分享至 

  • xImage
  •  

在上一節中,我們已經認識 React Native Firebase 的 API ,也完成基本前置作業。在這節中我們會繼續用上一節的 RemoteNotification 串接 Notifee ,讓訊息能實際被傳送到模擬器和實體手機裡。

先回顧一下目前的半成品:

import React, {useEffect} from 'react';
import {View , Text} from 'react-native';
import messaging from '@react-native-firebase/messaging';
import AsyncStorage from '@react-native-async-storage/async-storage';

function RemoteNotification() {
  useEffect(() => {
    // iOS permission
    async function requestPermission() {
      const authStatus = await messaging().requestPermission();
      const enabled =
        authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
        authStatus === messaging.AuthorizationStatus.PROVISIONAL;
      if (enabled) {
        getFcmToken();
      }
    }
    requestPermission();
  }, []);
  useEffect(() => {
    const unsubscribe = messaging().onMessage(async remoteMessage => {
      const notification = remoteMessage.notification;
    });
    return unsubscribe;
  }, []);
  useEffect(() => {
    messaging().onNotificationOpenedApp(remoteMessage => {
      // do something
    });
    messaging()
      .getInitialNotification()
      .then(remoteMessage => {
        // 只有點擊推播開啟 app 時會 return 物件,否則 return null
        if (remoteMessage) {
          // do something
        }
      });
  }, []);

  async function getFcmToken() {
    let checkToken = await AsyncStorage.getItem('fcmToken');
    if (!checkToken) {
      try {
        const fcmToken = await messaging().getToken();
        if (!!fcmToken) {
          await AsyncStorage.setItem('fcmToken', fcmToken);
        }
      } catch (error) {
        console.log('error in fcmtoken', error);
      }
    }
  }

  return (
    <View>
      <Text>遠端推播</Text>
    </View>
  );
}

export default RemoteNotification;

要用 Notifee 將收到的訊息顯示出來,就須先建立 channel ,並用 displayNotification 顯示。

async function displayRemoteNotification() {
  const channelId = await notifee.createChannel({
    id: 'remoteNotice',
    name: 'remoteNotice channel',
  });
  await notifee.displayNotification({
    title: 'remote title',
    body: 'remote body',
    android: {
      channelId,
      pressAction: {
        id: 'remoteNotice',
      },
    },
  });
}

不過標題和內文應該從寫死文字,改成以 React Native Firebase 取得。在 onMessage 的函式中,傳入 remoteMessage 下的 notification :

useEffect(() => {
  const unsubscribe = messaging().onMessage(async remoteMessage => {
    const notification = remoteMessage.notification;
    displayRemoteNotification(notification);
  });
  return unsubscribe;
}, []);
async function displayRemoteNotification(notification) {
  … 省略
  await notifee.displayNotification({
    title: notification.title,
    body: notification.body,
    … 省略
  });
}

打開前兩節已建立好的 Firebase 專案,選擇互動交流 / Messaging / 建立第一個廣告活動:
https://ithelp.ithome.com.tw/upload/images/20230923/201296353U9QjQ19GM.png
https://ithelp.ithome.com.tw/upload/images/20230923/20129635W0orqaZ2Oa.png

填寫推播標題和內文,圖片可以隨需求加上。 Firebase 提供開發者測試功能,可以按下右側的傳送測試訊息來檢查程式碼是否成功串接。不過遠端推播只有 Android 可以使用模擬器測試, iOS 必須透過實體手機安裝 App 。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635LMDbxE2kVi.png

第一次點擊進行測試時會需要新增 FCM Token 。這串 Token 就是在上一節中,用 getToken 取得的資料。用 console.log() 取得 Token 後,貼上並點選測試。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635NaPepb4PWG.png

async function getFcmToken() {
  let checkToken = await AsyncStorage.getItem('fcmToken');
  // 已存到本機的話可以在這裡取得
  console.log(checkToken);
  if (!checkToken) {
    try {
      const fcmToken = await messaging().getToken();
      // 還沒的話可以在這裡取得
      console.log(fcmToken);
      … 省略
    }
  }

按下測試後就會收到訊息了:
https://ithelp.ithome.com.tw/upload/images/20230923/20129635JO1PwTzJNV.png

若要讓後台設定的圖片正確顯示出來,則需要再改一下程式碼。

import notifee, {AndroidStyle} from '@notifee/react-native';
async function displayRemoteNotification(notification) {
  … 省略
  await notifee.displayNotification({
    … 省略
    android: {
      … 省略
      largeIcon:
        (notification.android && notification.android.imageUrl) ||
        'ic_small_icon',
      style: {
        type: AndroidStyle.BIGPICTURE,
        picture:
          (notification.android && notification.android.imageUrl) || {},
      },
    },
  });
}

https://ithelp.ithome.com.tw/upload/images/20230923/20129635zmxlzr8F1F.png

若要改動的是左上角小方塊,則用 smallIcon 來更改。首先到這個網站生成預設 icon ,若後台沒有設定 icon 時則顯示預設此圖片。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635IXjTT03bQJ.png

下載後會在 res 資料夾裡找到五個資料夾,裡頭各有一個檔案,代表不同尺寸大小。打開 android / app / src / main / res ,分別貼到對應資料夾中。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635X95rVp50W8.png
https://ithelp.ithome.com.tw/upload/images/20230923/20129635asLFUHhEjZ.png

接著改寫:

import notifee, {AndroidStyle} from '@notifee/react-native';
async function displayRemoteNotification(notification) {
  … 省略
  await notifee.displayNotification({
    … 省略
    android: {
      … 省略
      smallIcon: 'ic_small_icon',
    },
  });
}

https://ithelp.ithome.com.tw/upload/images/20230923/20129635aQcQU9GKX1.png

測試完畢後,到下一步選擇傳送對象,接著指定發送時間。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635Cgp4GSecTA.png
https://ithelp.ithome.com.tw/upload/images/20230923/20129635NNeF9XqKWt.png
https://ithelp.ithome.com.tw/upload/images/20230923/201296355nQPk7WkTO.png

最後能在 Messaging 控制台看到推播發送情況。
https://ithelp.ithome.com.tw/upload/images/20230923/20129635lHrkQbOOUU.png


上一篇
Day 26. 認識 React Native Firebase
下一篇
Day 28. 打包送審 Android
系列文
即使明天老闆突然叫你用 React Native 也可以跟他說好沒問題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言