移动端推送Flutter Demo
一、对接文档参考
官方Android原生对接:https://help.aliyun.com/document_detail/190063.html
配置厂商通道密钥:https://help.aliyun.com/document_detail/92837.html
小米辅助通道集成:https://help.aliyun.com/document_detail/190011.html
Flutter 集成参考:https://pub.flutter-io.cn/packages/flutter_aliyun_push
二、配置四步曲
1. pubspec.yaml 添加依赖
dependencies:
...
# 阿里云移动推送集成
flutter_aliyun_push: ^0.0.3
2. android -> app -> build.gradle 中 defaultConfig 项 新增配置:
manifestPlaceholders = [
aliyunPushAppKey: "", //阿里云推送appkey
aliyunPushAppSecret:"",//阿里云推送appsecret
pushChannelId:"\\1", //安卓8.0后推送需指定渠道id,后台发送推送需要指定相同值(配置中纯数字需要加\\反斜线)
pushChannelName:"channelname", //安卓8.0后推送需指定用户可以看到的通知渠道的名字.,后台发送推送需要指定相同值(配置中纯数字需要加\\反斜线)
pushChannelDescrition:"channeldesc", //安卓8.0后推送需指定用户可以看到的通知渠道的描述.,后台发送推送需要指定相同值(配置中纯数字需要加\\反斜线)
miPushAppId:"\\2882303761517669764", //小米推送Appid (配置中纯数字需要加\\反斜线)
miPushAppKey:"\\5691766985764", //小米推送AppKey (配置中纯数字需要加\\反斜线)
huaweiPushAppId:"", //华为推送AppId (配置中纯数字需要加\\反斜线)
vivoPushAppId:"", //vivo推送AppId (配置中纯数字需要加\\反斜线)
vivoPushAppKey:"", //vivo推送AppKey (配置中纯数字需要加\\反斜线)
oppoPushAppKey:"", //oppo推送AppKey (配置中纯数字需要加\\反斜线)
oppoPushAppSecret:"", //oppo推送AppKey (配置中纯数字需要加\\反斜线)
meizhuPushAppId:"", //魅族推送AppId (配置中纯数字需要加\\反斜线)
meizhuPushAppKey:"",//魅族推送AppKey (配置中纯数字需要加\\反斜线)
]
备注:没有开通的厂商,可以先空着,但是参数必须写上,一个也不能少。
3. android -> app -> manifests -> AndroidManifest.xml 中,新增权限配置:
<!-- 阿里云推送相关权限 -->
<uses-permission android:name="android.permission.INTERNET" /><!-- 网络权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 检查网络状态 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><!-- 检测Wi-Fi状态 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<!-- 接收推送主要权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- SDK引导升级HMS Core(APK),保存下载的升级包需要SD卡写 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
4. android -> app -> manifests -> AndroidManifest.xml 中 .MainActivity 下 新增配置:
<meta-data android:name="com.alibaba.app.appkey" android:value="${aliyunPushAppKey}"/>
<meta-data android:name="com.alibaba.app.appsecret" android:value="${aliyunPushAppSecret}"/>
<meta-data
android:name="com.huawei.hms.client.appid"
android:value="${huaweiPushAppId}" />
<meta-data
android:name="com.vivo.push.api_key"
android:value="${vivoPushAppKey}" />
<meta-data
android:name="com.vivo.push.app_id"
android:value="${vivoPushAppId}" />
<meta-data
android:name="com.flutter.push.channelId"
android:value="${pushChannelId}" />
<meta-data
android:name="com.flutter.push.channelName"
android:value="${pushChannelName}" />
<meta-data
android:name="com.flutter.push.channeDescrition"
android:value="${pushChannelDescrition}" />
<meta-data
android:name="com.mi.push.api_key"
android:value="${miPushAppKey}" />
<meta-data
android:name="com.mi.push.app_id"
android:value="${miPushAppId}" />
<meta-data
android:name="com.oppo.push.api_key"
android:value="${oppoPushAppKey}" />
<meta-data
android:name="com.oppo.push.app_secret"
android:value="${oppoPushAppSecret}" />
<meta-data
android:name="com.meizhu.push.api_key"
android:value="${meizhuPushAppKey}" />
<meta-data
android:name="com.meizhu.push.app_id"
android:value="${meizhuPushAppId}" />
备注:无需修改,原封不动地考过去。
三、Android 原生代码修改
1.新建 MainApplication.java 文件,继承 FlutterApplication
import io.flutter.app.FlutterApplication;
import com.flutter.flutter_aliyun_push.FlutterAliyunPushPlugin;
public class MainApplication extends FlutterApplication {
@Override
public void onCreate() {
super.onCreate();
// 初始化阿里云 + 厂商通道
FlutterAliyunPushPlugin.initPush(this);
}
}
2. android -> app -> manifests -> AndroidManifest.xml 中 application 新增属性
<application
...
android:name=".MainApplication"
...
备注:android:name必须指向新建的应用,移动推送的监听事件方可在应用启动时注册成功。
四、Flutter 中 注册相关监听事件
// 添加注册成功监听
FlutterAliyunPush.reigistOnRegistSuccess((msg) {
print("注册成功");
platformVersion = 'reigistOnRegistSuccess';
setState(() {
_platformVersion = platformVersion;
});
});
// 添加注册失败监听
FlutterAliyunPush.reigistOnRegistError((msg) {
print("注册失败dddd");
platformVersion = msg;
setState(() {
_platformVersion = platformVersion;
});
});
// 添加收到通知监听
FlutterAliyunPush.reigistOnReceiveNotification((msg) {
print("获取回调通知");
platformVersion = json.encode(msg.toJson());
setState(() {
_platformVersion = platformVersion;
});
});
// 添加收到消息监听
FlutterAliyunPush.reigistOnReceiveMessage((msg) {
print("获取回调消息");
platformVersion = json.encode(msg.toJson());
setState(() {
_platformVersion = platformVersion;
});
});
五、移动端运行结果示例图
六、测试
本测试,除了阿里云通道,还对接了小米厂商通道;想要接收离线通知,必须对接厂商通道。
1. 离线通知接收测试;
2. 在线通知接收测试;
3. 其他情况测试结果,只做参考:
说明:以下通道的关闭和开启,是在设置里对应的app里操作的;
1)关闭厂商通道,不关闭阿里通道,离线通知发出后,app在线后能够收到通知;
2)关闭厂商通道,关闭阿里通道,离线通知发出后,app在线后能够收到消息(通知自动转消息);
3)不关闭厂商通道,关闭阿里通道,离线通知发出后,app在线后收到通知;
4)关闭 app 允许通知 总开关,离线通知发送后,app在线后能够收到消息(通知自动转消息);
5)如果只对接了阿里通道,所有的通知也会转成消息。
七、在对接过程中遇到的问题
1. 在Android原生开发中,Activity 如何关联 Application ?
Application > Activity > Fragment,这一层关系我是知道的,毕竟也看了几本Android开发的书。在新建的Flutter Demo中,默认启动的是 MainActivity,如何在运行 MainActivity 时,也启动自定义的Application呢?其实,只需要在 AndroidManifest.xml 中 application 新增属性 android:name=".MainApplication" 即可。现在看来,这个问题本身问的就不对,但是作为一名Android开发外行,当时确实是这样想的。
2. 注册监听事件总是失败,非得运行App多次,才能监听成功?
在 配置四步曲中,刚开始一直在犹豫有了第二步,是否还需要第四步配置,flutter示例中也没有提到第四步配置,就把第四步配置移除了。结果就成了这样,注册监听事件失败,第三方厂商通道也没有被初始化。所以配置四步曲中,第四步还是必须要配置的,不可少。
最后总结
整个对接流程下来,非常想感叹一下,对接的难度系数并不高,但是对接中的很多参数、配置还需要一一核实验证,少一个参数都不行。有时候,一样的编码,为什么对接总是失败,调查来调查去,还是参数设置的问题,而这样的问题就属于细节问题。把参数配置步骤写的详细些,对接下来就省事多了。