Flutter集成个推推送-安卓原生篇

这篇具有很好参考价值的文章主要介绍了Flutter集成个推推送-安卓原生篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flutter集成个推推送-安卓原生篇

前言

在众多的集成化推送中选择了个推,个推在flutter集成中还是比较简单的,只需要跟着官网一步一步走就可以了。今天这篇文章不涉及到flutter项目个推的集成,只是记录个推离线走安卓厂商时,进行获取一个离线的点击通知数据。

在个推的官网中提供的例子是java的,不符合我的意向,再加上flutter默认是kotlin的,所以本篇文章也是以kotlin的代码为主。

准备工作

项目以集成个推推送并配置好了个推的appId和各方厂商的appIdappKey等。

在服务端的推送代码配置中需要添加push_channel键值对,可以参考下面的代码。

{
    "push_channel":{
        "android":{
            "ups":{
                "notification":{
                    "title":"标题",
                    "body":"内容",
                    "click_type":"intent",
                    "url": "", // 不填
                    "intent": ""
                }
            }
        }
    }
}

原生配置说明

intent 已下面这种为参考进行配置。

  • host: host。这个是自定义的想咋写就咋写。
  • scheme: 协议方案。这个是自定义的想咋写就咋写。
  • package: app 包名。
  • component: 是一个启动的 Activity。
  • payload: 自定义传递的参数。

intent://host?#Intent;scheme=scheme;launchFlags=0x4000000;package=package;component=component;S.payload=payload;S.gttask=;end

配置好的样子大概就是下面这个样子:

intent://host?#Intent;scheme=scheme;launchFlags=0x4000000;package=package;component=包名/包名.MainActivity;S.payload=payload;S.gttask=;end

我们需要在android/app/src/main/AndroidManifest.xmlactivity中找到你配置个推的那块添加下面这样一段代码:

  • host: 这里的host就是上文中配置的host
  • path: 这个可以随便写,根据自己需求来。
  • scheme: 也是上文中的scheme
<data android:host="host" android:path="path" android:scheme="scheme" />

大概就是下面这个样子的:

<activity
    android:name=".MainActivity"
    android:exported="true"
    android:launchMode="singleTop"
    ...
    >
    ...
    
    
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

            <!-- 自定义的 -->
            <data android:host="host" android:path="path" android:scheme="scheme" />
    </intent-filter>
    
    ...
</activity>

上面这样就已经配置好了,现在开始来写代码。

上路

打开项目的android/app/src/main/kotlin/com/xx/xx/MainActivity.kt文件,引入下面的依赖。

import android.content.Intent 
import android.os.Bundle
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.embedding.engine.FlutterEngine

然后在MainActivity类中申明通道名称和payload。

// 通道名称
protected var channel: String = "通道名称";

// 获取推送,发给flutter
protected var payLoad: String? = null;

编写原生kotlin代码

我们需要重写onCreateonNewIntentconfigureFlutterEngine这三个方法,我们自己进行重新就可以了,在创建的项目代码中是没有这三个方法的。

一、onCreate

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // 获取自定义透传参数值
    val intent: Intent? = getIntent()
    if (null != intent) {
        payLoad = intent.getStringExtra("payload")
    }
}

二、onNewIntent

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)

    // 获取自定义透传参数值
    if (null != intent) {
        payLoad = intent.getStringExtra("payload")
    }
}

三、configureFlutterEngine

这里我们设置一个名为getIntentData的方法名,并进行判断是否是传递的这个方法名,并进行相关处理。我们后面获取数据全靠它。

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)

    payLoad = intent.getStringExtra("payload");

    try {

        // 通过MethodChannel调用通知flutter开启参数
        MethodChannel(
                flutterEngine.dartExecutor.binaryMessenger,
                channel
        ).setMethodCallHandler { call: MethodCall, result: MethodChannel.Result -> 
            if (call.method == "getIntentData") {
                result.success("$payLoad")
            } 
        }

    } catch (err: Exception) {}

}

编写dart代码

现在我们回到flutter层面,开始写dart的代码,并进行与我们写的通道进行通信。

申明一个getIntentFuture的异步函数,并创建通道。这里的通道名称一定要和上面我们写的原生通道名称一致,不然没法调用通信。

getIntent() async {
    // 设置通道名称
    const MethodChannel channel = MethodChannel("通道名称");
}

通过invokeMethod的形式去调用我们在原生方面外露的方法名。

String result = await channel.invokeMethod("getIntentData");

接下来判断result是否是正确的值,因为我这边在原生那边通信的时候是将它转成了一个字符串,所以我们判断的是否要以字符串的形式去判断。像下面这样。

if (['null'].contains(result)){}

当我们拿到合规正确的值过后就可以全程在flutter层面进行调用使用了。由于他是一个字符串,我需要将他转成Map的形式来方便使用。

try {
    Map data = json.decode(result);
} catch (error) {
    throw Exception('from-> $result to Map fail, incorrect format');
}

注意

我这里在服务端传递payload的数据时是一个被json化了的字符串,如果朋友你不是这种的字符串记得加处理哦。

如果不知道什么是被json化了的字符串,可以看下面这个:

“{a: 1}”

这个我们就写完啦。这个不能边跑边调试,需要每次以离线跑进行调试,还是稍微有点麻烦。只能以冷启动进行调试。

完整代码

原生代码:

package 包名

import io.flutter.embedding.android.FlutterActivity

import android.content.Intent 
import android.os.Bundle
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.embedding.engine.FlutterEngine

class MainActivity: FlutterActivity() {

    // 通道名称
    protected var channel: String = "通道名称";
    
