Flutter項目接入極光推送

先奉上Demo地址

話不多說,直接開干。


第一步:注冊、登陸JPush官網并創建應用

  • 注冊登陸JPush官網

  • 添加一個項目,輸入項目名稱并設置圖標。

    創建應用
  • 然后進行推送設置,設置Android的包名以及iOS的證書。

    • Android 報名設置。

      Android推送設置
    • iOS配置。

    1. 用Xcode打開我們的項目,或者項目目錄中找到 ios-> Runner.xcodeproj 然后雙擊Runner.xcodeproj運行。


      用Xcode打開項目
  1. 在Runner中設置 Bundle Identifier的值為正確的包名。


    配置包名
  1. 為了防止在編譯時會自動變更,所以最好將info.plist中的配置也修改一下。


    配置包名
  1. 證書配置。

    由于我沒有蘋果開發者的賬號,所以這一步我無法操作。有興趣的可以參考JPush官方提供的文檔

第二步:啟動你的Flutter項目集成極光推送。

  • 安裝jpush_flutter插件

    在你項目的pubspec.yaml文件中的dependencies節點下添加以下代碼

    dependencies:
      flutter:
        sdk: flutter
    
      jpush_flutter: 0.6.0  #極光推送插件
    
  • Android配置

    /android/app/build.gradle 中添加下列代碼:

    android: {
      ....
      defaultConfig {
        applicationId "替換成自己應用 ID"
        ...
        ndk {
          //選擇要添加的對應 cpu 類型的 .so 庫。
          abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'      
        }
    
        manifestPlaceholders = [
            JPUSH_PKGNAME : applicationId,
            JPUSH_APPKEY : "appkey", // NOTE: JPush 上注冊的包名對應的 Appkey.
            JPUSH_CHANNEL : "developer-default", //暫時填寫默認值即可.
        ]
      }    
    }
    
  • iOS配置

    在 xcode8 之后需要點開推送選項: TARGETS -> Capabilities -> Push Notification 設為 on 狀態。


    開啟 Push Notification
    開啟后

第三步:初始化jpush_flutter插件。

  • 調用setup方法初始化JPush

    添加初始化方法,調用 setup 方法會執行兩個操作:

    • 初始化 JPush SDK
    • 將緩存的事件下發到 dart 環境中。

    注意: 插件版本 >= 0.0.8 android 端支持在 setup 方法中動態設置 channel,動態設置的 channel 優先級比 manifestPlaceholders 中的 JPUSH_CHANNEL 優先級要高。

    JPush jPush = new JPush();
        jPush.setup(
          appKey: "bcc3d18e3b34f08315860bea",
          channel: "developer-default",
          production: false,
          debug: true, // 設置是否打印 debug 日志
        );
    
  • 獲取 registrationId,這個 JPush 運行通過 registrationId 來進行推送。

    print("=======JPushId:${await jPush.getRegistrationID()}");
    
  • 停止推送功能,調用該方法將不會接收到通知。

    jPush.stopPush()
    
  • 調用 stopPush 后,可以通過 resumePush 方法恢復推送。

    jPush.resumePush();
    
  • 設置別名,極光后臺可以通過別名來推送,一個 App 應用只有一個別名,一般用來存儲用戶 id。

    print("=======setAlias:${await jPush.setAlias("PushTest")}");
    
  • 可以通過 deleteAlias 方法來刪除已經設置的 alias。

    print("=======deleteAlias:${await jPush.deleteAlias()}");
    
  • 添加推送監聽。

    jPush.addEventHandler(
          // 接收通知回調方法。
          onReceiveNotification: (Map<String, dynamic> message) async {
            print("flutter onReceiveNotification: $message");
          },
          // 點擊通知回調方法。
          onOpenNotification: (Map<String, dynamic> message) async {
            print("flutter onOpenNotification: $message");
          },
          // 接收自定義消息回調方法。
          onReceiveMessage: (Map<String, dynamic> message) async {
            print("flutter onReceiveMessage: $message");
          },
        );
    
  • iOS10+ 可以通過下面的方法來設置推送是否前臺展示,是否觸發聲音,是否設置應用角標 badge:

if (Platform.isIOS) {
  jPush.applyPushAuthority(new NotificationSettingsIOS(sound: true, alert: true, badge: true));
}

第四步:測試推送。

  • Android
  1. 打開極光推送后臺。


    極光推送后臺
  1. 配置標題以及推送內容。


    標題和內容
  1. 如果有需要還可以配置附加字段。


    附加字段
  1. Android特有的配置(選配)。


    特殊配置
  1. 目標人群配置。


    設置目標人群
  1. 點擊發送預覽。


    發送預覽
  1. 點擊確定。


    推送成功

遇到的問題。

1. Android最小版本必須大于等于17.

  • 現象: 在Flutter項目中集成JPush后執行flutter run命令拋出一下異常:

    編譯報錯
  • 解決:只需要將build.gradle中的minSdkVersion設置為17即可:

    defaultConfig {
      applicationId "com.kelin.flutter_jpush_demo"
      minSdkVersion 17  //更改這里的版本為17
      targetSdkVersion 29
      versionCode flutterVersionCode.toInteger()
      versionName flutterVersionName
    }
    

2. Xcode7以上版本不支持http請求的問題。

  • 現象:會拋出以下錯誤。

    由于不安全,因此App Transport Security阻止了明文HTTP(http://)資源加載。可以通過應用程序的Info.plist文件配置臨時異常。
    
    意思就是:App Transport Security(應用程序傳輸安全)阻止了一個明文HTTP傳輸,因為它是不安全的,配置你的Info.plist可以臨時例外(就是可以通過)
    
  • 解決:

    1. 在Info.plist中添加NSAppTransportSecurity,按回車自動更改成應用程序傳輸安全設置,類型字典;
    2. 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads按回車自動改變成Allowrary Loads,類型布爾值,值設置YES;
    配置結果

總結:

總之在Flutter中集成JPush還是比較簡單的,幾行代碼就可以實現。但是唯一的缺點是JPush的廠商通道是收費的。

吐槽:

本來不想吐槽的,但是不吐槽心里不好受,哎……
推送這東西如果沒有廠商通道支持的話到達率真的非常低,尤其是在高版本的Android系統中(iOS不存在這個問題),就這一點上感覺極光不如阿里的推送實惠。無奈阿里官方并沒有出Flutter的插件。而且阿里的客服也沒有極光的客服熱情,等了快一個小時沒有回復我,哎……。下面是與阿里客服的聊天記錄:


聊天記錄

以上就是我本次在Flutter項目中接入JPush整個演示過程,記錄下來方便以后查閱,分享出來希望能幫到別人。好了本文結束,聽懂掌聲!


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容