Flutter实现阿里云推送通知的功能

原创
2019/09/20 17:39
阅读数 2.6W

前言:

       Flutter阿里云推送通知就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之前的推送一直都是用Fcm推送,这是我第一次在Flutter项目使用阿里云推送,在一开始使用Rammus插件的时候也遇到一些问题,经过不断的调式,最终实现了"阿里云推送通知"的功能。接下来我简单总结一下在Flutter项目中如何使用Rammus实现阿里云推送,希望对大家有所帮助。

实现的步骤:

1.在pubspec.yaml添加sdk

dependencies:
  ...
  cupertino_icons: ^0.1.2
  # 添加
  rammus: ^1.2.1

2.Android上的配置

解决Rammus插件和项目之间 “Manifest Merge冲突”的问题

2.1在Android project目录下的build.gradle文件中设置Seal插件的地址

buildscript {
    ext.kotlin_version = '1.4.10'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //添加插件
        classpath 'me.xx2bab.gradle:seal-manifest-precheck-plugin:1.0.0' 
    }
}

2.2在Android module的build.gradle文件中引用插件

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
//引用插件
apply plugin: 'seal'

2.3在Android module的build.gradle文件中配置合并时的删除规则

def projectRoot = project.getRootProject().rootDir.absolutePath

android {
    ...
    
    //添加
    def manifestPath = [
            // for AAR of Release
            // see note below
            projectRoot + '/build-cache',
            projectRoot + '/rammus',
            // for AAR of SNAPSHOT
            projectRoot + '/app/build/intermediates/exploded-aar'
    ]

    def removeAttrs = [
            'android:theme'
    ]

    def replaceValues = [
            'android:theme'
    ]


    seal {
        enabled = true
        manifests = manifestPath

        appAttrs {
            enabled = true
            attrsShouldRemove = removeAttrs
        }

        appReplaceValues {
            enabled = true
            valuesShouldRemove = replaceValues
        }
    }


}

2.4在Android根目录下的 gradle.properties 文件中添加如下内容

org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
//添加
android.buildCacheDir=./build-cache

2.5在Android的清单文件修改Application的属性 (重新构建项目,合并冲突的问题就完美解决了)

<application
        android:allowBackup="false"  //添加
        android:name=".MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="flutter_alipush"
        tools:replace="android:allowBackup,android:label,android:icon" //添加
        tools:ignore="GoogleAppIndexingWarning">

3.阿里云平台注册应用

首先去网址:https://emas.console.aliyun.com/  去注册自己的应用,不需要下载  json文件,拿到的AppKey和AppSecret直接放在Android的清单文件相应的位置即可。

  

4.在Android里面写一个application继承自FlutterApplication(阿里云推送要求)

class MyApplication:FlutterApplication() {
    override fun onCreate() {
        super.onCreate()
        PushServiceFactory.init(applicationContext)
        val pushService = PushServiceFactory.getCloudPushService()
        val callback = object : CommonCallback {
            override fun onSuccess(response: String?) {
                Log.e("TAG","success $response")
            }
            override fun onFailed(errorCode: String?, errorMessage: String?) {
                Log.e("TAG","error $errorMessage")
            }
        }
        pushService.register(applicationContext,callback)
        //一定要添加这一句代码
        pushService.setPushIntentService(RammusPushIntentService::class.java)
    }
}

5.在Android的清单文件设置appKey,appSecret (到这里Android的配置就完成了,不用再添加阿里云相关插件,因为Rammus插件已经集成进去了)

<application
        android:allowBackup="false"
        android:name=".MyApplication"
        android:icon="@mipmap/ic_launcher"
        android:label="flutter_alipush"
        tools:replace="android:allowBackup,android:label,android:icon"
        tools:ignore="GoogleAppIndexingWarning"> <!--添加android:name:".MyApplication"-->

        <meta-data
            android:name="com.alibaba.app.appkey"
            android:value="27858563"/> <!--请填写你自己的- appKey-->
        <meta-data
            android:name="com.alibaba.app.appsecret"
            android:value="ab81d560e1ff5afc0c143fe33938e031 "/><!--请填写你自己的- appsecret-->

        <activity></activity>

</application>

6.iOS上的配置

请参考 https://help.aliyun.com/document_detail/30072.html?spm=a2c4g.11186623.6.630.396f40b1t4SLCb

7.导包

import 'package:rammus/rammus.dart' as rammus;

8.获取device id,然后post给后台进行指定设备的推送(post给后台的代码在这里不展示)

//获取device id的方法
  Future<void> initPlatformState() async {
    String deviceId;
    try {
      deviceId = await rammus.deviceId;
    } on PlatformException {
      deviceId = 'Failed to get device id.';
    }
    if (!mounted) return;
    setState(() {
      _deviceId = deviceId;
      //接下来你要做的事情
      //1.将device id通过接口post给后台,然后进行指定设备的推送
      //2.推送的时候,在Android8.0以上的设备都要设置通知通道
    });
  }

9.通知栏的展示以及跳转指定的页面

    //推送通知的处理 (注意,这里的id:针对Android8.0以上的设备来设置通知通道,客户端的id跟阿里云的通知通道要一致,否则收不到通知)
    var channels = List<rammus.NotificationChannel>();
    channels.add(rammus.NotificationChannel(
      "alipush notification",
      "rammus",
      "rammus test",
      importance: rammus.AndroidNotificationImportance.MAX,
    ));
    rammus.onNotificationOpened.listen((data){//这里是点击通知栏回调的方法
      print("-----------> ${data.summary} 被点了");
      //点击通知后跳转的页面
      Navigator.of(context).push(new MaterialPageRoute(
          builder: (ctx) => new SettingPage()));
    });
  }

10.阿里云平台的推送(关键设置)

11.总结:

在Flutter上已经实现”阿里云推送通知“的功能啦,欢迎大家围观。源码地址: https://github.com/wupeilinloveu/flutter_alipush ,如果有什么疑问的话,可以留言联系我哦!

展开阅读全文
打赏
3
2 收藏
分享
加载中
请问有遇到过手机退出app进行后台运行,和手机息屏的时候接收不到阿里云推送的消息吗?
2020/10/12 17:37
回复
举报
EmilyWu博主
暂时没有。你遇到这种情况,有断点调试吗?
2020/10/13 11:19
回复
举报
console里能打印出消息数据,但是RammusPushIntentService.kton的Notification方法未被执行。还会显示一行信息‘E/MPS:AliyunPushIntentService( 9253):Send message fail’
2020/10/13 16:00
回复
举报
EmilyWu博主
app在前台运行的时候能收到阿里云推送的消息吗?阿里云平台的通知通道设置了吗?要和Flutter的rammus里面的id一致
2020/10/13 16:07
回复
举报
前台运行时能正常接收,熄屏时间短能正常接收,时间长就会接收不到消息
2020/10/21 09:55
回复
举报
该评论暂时无法显示,详情咨询 QQ 群:912889742
EmilyWu博主
我暂时没这个打算哦,不过github上也一些自定义推送,你可以参考一下
2020/06/11 15:20
回复
举报
谢谢姐姐,如何搜索有没有好的建议呢
2020/06/11 16:36
回复
举报
更多评论
打赏
8 评论
2 收藏
3
分享
返回顶部
顶部