# 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格式即可,不用做其他处理