• Flutter之安卓端极光推送使用


    极光推送官网

    一、创建app基本使用

    1:在项目的pubspec.ymal文件里导入极光推送的包。版本记录和使用方法可在
    https://pub.flutter-io.cn/packages/jpush_flutter/install里面进行查找。

    第一步:创建应用程序
    在这里插入图片描述

    第二步:修改包名
    找到flutter项目,配置xml文件修改包名

    如下错误是未修改包名引起的
    在这里插入图片描述

    找到/android/app/src/main/AndroidManifest.xml文件中的标签名称:

    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="APP名字" 
    
    • 1
    • 2
    • 3
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="your.package.name">
    
    • 1
    • 2

    在这里插入图片描述

    defaultConfig {
        applicationId "your.package.name"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    修改android/app/src/main/kotlin/com/weixunbang/jingzhunke/MainActivity.kt类中的包

    package your.package.name
    
    import androidx.annotation.NonNull;
    import io.flutter.embedding.android.FlutterActivity
    import io.flutter.embedding.engine.FlutterEngine
    import io.flutter.plugins.GeneratedPluginRegistrant
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改/android/app/src/main/kotlin下的文件路径名称,如图

    在这里插入图片描述

    第三步:配置build.gradle

    在这里插入图片描述

    defaultConfig {
        applicationId "com.example.item_3"//极光包名
        minSdkVersion 21//jpush最小版本不低于17
        targetSdkVersion 30
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        ndk {
            //选择要添加的对应 cpu 类型的 .so 库。
            abiFilters 'armeabi', 'x86'//一般x86就够用
        }
        //     ndk {
        //     //选择要添加的对应 cpu 类型的 .so 库。
        //     abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'
        // }
        manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId,
                JPUSH_APPKEY : "1cc2aa6c462ee304af984b24", // NOTE: JPush 上注册的包名对应的 Appkey.
                JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    更改极光包名

    在这里插入图片描述

    否则就会在弹出框中弹出JPush提示信息:包名和AppKey不匹配

    第四步:配置编写页面

    import 'package:flutter/material.dart';
    import 'package:jpush_flutter/jpush_flutter.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatefulWidget {
      const MyApp({Key key}) : super(key: key);
    
      @override
      State<MyApp> createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      final JPush jpush = JPush();
    
      @override
      void initState() {
        // TODO: implement initState
        super.initState();
        initJpush();
      }
    
      Future initJpush() async {
        jpush.applyPushAuthority(
            new NotificationSettingsIOS(sound: true, alert: true, badge: true));
        //获取注册的id
        jpush.getRegistrationID().then((rid) {
          //这里说一下 若别处需要使用rid 如此调用   await jpush.getRegistrationID()
          print("获取注册的id:$rid");
        });
        //初始化
        jpush.setup(
          appKey: "3e8cb50326d15ea2c09201cc",
          channel: "thisChannel",
          production: false,
          debug: true, // 设置是否打印 debug 日志
        );
    
        //设置别名  实现指定用户推送
        jpush.setAlias("supperman").then((map) {
          print("设置别名成功");
        });
    
        try {
          //监听消息通知
          jpush.addEventHandler(
            // 接收通知回调方法。
            onReceiveNotification: (Map<String, dynamic> message) async {
              print("flutter onReceiveNotification: $message");
            },
            // 点击通知回调方法。
            onOpenNotification: (Map<String, dynamic> message) async {
              print("flutter onOpenNotification: $message");
            },
            // 接收自定义消息回调方法。
            onReceiveMessage: (Map<String, dynamic> message) async {
              print("flutter onReceiveMessage: $message");
            },
          );
        } catch (e) {
          print('极光sdk配置异常');
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: Scaffold(
            appBar: AppBar(
              title: const Text("极光推送"),
            ),
            body: Container(
              child: Column(
                children: [
                  FlatButton(
                      onPressed: () {
                        var fireDate = DateTime.fromMillisecondsSinceEpoch(
                            DateTime.now().millisecondsSinceEpoch + 2000);
                        var localNotification = LocalNotification(
                            id: 3,
                            title: '(验证码)',
                            buildId: 1,
                            content: '验证码,仅用于密码修改',
                            fireTime: fireDate,
                            subtitle: '验证码',
                            badge: 5,
                            extra: {"": ""});
                        jpush
                            .sendLocalNotification(localNotification)
                            .then((value) {
                          print(value);
                        });
                      },
                      child: Text("推送消息"))
                ],
              ),
            ),
          ),
        );
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107

    在这里插入图片描述

    二、厂商通道配置,基本使用
    1. 生成jks文件

    1.需要打开VScode终端输入:

    keytool -genkey -v -keystore C:\Users\NULL\Desktop\6.14\key_1.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
    
    • 1

    2.有了这个key.jks文件后,可以到项目目录下的android文件夹下,创建一个名为key.properties的文件,并打开粘贴下面的代码。

    storePassword=<password from previous step>    //输入上一步创建KEY时输入的 密钥库 密码
    keyPassword=<password from previous step>    //输入上一步创建KEY时输入的 密钥 密码
    keyAlias=key
    storeFile=<E:/key.jks>    //key.jks的存放路径···
    
    • 1
    • 2
    • 3
    • 4

    3.进入项目目录的/android/app/build.gradle文件,在android{这一行前面,加入如下代码:
    在这里插入图片描述

    4.把如下代码进行替换

    def keystorePropertiesFile = rootProject.file("key.properties")
    def keystoreProperties = new Properties()
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))    
    signingConfigs {
            debug {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
            release {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
    
     buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    查看密钥信息

    keytool -list -v -keystore android.keystore
    
    • 1

    在这里插入图片描述

    1. 集成配置

    这里以华为为例子,最终要拿到这两个参数

    华为参数获取
    在这里插入图片描述

    华为开发者联盟

    点开推送服务

    在这里插入图片描述

    添加项目后选择配置

    在这里插入图片描述

    1. 添加配置文件

    在这里插入图片描述

    1. 配置SDK

    华为Android使用文档

    设置项目级 build.gradle,加入华为库maven

    buildscript {
        ext.kotlin_version = '1.3.50'
        repositories {
            google()
            mavenCentral()
            maven { url 'http://developer.huawei.com/repo/'}
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:4.1.0'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            // hms,若不集成华为厂商通道,可直接跳过
            classpath 'com.huawei.agconnect:agcp:1.6.0.300'
        }
    }
    
    allprojects {
        repositories {
            google()
            mavenCentral()
            //hms,若不集成华为厂商通道,可直接跳过
            maven {url 'http://developer.huawei.com/repo/'}
        }
    }
    
    rootProject.buildDir = '../build'
    subprojects {
        project.buildDir = "${rootProject.buildDir}/${project.name}"
    }
    subprojects {
        project.evaluationDependsOn(':app')
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    在这里插入图片描述

    设置模块级 build.gradle

    • 配置极光参数,接入华为通道minSdkVersion要17以上,注意唯一不同的是华为还能在华为开发平台获得一个json文件(在创建应用时就提供了),这个是需要放到应用里的app目录下,并且需要在android/app目录下的build.gradle里使用上。这里比较好的点是不需要再手动配置appId这些参数了。
    android {
                    ......
                    defaultConfig {
                        applicationId "com.xxx.xxx" //JPush 上注册的包名.
                        ......
    
                        ndk {
                            //选择要添加的对应 cpu 类型的 .so 库。
                            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
                        }
    						 // 设置manifest.xml中的变量,这里是例子,具体设置什么要与文档对应
                        manifestPlaceholders = [
                            JPUSH_PKGNAME : applicationId,
                            //JPush 上注册的包名对应的 Appkey.
                            JPUSH_APPKEY : "你的 Appkey ", 
                            //暂时填写默认值即可.
                            JPUSH_CHANNEL : "developer-default",
                            //若不集成厂商通道,可直接跳过以下配置
                            MEIZU_APPKEY : "MZ-魅族的APPKEY",
                            MEIZU_APPID : "MZ-魅族的APPID",
                            XIAOMI_APPID : "MI-小米的APPID",
                            XIAOMI_APPKEY : "MI-小米的APPKEY",
                            OPPO_APPKEY : "OP-oppo的APPKEY",
                            OPPO_APPID : "OP-oppo的APPID",
                            OPPO_APPSECRET : "OP-oppo的APPSECRET",
                            VIVO_APPKEY : "vivo的APPKEY",
                            VIVO_APPID : "vivo的APPID"
                            HONOR_APPID : "Honor的APP ID", 
                        ]
                        ......
                    }
                    repositories {
                        flatDir {
                            dirs 'libs'
                        }
                    }       
                    ......
                }
    
    
                dependencies {
                    ......
                    // 此处以JCore 3.3.0 版本为例。
                    implementation 'cn.jiguang.sdk:jcore:3.3.0'
                    // 此处以JPush 4.7.2 版本为例
                    implementation 'cn.jiguang.sdk:jpush:4.7.2'  
                    
                    //若不集成厂商通道,可直接跳过以下依赖
                    // 极光厂商插件版本与接入 JPush 版本保持一致,下同
                    // 接入华为厂商
                    implementation 'com.huawei.hms:push:6.3.0.304'
                    implementation 'cn.jiguang.sdk.plugin:huawei:4.7.2'
                    // 接入 FCM 厂商
                    implementation 'com.google.firebase:firebase-messaging:23.0.5'
                    implementation 'cn.jiguang.sdk.plugin:fcm:4.7.2'
                    // 接入魅族厂商
                    implementation 'cn.jiguang.sdk.plugin:meizu:4.7.2'
                    // 接入 VIVO 厂商
                    implementation 'cn.jiguang.sdk.plugin:vivo:4.7.2'
                    // 接入小米厂商
                    implementation 'cn.jiguang.sdk.plugin:xiaomi:4.7.2'
                    // 接入 OPPO 厂商
                    implementation 'cn.jiguang.sdk.plugin:oppo:4.7.2'
                    // JPush Android SDK v4.6.0 开始,需要单独引入 oppo 厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/oppo/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下
                    implementation(name: 'com.heytap.msp-push-3.0.0', ext: 'aar')
    
                    //以下为 OPPO 3.0.0 aar需要依赖
                    implementation 'com.google.code.gson:gson:2.6.2'
                    implementation 'commons-codec:commons-codec:1.6'
                    implementation 'androidx.annotation:annotation:1.1.0'
                    // 接入荣耀厂商
                    implementation 'cn.jiguang.sdk.plugin:honor:4.7.2' 
                    //需要单独引入荣耀厂商 aar ,请下载官网 SDK 包并把 jpush-android-xxx-release/third-push/honor/libs 下的 aar 文件单独拷贝一份到应用 module/libs 下
                    implementation(name: 'HiPushSdk-v6.0.4.101-release', ext: 'aar')
                    implementation(name: 'HiPushSdkCommon-v6.0.4.101-release', ext: 'aar')
                    ......
                }
    
                apply plugin: 'com.google.gms.google-services'
                apply plugin: 'com.huawei.agconnect'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    在这里插入图片描述

    查看flutter插件中对应的版本

    在这里插入图片描述

    华为push官方文档

    • 加入华为依赖包
    dependencies {
        //JPush Android SDK 4.6.0 以上版本更新华为 HMS SDK 版本为:6.3.0.304,接入要求:Android Studio 3.6.1 或更高版本、Android Gradle 插件 3.5.4 或更高版本。
        implementation 'com.huawei.hms:push:6.3.0.304'
        //厂商版本和 JPush SDK 版本保持一致
        implementation 'cn.jiguang.sdk.plugin:huawei:4.x.x'
    }
    dependencies {
     // 接入华为厂商
         // 此要与jpush版本号保持一致
         //implementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
       //=====================添加============================
        // // 接入华为厂商
        implementation 'com.huawei.hms:push:5.3.0.301'
        implementation 'cn.jiguang.sdk.plugin:huawei:4.6.0'// 极光厂商插件版本与接入 JPush 版本保持一致,下同
        
    }
    ...
    // Add the information to the bottom of the file.加入插件代码
         apply plugin: 'com.huawei.agconnect'              
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    根节点加入命名空间属性 xmlns:tools=“http://schemas.android.com/tools” application节点加入属性 tools:replace=“android:label”
    加入两个Service
    在这里插入图片描述

    运行代码时要使用对应的提供商接口,也就是手机型号与配置对应,不然匹配不到

  • 相关阅读:
    计算机竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别
    CustomTkinter:创建现代、可定制的Python UI
    计算机三级信息安全笔记(知识点)
    React中实现插槽效果的方案
    有 Docker 谁还在自己本地安装 Mysql
    【多线程笔记01】多线程之CountDownLatch介绍及其使用
    电影【忠犬帕尔玛】
    【毕业设计】大数据分析的航空公司客户价值分析 - python
    机器学习笔记之粒子滤波(一)序列重要性采样
    基于文化优化算法图像量化(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/qq_43547255/article/details/126103821