Aliyun 移动推送对接 之 移动端 Flutter 接收 Demo

移动端推送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示例中也没有提到第四步配置,就把第四步配置移除了。结果就成了这样,注册监听事件失败,第三方厂商通道也没有被初始化。所以配置四步曲中,第四步还是必须要配置的,不可少。


最后总结

整个对接流程下来,非常想感叹一下,对接的难度系数并不高,但是对接中的很多参数、配置还需要一一核实验证,少一个参数都不行。有时候,一样的编码,为什么对接总是失败,调查来调查去,还是参数设置的问题,而这样的问题就属于细节问题。把参数配置步骤写的详细些,对接下来就省事多了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值