天天看點

Flutter 63: 圖解 Flutter 內建極光 JPush 小結

      我們每天都在接收各種推送消息,而最初的 Flutter 推送主要是與原生互動進行;現階段極光推出了 Flutter JPush ,雖不如原生強大,但日常需求均可滿足,小菜嘗試內建了 Flutter 版的 JPush;

前期準備

  1. 極光 背景新增賬號并【建立應用】;
Flutter 63: 圖解 Flutter 內建極光 JPush 小結
  1. 在【推送設定】中設定 Android/iOS 基本資訊,小菜以 Android 為例,注意應用包名為 ApplicationID;
Flutter 63: 圖解 Flutter 內建極光 JPush 小結
  1. 在【應用資訊】中擷取 AppKey 等關鍵參數;
    Flutter 63: 圖解 Flutter 內建極光 JPush 小結

中期內建

Android 配置

      與原生接入 JPush 相同,需要在 Android Gradle 加入配置資訊;

defaultConfig {
    applicationId "com.example.flutterapp01"
    minSdkVersion 16
    targetSdkVersion 28
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    ndk {
        //選擇要添加的對應 cpu 類型的 .so 庫。
        abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'
    }

    manifestPlaceholders = [
        JPUSH_PKGNAME : "com.example.flutterapp01",
        JPUSH_APPKEY : "AppKey", // NOTE: JPush 上注冊的包名對應的 Appkey.
        JPUSH_CHANNEL : "developer-default", //暫時填寫預設值即可.
    ]
}           
Flutter 63: 圖解 Flutter 內建極光 JPush 小結

Flutter 配置

      按照平常插件接入的方法在工程 pubspec.yaml 中加入 jpush_flutter: 0.1.0 并同步即可;

dependencies:
  jpush_flutter: 0.1.0           

API 調用

JPush 的使用方式很簡單,Demo 中都很全面,小菜僅嘗試常見的方法;

1. 初始化

      在原生開發中各類三方的插件幾乎均須在 Application 中初始化,同樣 Flutter 也需要先調用 JPush.setup 進行初始化;其中 channel 可自定義,小菜未從源碼中擷取準确消息,個人了解與高版本的 Android Channel 通道類似;

      初始化成功之後即可擷取消息推送,隻是暫不能處理;

final JPush _jPush = JPush();

@override
void initState() {
  super.initState();
  initPlatformState();
}

Future<void> initPlatformState() async {
  _jPush.setup(
    appKey: "背景擷取 AppKey",
    channel: "flutter_channel",
    production: false,
    debug: true,
  );
  if (!mounted) return;
}           
2. RegistrationID

      每個使用者均有作為接收消息的唯一辨別 RegistrationID,友善對單個或多個裝置進行推送測試;

_jPush.getRegistrationID().then((rid) {
  setState(() {
    _result = "JPush RegistrationID 唯一辨別:\n $rid";
    _registID = rid;
  });
});           
3. 本地通知

      JPush 提供了本地推送的方法,可以靈活調用擷取本地推送消息;注意 id 為 int 類型,設定不能過長;

// 源碼分析
const LocalNotification ({
    @required this.id,          // 通知 id, 可用于取消通知
    @required this.title,       // 通知标題
    @required this.content,     // 通知内容
    @required this.fireTime,    // 通知觸發時間(毫秒)
    this.buildId,               // 通知樣式:1 為基礎樣式,2 為自定義樣式(需先調用 'setStyleCustom' 設定自定義樣式)
    this.extra,                 // 額外資訊
    this.badge = 0,             // iOS:本地推送觸發後應用角标值
    this.soundName,             // iOS:指定推送的音頻檔案
    this.subtitle               // iOS:子标題
}): 

onTap: () {
  var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 3000);
  var localNotification = LocalNotification(
      id: 000001,
      title: 'Local Push 本地标題',
      buildId: 1,
      content: 'Local Push 本地内容',
      fireTime: fireDate,
      extra: {"extra_key": "extra_value"});
  _jPush.sendLocalNotification(localNotification).then((res) {
    setState(() {
      _result = res;
    });
  });
}           
Flutter 63: 圖解 Flutter 內建極光 JPush 小結
4. 通知類消息

      小菜內建原生推送時分為 通知類消息 和 透傳類消息(自定義消息),兩種推送略有不同;通知類消息可以通過極光背景配置消息标題、消息内容等多種資訊,且 App 接收到之後直接調用推送通道展現在通知欄中;