    // 获取推送,发给flutter
    protected var payLoad: String? = null;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 获取自定义透传参数值
        val intent: Intent? = getIntent()
        if (null != intent) {
            payLoad = intent.getStringExtra("payload")
        }
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)

        // 获取自定义透传参数值
        if (null != intent) {
            payLoad = intent.getStringExtra("payload")
        }
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        payLoad = intent.getStringExtra("payload");

        try {

            // 通过MethodChannel调用通知flutter开启参数
            MethodChannel(
                    flutterEngine.dartExecutor.binaryMessenger,
                    channel
            ).setMethodCallHandler { call: MethodCall, result: MethodChannel.Result -> 
                if (call.method == "getIntentData") {
                    result.success("$payLoad")
                } 
            }

        } catch (err: Exception) {}
    }


}

flutter代码:

Future<Map<String, dynamic>> getIntent() async {
    // 设置通道名称
    const MethodChannel channel = MethodChannel("通道名称");
    
    String result = await channel.invokeMethod("getIntentData");
    Map<String, dynamic> resultData = {};

    if (['null'].contains(result)){
        return resultData;
    }

    try {
        Map data = json.decode(result);
        resultData = data as Map<String, dynamic>;
    } catch (error) {
        throw Exception('from-> $result to Map fail, incorrect format');
    }
    
    return resultData;        
}

最后

以上就是本篇文章的全部内容,希望对此时此刻的你有所帮助。文章来源地址https://www.toymoban.com/news/detail-455626.html

到了这里,关于Flutter集成个推推送-安卓原生篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter:flutter_local_notifications——消息推送的学习

    注: 刚开始学习,如果某些案例使用时遇到问题,可以自行百度、查看官方案例、官方github。 简介 Flutter Local Notifications是一个用于在Flutter应用程序中显示本地通知的插件。它提供了一个简单而强大的方法来在设备上发送通知,以便用户可以在应用程序处于后台或设备锁定状

    2024年02月15日
    浏览(67)
  • flutter开发实战-实现推送功能Push Notification

    flutter开发实战-实现推送功能Push Notification 推送服务现在可以说是所有 App 的标配了,最近在Flutter工程项目上实现推送功能。flutter上实现推送功能需要依赖原生的功能,需要插件实现,这里使用的是极光推送的服务。 效果图如下 在使用极光推送功能时,需要使用的是极光提

    2024年02月16日
    浏览(46)
  • flutter极光推送配置厂商通道(华为)笔记--进行中

    厂商通道相关参数申请教程 集成厂商 集成指南 官方文档:厂商通道回执配置指南 注意:不同厂商对app上架的要求不同,华为、荣耀 对app上架没有硬性要求 解决方案: application 标签下的应用名属性值不要直接赋值中文字符串,应用名属性值引用strings文件中定义的参数。 ①

    2024年01月25日
    浏览(47)
  • flutter 极光推送配置流程(极光通道/华为厂商/IOS)

    极光推送配置流程 配置时间 2024年3月11日 应用列表 - 创建应用 Android - 选中消息推送 - 下一步 创建Flutter项目 填写包名 创建完成 运行命令行 flutter pub add jpush_flutter Android - app - build.gradle 更改 JPUSH_APPKEY 的值 工具类注册JPush Android main.dart 运行项目在Android端,有getRegistrationID,则

    2024年04月22日
    浏览(39)
  • Android,ios,安卓app推送消息通知,java后台向手机推送app的通知教程

    个推是商用级的移动应用消息推送云服务供应商,客户端 SDK 支持 Android 和 iOS 两大平台,开发者集成 SDK 后,可以通过个推强大的 web 端及丰富的 API 开放接口,发送推送消息、统计分析推送效果。可有效提高 App 活跃度,增加用户留存率。 如果您还没有个推 账号,可在 个推

    2024年02月04日
    浏览(46)
  • 极光笔记|极光消息推送服务的云原生实践

    极光始终秉承“以开发者为中心”的战略导向 ,极光推送(JPush)是国内领先的消息推送服务。极光推送(JPush)本质上是一种软件付费应用程序,结合当前主流云厂商基础施设,逐渐演进成了云上SaaS服务。作为SaaS服务,必然要考虑云原生架构。因此,在极光推送(JPush)日

    2024年03月25日
    浏览(44)
  • 前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)

    前提概述:此文章都是基于uniapp中uniPush2实现的在线、离线推送 登录开发者中心先填写好项目信息以及配置厂商 在manifest.json文件中勾选推送模块 打包自定义基座 在前端项目中创建云函数(此云函数的作用是接受后台发送的消息模板,解析出来后,发送给到uniapp后台,以此触

    2024年02月09日
    浏览(46)
  • SpringBoot集成WebSocket(实时消息推送)

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 调试工具 :http://coolaf.com/tool/chatt

    2024年04月29日
    浏览(44)
  • swift 项目集成友盟推送

    1, 需要用桥接文件 , 不然引用不到依赖库 2, 可以用测试模式测试, 可以debug 3, 测试模式获取deviceToken, 添加测试设备 deviceToken获取方法 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let device = NSData.init(data: deviceToken)

    2024年02月12日
    浏览(39)
  • Android 集成firebase 推送(FCM)

    1,集成firebase 基础 1googleService文件 2项目级gradle 3app级gradle 4setting  2,推送相关 重点: 源文档:设置 Firebase Cloud Messaging 客户端应用 (Android) (google.com) 1清单文件 4主启动Activity(清单文件里设置 action android:name=\\\"android.intent.action.MAIN\\\" / 的Activity) ==================结束==============

    2024年04月22日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包