# Flutter Notification
###### tags: `work` `flutter`
### Android
- Tạo android app trên firebase với package name và SHA-1 tương ứng với app.
- Add file google-services.json vào project.
- Modify build.gradle file
##### Project-level build.gradle
```
buildscript {
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
}
dependencies {
...
// Add this line
classpath 'com.google.gms:google-services:4.3.5'
}
}
allprojects {
...
repositories {
// Check that you have the following line (if not, add it):
google() // Google's Maven repository
...
}
}
```
##### App-level build.gradle
```
apply plugin: 'com.android.application'
// Add this line
apply plugin: 'com.google.gms.google-services'
dependencies {
// Import the Firebase BoM
implementation platform('com.google.firebase:firebase-bom:26.5.0')
// Add the dependency for the Firebase SDK for Google Analytics
// When using the BoM, don't specify versions in Firebase dependencies
implementation 'com.google.firebase:firebase-analytics-ktx'
implementation 'com.google.firebase:firebase-messaging:21.0.1'
// Add the dependencies for any other desired Firebase products
// https://firebase.google.com/docs/android/setup#available-libraries
}
```
- Set name property of application in AndroidManifest.xml (```<app-name>/android/app/src/main/```).
```
<application android:name=".Application">
```
- (Option, but recommended) add ```intent-filter``` within the ```<activity>``` tag of ```android/app/src/main/AndroidManifest.xml``` file.
```
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
```
- Add `Application.kt` trong cùng thư mục với `MainActivity.kt` (`<app-name>/android/app/src/main/java/<app-organization-path>/`).
```
package vn.com.fsoft.gst_notification
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingBackgroundService
import io.flutter.plugins.firebase.messaging.FlutterFirebaseMessagingPlugin
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin
import io.flutter.Log
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
class Application : FlutterApplication(), PluginRegistrantCallback {
override fun onCreate() {
super.onCreate()
}
override fun registerWith(registry: PluginRegistry) {
if (registry != null) {
FlutterLocalNotificationPluginRegistrant.registerWith(registry);
}
}
}
class FlutterLocalNotificationPluginRegistrant {
companion object {
fun registerWith(registry: PluginRegistry) {
if (alreadyRegisteredWith(registry)) {
Log.d("Local Plugin", "Already Registered");
return
}
FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"))
Log.d("Local Plugin", "Registered");
}
private fun alreadyRegisteredWith(registry: PluginRegistry): Boolean {
val key = FlutterLocalNotificationPluginRegistrant::class.java.canonicalName
if (registry.hasPlugin(key)) {
return true
}
registry.registrarFor(key)
return false
}
}
}
```
### IOS
- Tạo project iOS trên firebase với bundleId tương ứng
- Tạo APNs certificate firebase messaging
- Add file GoogleService-Info.plist vào project iOS
- Add Capabilities
- Background Modes:
- Background fetch
- Remote notification
- Push notifications
### Payload message
##### Android
* Không được có filed `notification`.
```
{
"to" : "[fcm device token]",
"priority" : "high",
"content-available" : 1,
"data" : {
"title" : "Title of message",
"body" : "Content of message",
"key1" : "value1",
"key2" : "value2"
}
}
```
##### iOS
* Bắt buộc phải có filed `notification`.
```
{
"to":"[fcm device token]",
"notification" : {
"title":"Title of message",
"body":"Content of message",
"sound":"default"
},
"priority" : "high",
"content-available" : 1,
"data" : {
"title" : "Title of message",
"body" : "Content of message",
"key1" : "value1",
"key2" : "value2"
}
}
```
### Sử dụng
- Đảm bảo init trước khi dùng:
`await FirebaseNotification.initialize();`
- Lấy fcm device token (dùng để gửi cho server):
`final token = await FirebaseNotification.instance.getToken();`
- Delete token (khi sign out hoặc hết session, gửi lên server để clear token):
`FirebaseNotification.instance.deleteToken();`
- Get Initial Message khi open app từ Terminated mode, (và Background mode)
`final message = await FirebaseNotification.instance.getInitialMessage();`
- Listen Stream khi có message và mở message ở Foreground Mode
`FirebaseNotification.onMessage.listen((String data) { // todo });`
`FirebaseNotification.onMessageOpenedApp.listen((String data) { // todo });`
---
#### [`Gái xinh ở đây`](https://firebase.flutter.dev/)