try {
  _jPush.addEventHandler(
    onReceiveNotification: (Map<String, dynamic> message) async {
      // 擷取通知資料
      print('Flutter JPush 擷取通知類資料:\n $message');
      setState(() {
        _result = 'Flutter JPush 擷取通知類資料:\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}           
5. 透傳類消息

      透傳類消息通過極光背景配置發送,主要配置通知内容;App 接收到不會直接調用推送通道,擷取内容後我們可根據内容靈活使用,是否展示推送消息或其他操作等;且通知類消息與透傳類消息擷取參數不同;

try {
  _jPush.addEventHandler(
    onReceiveMessage: (Map<String, dynamic> message) async {
      // 擷取透傳資料
      print('Flutter JPush 擷取透傳類資料:\n $message');
      setState(() {
        _result = 'Flutter JPush 擷取透傳類資料:\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}           
6. 推送點選監聽

      擷取到推送之後注定要有點選操作,JPush 也同樣提供了監聽方法,包括通知類消息和本地推送消息;

try {
  _jPush.addEventHandler(
    onOpenNotification: (Map<String, dynamic> message) async {
      // 點選通知資訊
      print('Flutter JPush 點選通知消息:\n $message');
      setState(() {
        _result = 'Flutter JPush 點選通知消息:\n $message';
        _message = message;
      });
    }
  );
} on PlatformException {
  platformVersion = 'Failed to get platform version.';
}           
7. 清空通知欄

      在使用者收到推送通知後若未點選,原生 Android 可通過 NotificationManager.cancel() 清除通知,Flutter 也提供了清空通知欄方法;但小菜測試隻可清空通知類推送消息,本地發送的通知消息無法清空;

Future clearAllNotifications() async {
  await _channel.invokeMethod('clearAllNotifications');
}

_jPush.clearAllNotifications();           

後期測試

1. 通知類消息

  1. 在極光背景【發送通知】中按要求編輯目标平台、通知标題、通知内容、發送時間和選擇目标等基本資訊;
Flutter 63: 圖解 Flutter 內建極光 JPush 小結
  1. App 接收消息,并展示推送消息,各參數如下:
    Flutter 63: 圖解 Flutter 內建極光 JPush 小結

2. 透傳類消息

  1. 在極光背景【自定義消息】中按要求編輯目标平台、通知内容、發送時間和選擇目标等基本資訊;其中 Registration ID 為測試時擷取的唯一辨別;
    Flutter 63: 圖解 Flutter 內建極光 JPush 小結
  2. App 接收消息,不會展示推送消息,若需要可調用本地通知;各參數如下:
onOpenNotification: (Map<String, dynamic> message) async {
  setState(() {
    _result = 'Flutter JPush 點選通知消息:\n $message';
    _message = message;
    Map<String, dynamic> message2 = convert.jsonDecode(_message['extras']['cn.jpush.android.EXTRA']);
    if (message2['type'] == "1") {
      Toast.show('自定義通知消息!', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
    }
  });
}

onReceiveMessage: (Map<String, dynamic> message) async {
  setState(() {
    _result = 'Flutter JPush 擷取透傳類資料:\n $message';
    _message = message;
    Map<String, dynamic> message2 = convert.jsonDecode(_message['message']);
    var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 2000);
    var localNotification = LocalNotification(
        id: message2['id'],
        title: message2['title'],
        buildId: 1,
        content: message2['context'],
        fireTime: fireDate,
        extra: {"type": message2['type']});
    _jPush.sendLocalNotification(localNotification).then((res) {
      setState(() { _result = res; });
    });
  });
}           
Flutter 63: 圖解 Flutter 內建極光 JPush 小結

      小菜認為 Flutter 版的極光推送與 Android 原生版本的差異在于,大部分的配置有 App 端移到了極光背景,包括圖示 icon,頁面處理,通知級别等;小菜僅嘗試了基本的消息推送及處理,還是有很多細節需要認真學習;如有問題,請多多指導!

來源: 阿策小和尚

繼續閱讀