From 29779485b2ae162b5ba3a3d92762fa4388e82ef3 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 12 Jul 2021 10:38:03 +0200 Subject: [PATCH] port push notification guide --- .../assets/dashboard_firebase_enable.jpeg | Bin 0 -> 10753 bytes .../assets/dashboard_firebase_key.jpeg | Bin 0 -> 13315 bytes .../assets/dashboard_save_changes.jpeg | Bin 0 -> 3971 bytes .../assets/firebase_project_settings.jpeg | Bin 0 -> 9407 bytes docusaurus/docs/Flutter/assets/server_key.png | Bin 0 -> 13442 bytes .../guides/adding_push_notifcations.mdx | 229 ++++++++++++++++-- 6 files changed, 214 insertions(+), 15 deletions(-) create mode 100644 docusaurus/docs/Flutter/assets/dashboard_firebase_enable.jpeg create mode 100644 docusaurus/docs/Flutter/assets/dashboard_firebase_key.jpeg create mode 100644 docusaurus/docs/Flutter/assets/dashboard_save_changes.jpeg create mode 100644 docusaurus/docs/Flutter/assets/firebase_project_settings.jpeg create mode 100644 docusaurus/docs/Flutter/assets/server_key.png diff --git a/docusaurus/docs/Flutter/assets/dashboard_firebase_enable.jpeg b/docusaurus/docs/Flutter/assets/dashboard_firebase_enable.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e4696ec8825abe2a04d88bc55e13568c7b75ae0b GIT binary patch literal 10753 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 S5ma6$s22lkF%P1sGyer3DUv1t literal 0 HcmV?d00001 diff --git a/docusaurus/docs/Flutter/assets/firebase_project_settings.jpeg b/docusaurus/docs/Flutter/assets/firebase_project_settings.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..4fbc6521c3f6e5f25fb62dbb406aea0e1d5b34e1 GIT binary patch literal 9407 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 literal 0 HcmV?d00001 diff --git a/docusaurus/docs/Flutter/assets/server_key.png b/docusaurus/docs/Flutter/assets/server_key.png new file mode 100644 index 0000000000000000000000000000000000000000..f11d6fb56b17ea7ac18eb1b99af0fbd605181e68 GIT binary patch literal 13442 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 P6#yAYMTr_Q!@&OnF?4ey literal 0 HcmV?d00001 diff --git a/docusaurus/docs/Flutter/guides/adding_push_notifcations.mdx b/docusaurus/docs/Flutter/guides/adding_push_notifcations.mdx index e0aea320..af82d4f5 100644 --- a/docusaurus/docs/Flutter/guides/adding_push_notifcations.mdx +++ b/docusaurus/docs/Flutter/guides/adding_push_notifcations.mdx @@ -13,24 +13,223 @@ of new messages and old notifications sometimes need to be updated silently as w This guide details how to add push notifications to your app. -### Configure APN +Make sure to check [this section](https://getstream.io/chat/docs/flutter-dart/push_introduction/?language=dart) of the docs to read about the push delivery logic. -Stream Chat supports push for both Android and iOS. +### Setup FCM -In this section you will find all information on how to configure push for APN and Firebase. +To integrate push notifications in your Flutter app you need to use the package [firebase_messaging](https://pub.dev/packages/firebase_messaging). -Only new messages are pushed to mobile devices, all other chat events are only send to WebSocket clients and webhook endpoints if configured. -#### Push Delivery Logic +Follow the [Firebase documentation](https://firebase.flutter.dev/docs/messaging/overview/) to know how to set up the plugin for both Android and iOS. -Push message delivery follows the following logic: -* Only channel members can receive push messages -* Members that are currently online do not receive push messages -* Messages added within a thread are only sent to users that are part of that thread (they posted at least one message or were mentioned) -* Messages from muted users are not sent -* Messages are sent to all registered devices for a user (up to 25) -* Don't try to register devices for anonymous users (API will ignore but will eat from rate limit budget) -* Up to 100 members of a channel will receive push notifications -* skip_push is not marked as true, as described here. -* push_notifications is enabled (default) on the channel type for message is sent. \ No newline at end of file +Once that's done FCM should be able to send push notifications to your devices. + +### Integration with Stream + +#### Step 1 + +From the [Firebase Console](https://console.firebase.google.com/), select the project your app belongs to. + +#### Step 2 + +Click on the gear icon next to `Project Overview` and navigate to **Project settings** + +![](../assets/firebase_project_settings.jpeg) + +#### Step 3 + +Navigate to the `Cloud Messaging` tab + +#### Step 4 + +Under `Project Credentials`, locate the `Server key` and copy it + +![](../assets/server_key.png) + +#### Step 5 + +Upload the `Server Key` in your chat dashboard + +![](../assets/dashboard_firebase_enable.jpeg) + +![](../assets/dashboard_firebase_key.jpeg) + + +:::note +We are setting up the Android section, but this will work for both Android and iOS if you're using Firebase for both of them! +::: + +#### Step 6 + +Save your push notification settings changes + +![](../assets/dashboard_save_changes.jpeg) + +**OR** + +Upload the `Server Key` via API call using a backend SDK + +```js +await client.updateAppSettings({ + firebase_config: { + server_key: 'server_key', + notification_template: `{"message":{"notification":{"title":"New messages","body":"You have {{ unread_count }} new message(s) from {{ sender.name }}"},"android":{"ttl":"86400s","notification":{"click_action":"OPEN_ACTIVITY_1"}}}}`, + data_template: `{"sender":"{{ sender.id }}","channel":{"type": "{{ channel.type }}","id":"{{ channel.id }}"},"message":"{{ message.id }}"}` + }, +}); +``` + +### Registering a device at Stream Backend + +Once you configure Firebase server key and set it up on Stream dashboard a device that is supposed to receive push notifications needs to be registered at Stream backend. This is usually done by listening for Firebase device token updates and passing them to the backend as follows: + +```dart +firebaseMessaging.onTokenRefresh.listen((token) { + client.addDevice(token, PushProvider.firebase); +}); +``` + +### Possible issues + + +We only send push notifications, when the user doesn't have any active websocket connection (which is established when you call client.connectUser). If you set the [onBackgroundEventReceived](https://pub.dev/documentation/stream_chat_flutter/latest/stream_chat_flutter/StreamChat/onBackgroundEventReceived.html) property of the StreamChat widget, when your app goes to background, your device will keep the ws connection alive for 1 minute, and so within this period, you won't receive any push notification. + +Make sure to read the [general push docs](https://getstream.io/chat/docs/flutter-dart/push_introduction/?language=dart) in order to avoid known gotchas that may make your relationship with notifications go bad 😢 + +### Testing if Push Notifications are Setup Correctly + +If you're not sure if you've set up push notifications correctly (eg you don't always receive them, they work unreliably), you can follow these steps to make sure your config is correct and working: + +1. Clone our repo for push testing git clone git@github.com:GetStream/chat-push-test.git + +2. `cd flutter` + +3. In folder run `flutter pub get` + +4. Input your api key and secret in `lib/main.dart` + +5. Change the bundle identifier/application ID and development team/user so you can run the app in your device (**do not** run on iOS simulator, Android emulator is fine) + +6. Add your `google-services.json/GoogleService-Info.plist` + +7. Run the app + +8. Accept push notification permission (iOS only) + +9. Tap on `Device ID` and copy it + +10. Send the app to background + +11. After configuring [stream-cli](https://github.com/GetStream/stream-cli) paste the following command on command line using your user ID + +```shell +stream chat:push:test -u +``` + +You should get a test push notification + +### App in the background but still connected + +The [StreamChat](https://pub.dev/documentation/stream_chat_flutter/latest/stream_chat_flutter/StreamChat-class.html) widget lets you define a [onBackgroundEventReceived](https://pub.dev/documentation/stream_chat_flutter/latest/stream_chat_flutter/StreamChat/onBackgroundEventReceived.html) handler in order to handle events while the app is in the background, but the client is still connected. + +This is useful because it lets you keep the connection alive in cases in which the app goes in the background just for some seconds (eg: multitasking, picking pictures from the gallery...) + +You can even customize the [backgroundKeepAlive](https://pub.dev/documentation/stream_chat_flutter/latest/stream_chat_flutter/StreamChat/backgroundKeepAlive.html) duration. + +In order to show notifications in such a case we suggest using the package [flutter_local_notifications](https://pub.dev/packages/flutter_local_notifications); follow the package guide to successfully set up the plugin. + +Once that's done you should set the [onBackgroundEventReceived](https://pub.dev/documentation/stream_chat_flutter/latest/stream_chat_flutter/StreamChat/onBackgroundEventReceived.html); here is an example: + +```dart +... +StreamChat( + client: client, + onBackgroundEventReceived: (e) { + final currentUserId = client.state.user.id; + if (![ + EventType.messageNew, + EventType.notificationMessageNew, + ].contains(event.type) || + event.user.id == currentUserId) { + return; + } + if (event.message == null) return; + final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + final initializationSettingsAndroid = + AndroidInitializationSettings('launch_background'); + final initializationSettingsIOS = IOSInitializationSettings(); + final initializationSettings = InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsIOS, + ); + await flutterLocalNotificationsPlugin.initialize(initializationSettings); + await flutterLocalNotificationsPlugin.show( + event.message.id.hashCode, + event.message.user.name, + event.message.text, + NotificationDetails( + android: AndroidNotificationDetails( + 'message channel', + 'Message channel', + 'Channel used for showing messages', + priority: Priority.high, + importance: Importance.high, + ), + iOS: IOSNotificationDetails(), + ), + ); + }, + child: .... +); +... +``` + +As you can see we §generate a local notification whenever a message.new or notification.message_new event is received. + +:::note +Using `flutter_local_notifications` is a great way to implement notifications while the is in foreground too! You can generate a local notification listening to events using the method `streamChatClient.on()` and react to the events you want. +::: + +### Saving notification messages to the offline storage + +You may want to save received messages when you receive them via a notification so that later on when you open the app they're already there. + +To do this we need to update the push notification data payload at Stream Dashboard and clear the notification one: + +```json +{ + "message_id": "{{ message.id }}", + "channel_id": "{{ channel.id }}", + "channel_type": "{{ channel.type }}" +} +``` + +Then we need to integrate the package [stream_chat_persistence](https://pub.dev/packages/stream_chat_persistence) in our app that exports a persistence client, learn [here](https://pub.dev/packages/stream_chat_persistence#usage) how to set it up. + +Then during the call `firebaseMessaging.configure(...)` we need to set the `onBackgroundMessage` parameter using a TOP-LEVEL or STATIC function to handle background messages; here is an example: + +```dart +Future myBackgroundMessageHandler(message) async { + if (message.containsKey('data')) { + final data = message['data']; + final messageId = data['message_id']; + final channelId = data['channel_id']; + final channelType = data['channel_type']; + final cid = '$channelType:$channelId'; + + final client = StreamChatClient(apiKey); + final persistenceClient = StreamChatPersistenceClient(); + await persistenceClient.connect(userId); + + final message = await client.getMessage(messageId).then((res) => res.message); + + await persistenceClient.updateMessages(cid, [message]); + persistenceClient.disconnect(); + + /// This can be done using the package flutter_local_notifications as we did before 👆 + _showLocalNotification(); + } +} +``` +