# FlutterPushPlugin **Repository Path**: mLeeyao/FlutterPushPlugin ## Basic Information - **Project Name**: FlutterPushPlugin - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pusher A new Flutter push plugin, which based on HuaWei / XiaoMi push service. ## Getting Started >当前本为HuaWei和XiaoMi集成版本,在非华为手机模式下可以进行小米推送. >但是需要注意,在非小米手机下,如果应用被杀掉,将会没法及时收到推送内容 ### 分两部分,主要为flutter集成.第二部分为后端数据推送约束 ### 第一部分:插件集成 #### Flutter配置 1. 引入插件,包含两种方式,按自己的情况引入,选择一种就可以 * 在自己的flutter项目pubspec.yaml文件中添加: ``` dependencies: flutter: sdk: flutter # git方式引入 pusher: git: url: http://gitlab/securityofzs/flutter_push_plugin.git ref: master # 手动方式 # 1-> 在flutter下面创建plugins目录 # 2-> 将插件拷贝到plugins目录下 pusher: path: plugins/flutter_push_plugin ``` * 运行flutter pub get * 如果一些报错,可以另外开启android studio打开插件,让项目构建引用资源 * 依赖成功之后,需要另外打开Android Studio,开启flutter工程下的android工程,自动构建 * 如果构建成功,在左边的目录列表可以看到app以及pusher插件目录. 2. 使用插件 ``` import 'package:pusher/pusher.dart'; import 'package:pusher/pusher_data.dart'; ``` 具体使用参考example下的main.dart示例 #### Android端配置: 强力建议在另外Android Studio中额外打开flutter下的android项目操作 1. 资源拷贝:进入目录:插件->example->android->app->src->main 1. 将上面main目录下面的assets拷贝到,自己工程对应android相应目录下. 2. assets目录下的agconnect-services.json为华为推送配置文件 3. 根据自己的appId去华为开发者平台注册应用,获得自己的配置文件,并覆盖该文件 2. 接着第一步的目录:main->java->com.hw.pusher_example 1. 将DeepLinkActivity拷贝到自己flutter工程的android相应目录下,和MainActivity同级. 2. 在AndroidManifest.xml配置DeepLinkActivity,添加以下代码,具体可参考example下的配置,里面包名需要替换 ``` ``` 3. AndroidManifest.xml里面标签之上添加小米配置,并将[]中的包名替换成自己的报名 ``` ``` 3. 实现自己的flutter android目录下的MainActivity和Application类,并进行配置 1. 找到MainActivity文件,将FlutterActivity更改为HWPushActivity,具体参考example工程的MainActivity 2. 创建MyApp文件,参考example的MyApp内容,里面为小米推送的配置,需到小米平台注册应用获得appId和appKey ``` public class MyApp extends HWPushApplication { @Override public String getMiAppId() { return "2882303761518364667";//替换为自己的小米appId } @Override public String getMiAppKey() { return "5111836496667";//替换为自己的小米appKey } } ``` 3. 在AndroidManifest.xml文件中配置,将application标签之下的android:name值替换为MyApp ``` android->app目录下 1. 给自己flutter项目下的android目录proguard-rules.pro添加以下内容,如果没有可以直接将文件拷贝到自己对应的目录下 ``` -ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} #这里com.xiaomi.mipushdemo.DemoMessageRreceiver改成app中定义的完整类名 -keep class com.hw.pusher.push.mi.MiMessageReceiver {*;} #可以防止一个误报的 warning 导致无法成功编译,如果编译使用的 Android 版本是 23。 -dontwarn com.xiaomi.push.** ``` 2. 配置build.gradle文件, * minSdkVersion 17 #以上 ``` signingConfigs { release { storeFile file('common_key.jks')//替换为自己的路径,以及自己的签名文件 keyAlias 'huawei'//替换为自己参数 keyPassword 'huawei'//替换为自己参数 storePassword 'huawei'//替换为自己参数 v1SigningEnabled true//替换为自己参数 v2SigningEnabled true//替换为自己参数 } } //分别在release和debug添加签名 buildTypes { release { signingConfig signingConfigs.release } debug { signingConfig signingConfigs.release } } ``` *** ### 第二部分,数据协议(含服务器端) #### flutter插件数据解析 1. pusher.dart, 推送数据流 2. pusher_data.dart 推送数据流的解析类,建议用PushData对数据解析.PushData字段说明 |字段|类型|说明| |:------|:----:|:----| |action |int |0:表示传递的token;1:表示推送消息| |type |String|手机类型,HUAWEI或者XIAOMI| |token |String|当action=0时,token非空| |message|String|当action=1时,message非空,按服务端约定为json格式| #### 华为和小米都是打开应用传递参数 #### 华为推送 1. 根据自己的应用包名去华为开发者平台注册应用,并获得对应的配置文件.配置参考=>Android端配置:1.1 2. 生成指纹(SHA256证书指纹),并配置指纹.如何生成请参考平台介绍. 3. 华为的混淆配置,参考=>Android端配置:步骤4 4. 配置DeepLinkActivity, 参考=>Android端配置:步骤2 #### 华为推送之服务器端约定:即服务器端应当知道的处理逻辑 1. 华为推送,通过打开应用-> 自定义intetnUri ` push_scheme://com.hw.pusher_example/deeplink?#Intent;launchFlags=0x4000000;S.name=JTdCJTIyYmFjayUyMiUzQTg3OCU3RA;end ` 2. intentUri说明 * 将com.hw.pusher_example替换为自己的包名 * S.name是参数key,JTdCJTIyYmFjayUyMiUzQTg3OCU3RA为value * 参数的value为json字符串,并通过java的base64加密,URLCoder格式化 3. 客户端会通过上面的intentUri进行本地解密. #### 小米推送 1. 根据自己的应用包名去小米开发者平台注册应用,并获得appId和appKey. 2. 参考=>Android端配置:步骤3, 设置小米的appId和appKey #### 小米推送之服务器约定:即服务器端应当知道的处理逻辑 1. 小米为打开应用,并传递参数 2. 这个参数为json格式即可,不用做其他处理