# Redlink Push SDK for Flutter
## About SDK
A Flutter plugin to use the [Redlink Push Notifications](https://www.redlink.pl/mobile-push/).
## Getting Started
### Prerequisites
- Existing Flutter project
- Active [Redlink](https://www.redlink.pl/mobile-push/) account
## Installation
### Android Integration
To integrate your plugin into the Android part of your app, follow these steps:
#### Firebase platform integration
Redlink push is based on Firebase platform. To configure it on Android check the [documentation]( https://firebase.google.com/docs/android/setup)
#### Provide required string resources
Add required tokens to `*.xml` resources, obtained from the Redlink dashboard.

```xml
<string name="redlink_app_id"></string>
<string name="redlink_token"></string>
<string name="redlink_secret"></string>
<string name="redlink_events_token"></string>
```
Add required Firebase Sender ID, obtained from the Firebase dashboard (`Settings -> Cloud Messaging -> Sender ID`)
```xml
<string name="fcm_sender_id"></string>
```
SDK initializes automatically, there are no other actions required.
### iOS Integration
#### Required:
- Valid [iOS Push Token](https://help.apple.com/developer-account/#/deva05921840)
- Physical iOS device (Push services doesn't work in Simulator)
- Redlink account with `AppId`, `Token`, `Secret` and `Events Token`
- Application with deployment target equal or above iOS 10.0
#### Add RedlinkConfig.plist
- Select in Xcode `File` -> `New` -> `File`
- Under Resource section select `Property List`
- Fill `SaveAs` with name `RedlinkConfig.plist` and select Targets (should be both, `project_name` and `project_nameNotificationServiceExtension`)
- Right click on added `RedlinkConfig.plist` and select `Open As` -> `Source Code`
- Add following code instead of original one
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AppId</key>
    <string>your_application_id</string>
    <key>Token</key>
    <string>your_application_token</string>
    <key>Secret</key>
    <string>your_application_secret</string>
    <key>EventsToken</key>
    <string>your_application_events_token</string>
</dict>
</plist>
```
- Replace `your_application_id`, `your_application_token`, `your_application_secret` and `your_application_events_token` with variables obtained from Redlink dashboard.
### Add Notification Service Extension (Optional)
`Notification Service Extension` gives the app capability to render media content within push notification view in Notification Center.
- In Xcode select `File` -> `New` -> `Target`
- Select `Notification Service Extension` and press `Next`
- Fill in `Product Name` with `NotificationServiceExtension`
- Select `Swift` under `Language` section (Even if your project is written in `Obj-C`)
- Skip Activate scheme alert using `Cancel`
- Remove a class body generated by Xcode, import Redlink framework and use `RedlinkNotificationServiceExtension` as a superClass. Your extension should now look like this:

```swift
import Redlink

class NotificationServiceExtension: RedlinkNotificationServiceExtension {

} 
```
### Dart/Flutter Integration
To use this plugin, add `redlink_flutter_sdk` as a dependency in your pubspec.yaml file:
```yaml
dependencies:
    redlink_flutter_sdk: ^1.1.5
```
## Usage
From your Dart code, you need to import the plugin and instantiate it:

```dart
import 'package:redlink_flutter_sdk/redlink_messaging.dart';

final RedlinkMessaging _redlinkMessaging = RedlinkMessaging();
```
### User Identification
In order to update information about user use `RedlinkUser.setUser` method.
You can change each of the following data fields:

- email `String`
- phone `String`
- firstName `String`
- lastName `String`

Validation: 

- `email` requires valid email format
- `email`, `companyName`, `firstName`, `lastName` can be up to 64 length characters
```dart
RedlinkUser.setUser({
    firstName: 'User's name',
    lastName: 'User's last name',
    email: 'User's email address',
    phoneNumber: 'User's phone number',
});
```
### User Removal
There is also posibility to remove all stored user data. To do that call:

```dart
RedlinkUser().removeUser()
```
If you want also to unsubscribe user from Redlink Push Notification Services you can also use additional parameter while removing user like so:
```dart
RedlinkUser().removeUser(deletePushToken: true)
```
### Events Creation
In order to track custom user events use `RedlinkAnalytics` class. It can be accessed by using `trackEvent` static method:

```dart
static void trackEvent({
    @required String eventName,
    @required Map<String, dynamic> parameters,
    String userData,
  })
```
Each event is identified by `eventName` property.
You can also provide additional parameters to an event by populating `parameters` map argument.
Parameters are of type `[String: Any]` - where `Any` is `String` or `Int` or `Bool` or `Date`. Any other type of value will be ignored and removed automatically.

Validation:

- `EventName` can be up to 64 length characters
Besides paramaters you can inject `userData` as Valid JSON String:
### Handling Push Notifications
#### General information
Register `onMessage` callback via `_redlinkMessaging.configure()` to listen for incoming messages.
This will bring up a permissions dialog for the user to confirm on iOS. It's a no-op on Android.
#### Deeplinking
Deeplinking works using the official Platform SDK. In order to handle received URL's use:

```dart
   _redlinkMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
      },
    );
```
`message` will provide information about any information your application might react on by showing additional screen.
## Demo application
Check out the `example` directory for a sample app and see how to integrate Redlink Push Notifications.
