Flutter應用整合極光推送

xiangzhihong發表於2020-02-27

概述

在移動應用開發中,訊息推送可以說是一項非常重要的功能,它能夠起到提醒或者喚醒使用者的作用,同時也是產品運營人員更高效地實現運營目標的重要手段,比如將新上架一個商品或者最新的一條新聞推送給使用者。

事實上,訊息推送是一個橫跨業務伺服器、第三方推送服務託管廠商、作業系統長連線推送服務、使用者終端以及移動手機應用等五方面的複雜業務應用場景。在原生iOS開發中,為了簡化訊息推送,蘋果推送服務(簡稱APNs)接管了系統所有應用的訊息通知需求,任何第三方訊息推送都需要經過推送服務進行轉發。對於原生Android平臺來說,則可以使Google提供的類似Firebase雲訊息傳遞機制來實現統一的推送託管服務。

具體來說,當某個應用需要傳送訊息推送時,訊息會由應用的伺服器先發給蘋果或Google的訊息推送伺服器,然後經由APNs或FCM(Google的訊息推送框架)傳送到裝置,裝置接收到訊息後經過系統層面完成解析,最終把訊息轉發給所屬應用,整個工作流程如下圖所示。

在這裡插入圖片描述

不過,由於Google服務在大陸地區並不穩定,因此在國內的Android手機供應商通常會把Google服務換成自己開發的推送服務,並定製一套推送標準,而對於開發者來說,無疑是增大了適配的負擔。所以在處理Android端的訊息推送時,通常會使用第三方推送服務,比如極光、個推和友盟推送等。公司在選擇第三方工具時候,由於權衡的尺度不一樣,所以選擇哪家作為推送服務還得根據實際情況而定。

雖然這些第三方推送服務使用自建的長連線,無法享受作業系統底層的優化,但它們會對所有使用推送服務的應用共享推送通道,只要有一個使用第三方推送服務的應用沒被系統殺死,就可以讓訊息及時送達,因此並不需要考慮訊息到達率的問題。

由於第三方推送服務廠商提供的功能和接入流程大都一致,考慮到極光的社群和生態相對活躍,並且在國內較早的推出Flutter外掛,所以我們可以在Flutter專案中直接使用這個外掛,下圖是極光推送的架構示意圖。

在這裡插入圖片描述

極光推送,英文簡稱JPush,是一個免費的第三方訊息推送服務廠商,圍繞推送服務,極光官方推出了眾多平臺的SDK及外掛,如圖下圖所示。

在這裡插入圖片描述

新增極光外掛

Flutter外掛支援多種依賴方式,通常有3種:git依賴、pub.dev依賴和本地依賴。

通過git 方式依賴

開啟Flutter工程的 pubspec.yaml 配製檔案,然後新增新增 如下依賴程式碼。

# 極光推送外掛
  jpush_flutter:
    # git 依賴方式
    git:
      # git 依賴的地址
      url: git://github.com/jpush/jpush-flutter-plugin.git
      # git 倉庫中的分支
      ref: master
複製程式碼

然後,點選 【Packages get 】下載依賴或者直接在terminal 命令列中 使用【 flutter packages get】命令 來載入依賴,如下圖所示。

在這裡插入圖片描述
直接通過git 的方式從 github上載入,與你的網速有很大關係,也很有可能載入不成功,需要耐心等待。

pub.dev方式依賴

pub 是Google官方的Dart Packages倉庫,類似於node中的npm倉庫,android中的jcenter,我們可以在上面查詢我們需要的包和外掛。我們可以訪問國內的pub倉庫來更快的搜尋我們需要的外掛。

在這裡插入圖片描述
然後在 flutter 專案的 pubspec.yaml 檔案中配製極光推送的pub依賴,如下所示。

jpush_flutter: 0.1.0
jpush_flutter: ^0.1.0
複製程式碼

兩種寫法的區別在於,後者會自動下載更高版本的,比如說這裡配製的是 0.1.0 ,當 pub 倉庫中的版本升級為 0.1.3 的時候,那麼我們專案中本地依賴的版本不一定是 當前設定的 0.1.0 版本,而是其他版本。當然還可以使用下面的方式。

