先奉上Demo地址
話不多說,直接開干。
第一步:注冊、登陸JPush官網并創建應用
注冊登陸JPush官網
-
添加一個項目,輸入項目名稱并設置圖標。
創建應用 -
然后進行推送設置,設置Android的包名以及iOS的證書。
-
Android 報名設置。
Android推送設置 iOS配置。
-
用Xcode打開我們的項目,或者項目目錄中找到 ios-> Runner.xcodeproj 然后雙擊Runner.xcodeproj運行。
用Xcode打開項目
-
-
在Runner中設置 Bundle Identifier的值為正確的包名。
配置包名
-
為了防止在編譯時會自動變更,所以最好將info.plist中的配置也修改一下。
配置包名
-
證書配置。
由于我沒有蘋果開發者的賬號,所以這一步我無法操作。有興趣的可以參考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
-
打開極光推送后臺。
極光推送后臺
-
配置標題以及推送內容。
標題和內容
-
如果有需要還可以配置附加字段。
附加字段
-
Android特有的配置(選配)。
特殊配置
-
目標人群配置。
設置目標人群
-
點擊發送預覽。
發送預覽
-
點擊確定。
推送成功
遇到的問題。
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可以臨時例外(就是可以通過)
-
解決:
- 在Info.plist中添加NSAppTransportSecurity,按回車自動更改成應用程序傳輸安全設置,類型字典;
- 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads按回車自動改變成Allowrary Loads,類型布爾值,值設置YES;
配置結果
總結:
總之在Flutter中集成JPush還是比較簡單的,幾行代碼就可以實現。但是唯一的缺點是JPush的廠商通道是收費的。
吐槽:
本來不想吐槽的,但是不吐槽心里不好受,哎……
推送這東西如果沒有廠商通道支持的話到達率真的非常低,尤其是在高版本的Android系統中(iOS不存在這個問題),就這一點上感覺極光不如阿里的推送實惠。無奈阿里官方并沒有出Flutter的插件。而且阿里的客服也沒有極光的客服熱情,等了快一個小時沒有回復我,哎……。下面是與阿里客服的聊天記錄:
以上就是我本次在Flutter項目中接入JPush整個演示過程,記錄下來方便以后查閱,分享出來希望能幫到別人。好了本文結束,聽懂掌聲!