iOS
- 在 Firebase 控制台的項目中,選擇齒輪圖標,選擇Project Settings ,然後選擇Cloud Messaging選項卡。
- 在iOS app configuration下的APNs authentication key中,單擊Upload按鈕。
- 瀏覽到您保存密鑰的位置,選擇它,然後單擊打開。添加密鑰的密鑰 ID,然後單擊Upload 。。
- 在XCode中勾選Push Notification和背景監聽
安裝套件
在Flutter專案的pubspec.yaml中加入
dependencies:
firebase_messaging: ^12.0.2
取得TOKEN
首先在啟動時我們需要先要求權限,並且儲存一下設備的Token,可以把這個token想成是使用者設備的地址,之後後台發送推播就是使用這組地址來發送指定的推播。
class PushNotification {
init() async {
//要求權限
NotificationSettings settings =
await messaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
if (settings.authorizationStatus == AuthorizationStatus.authorized ||
settings.authorizationStatus == AuthorizationStatus.provisional) {
//如果權限有被使用者允許,拿一下Token地址吧!
messaging.getToken().then((value) => _token = value);
}
}
}
推播監聽
接下來我們要在啟動時加入各種情境的監聽函式,總共有四種情境要處理。
- 程式在前景模式運作中
- 程式在背景模式
- 程式在背景模式點擊推播打開後
- 程式被關閉的狀態點擊推播打開後
// 背景模式收到推播後的處理函式註冊
// 這裡要注意的是此callback必須是個top-level的static function
FirebaseMessaging.onBackgroundMessage(messageOnBackground);
// 關閉的狀態點擊推播打開後的處理函式註冊
messaging
.getInitialMessage()
.then((message) => messageOpenedOnTerminated(message));
// 前景模式收到推播後的處理函式註冊
FirebaseMessaging.onMessage
.listen((message) => messageOnForeground(message));
// 背景模式中使用者點擊推播後的處理函式註冊
FirebaseMessaging.onMessageOpenedApp
.listen((message) => messageOpenedOnBackground(message));
註冊的callback函式都會傳入一個結構體RemoteMessage,這個就是推播的結構體,我們通常最主要處理的會有title、body、和data。title會是推播顯示中的主標題,body會是推播顯示中的描述文字,而data就會是設計者想要傳遞給使用端的自訂結構。
就是這麼簡單!
最後你只要把收到推播資料的處理寫在對應的callback內就可以囉!
這裡要注意一下前景模式收到推播時,不會再另外跳出預設的通知訊息視窗,如果你想要跟背景模式下收到時一樣會跳出推播的提示視窗,必須另外使用Local Notification來發佈自訂的通知。
進階本地通知
補充說明一下本地通知,在兩種情況下會需要用到。一種是前面提到過的,當收到遠端推播資料時,APP正在前景模式的狀況下,不會跳出推播視窗;另一種是APP內觸發的推播,例如定時鬧鐘。
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="bible_seed_channel" />
要使用前初始化一下
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
final AndroidNotificationChannel channel = AndroidNotificationChannel(
'bible_seed_channel', // id
'BibleSeed Notifications', // title
description: 'This channel is used for important notifications.', // description
importance: Importance.max,
);
final InitializationSettings initializationSettings =
InitializationSettings(
android: AndroidInitializationSettings("@mipmap/ic_launcher"),
iOS: IOSInitializationSettings(),
);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
//iOS前景顯示選項設定
await FirebaseMessaging.instance
.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
需要推播時呼叫流程如下
final NotificationDetails notificationDetails = NotificationDetails(
android: AndroidNotificationDetails(
'bible_seed_channel', // id
'High Importance Notifications', // name
channelDescription: 'This channel is used for BibleSeed important notifications.',
importance: Importance.max,
priority: Priority.high,
icon: '@mipmap/ic_launcher',
),
iOS: IOSNotificationDetails(),
);
final id = DateTime.now().millisecondsSinceEpoch ~/ 1000;
flutterLocalNotificationsPlugin.show(id, title,
body, notificationDetails);
在這個套件中,還可以設定各種定時的推播,詳細內容就請參閱相關文件囉。
結論
今天我們先介紹了第一種容易被忽略卻非常必要的一個APP功能,不知道你看完後是不是想要立馬加上這功能了呢?!期待後續有機會繼續介紹其他的重要功能,趕緊訂閱一下,不要錯過任何一篇精彩文章囉!!