jpush_flutter: any
複製程式碼

前者的區別是 會根據當前的專案環境載入適合當前專案環境中的版本外掛,如有時我們指定版本載入時,會出現各種異常的衝突,當幾個版本中與你使用到的功能無太大差異時,就可以考慮使用這種方法來簡單粗暴的解決。

在這裡插入圖片描述

本地依賴

除了上面兩種方式外,我們還可以把極光推送 flutter 外掛下載到本地,然後在本地進行依賴。首先,去github上下載極光推送flutter外掛的原始碼。

在這裡插入圖片描述
然後把下載下來的 zip 檔案解壓,放到一個目錄中,然後在 flutter 專案中的 pubspec.yaml 配製極光推送的本地依賴,如下所示。

# 極光推送外掛
  jpush_flutter:
    path: ../jpush-flutter-plugin
複製程式碼

這裡使用到的 ../ 是校對路徑的表示方法,當然也可以使用jpush-flutter-plugin資料夾的全路徑。

在這裡插入圖片描述
在 flutter 專案中有多種方式方法來依賴極光推送外掛,依賴成功後如下圖所示。
在這裡插入圖片描述

推送示例

原生配置

Android平臺配置

由於推送會涉及到很多原生的配置,所以為了能夠正常的進行訊息推送,還需要在原生Android和iOS中進行一些配置工作。對於Android平臺來說,配置工作相對簡單,開啟android/app/build.gradle檔案,然後在defaultConfig節點中新增如下程式碼。

android: {
  ....
  defaultConfig {
    applicationId "替換成自己應用ID"
...
//ndk用於真機執行,用來指定對應的晶片架構
    ndk {
	abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a',        
    }

    manifestPlaceholders = [
        JPUSH_PKGNAME : applicationId,
        JPUSH_APPKEY : "appkey", 
        JPUSH_CHANNEL : "developer-default",
    ]
  }    
}

複製程式碼

如下圖所示。

在這裡插入圖片描述
在極光開發者平臺中建立推送應用程式,然後填寫build.gradle指令碼所需的引數,如下圖所示。
在這裡插入圖片描述
然後,在Android手機上執行專案,會有 Running Gradle task ... 的提示,去 maven jcenter 下載 android 平臺使用到的依賴庫以及os庫等。
在這裡插入圖片描述

iOS平臺依賴

對於iOS平臺來說,應用配置相對Android平臺來說要繁瑣一些,因為iOS的推送配置會涉及應用許可權、蘋果APNs服務和極光後臺資訊關聯等過程。

在這裡插入圖片描述
然後,使用Xcode開啟Flutter專案的iOS工程,然後依次選擇【Target】→【Signing & Capabilities】→【Capability】→【Push Notifications】選項開啟應用的訊息推送功能,如下圖所示。
在這裡插入圖片描述
然後,在極光開發者平臺中配製 iOS的相關推送認證。
在這裡插入圖片描述
申請推送證書的過程,極光推送官網提供了比較詳細的操作步驟,可以按照官網的步驟進行申請。然後,在極光開發者服務後臺上傳申請到的推送證書,如下圖所示。

在這裡插入圖片描述
配製好證書後,執行 Flutter 專案於 iphone 手機上,如下圖所示。
在這裡插入圖片描述

執行專案

完成上述操作後,極光推送所需的所有原生環境就配置完成了。接下來,使用Android Studio開啟Flutter工程,在main.dart檔案的initState生命週期函式中新增初始化JPush程式碼,如下所示。

void initState() {
   super.initState();
   JPush jpush = new JPush();
   jpush.setup(
   appKey: "96d7d7e77bee7abd4d568978",
   channel: "flutter_channel",
   production: false,
   debug: true,      //是否列印debug日誌
   );
 }
複製程式碼

然後,啟動Flutter應用,並在開啟極光開發者服務後臺新增一條推送訊息,選擇需要推送的平臺,然後點選【立即傳送】按鈕,如下圖所示。

在這裡插入圖片描述
等待訊息推送成功後,就可以在對應的移動裝置上看到推送的訊息,如下圖所示。
在這裡插入圖片描述

相關文章