【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一

极光推送配置流程

相关文章

推送配置共三篇(如下链接)
【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一
【Flutter】极光推送配置流程(小米厂商通道) 章二
【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

极光通道(在线)

配置时间 2024年3月11日

创建应用

在这里插入图片描述
应用列表 - 创建应用
在这里插入图片描述
Android - 选中消息推送 - 下一步

创建Flutter项目
在这里插入图片描述
填写包名
在这里插入图片描述

创建完成
在这里插入图片描述

项目配置

运行命令行 flutter pub add jpush_flutter
在这里插入图片描述

Android -> app -> build.gradle 更改JPUSH_APPKEY的值
在这里插入图片描述
在这里插入图片描述

工具类注册JPush Android

import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:jpush_flutter/jpush_flutter.dart';

class JPushUtil {
  JPushUtil._internal();

  static final _instance = JPushUtil._internal();

  factory JPushUtil() => _instance;

  final JPush jPush = JPush();

  Future<void> initPlatformState() async {
    String? platformVersion;
    try {
      jPush.addEventHandler(
        onReceiveNotification: (message) async {
          print("flutter onReceiveNotification: $message");
        },
        onOpenNotification: (message) async {
          print("flutter onOpenNotification: $message");
        },
        onReceiveMessage: (message) async {
          print("flutter onReceiveMessage: $message");
        },
        onReceiveNotificationAuthorization: (message) async {
          print("flutter onReceiveNotificationAuthorization: $message");
        },
        onConnected: (message) {
          print("flutter onConnected: $message");
          return Future(() => null);
        },
      );
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
      print(platformVersion);
    }
    jPush.isNotificationEnabled().then((bool value) {
      print("通知授权是否打开: $value");
      if (!value) {
        Get.snackbar(
          "提示",
          "没有通知权限,点击跳转打开通知设置界面",
          duration: const Duration(seconds: 6),
          onTap: (_) {
            jPush.openSettingsForNotification();
          },
        );
      }
    }).catchError((onError) {
      print("通知授权是否打开: ${onError.toString()}");
    });

    jPush.enableAutoWakeup(enable: true);
    jPush.setup(
      appKey: '7f684a39ff1f95ef1657acdd',
      production: true,
      debug: true,
    );
    jPush.applyPushAuthority(
      const NotificationSettingsIOS(
        sound: true,
        alert: true,
        badge: true,
      ),
    );
    final rid = await jPush.getRegistrationID();
    print("flutter getRegistrationID: $rid");
  }

  setAlias(String aliasStr) {
    final alias = jPush.setAlias(aliasStr);
    print("Alias is $alias");
  }
}

main.dart

import 'package:demonstration_project/jPushUtil.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter 极光推送',
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  
  void initState() {
    JPushUtil().initPlatformState();
    super.initState();
  }

  
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Center(
        child: Text("极光推送配置"),
      ),
    );
  }
}

运行项目

运行项目在Android端,有getRegistrationID,则注册成功
在这里插入图片描述

测试接收推送之前,先打开接收通知的权限
在这里插入图片描述

在极光平台检测集成
在这里插入图片描述

推送消息

平台推送

直接在平台客户端输入对应的数值来推送消息
在这里插入图片描述
在这里插入图片描述
注:当APP被杀死后,极光通道的推送就不能及时收到了,所以要配置厂商通道

推送API

通过接口调用推送

厂商通道(华为)

创建项目 创建应用

应用服务 - PUSH
在这里插入图片描述
在这里插入图片描述
继续
在这里插入图片描述
选择中国
在这里插入图片描述
开通推送服务
在这里插入图片描述
在这里插入图片描述
添加应用
在这里插入图片描述
输入相关信息
在这里插入图片描述
下载agconnect-services.json
在这里插入图片描述
放到应用级目录下
在这里插入图片描述

SHA256证书指纹

在这里插入图片描述

生成签名jks

生成签名文件的参考文档链接
在这里插入图片描述
创建新的Key
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

生成签名证书指纹

** keytool -list -v -keystore ./demostration_project_key.jks**
在这里插入图片描述

配置SHA256证书指纹

在这里插入图片描述

项目配置

若出现以下报错
在这里插入图片描述
修改Manifest.xml文件
在这里插入图片描述

修改android/build.gradle文件
在这里插入图片描述

buildscript {
    ext.kotlin_version = '1.9.0'
    repositories {
        google()
        mavenCentral()
        // 配置HMS Core SDK的Maven仓地址。
        maven { url 'https://developer.huawei.com/repo/' }
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    }
}
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url 'https://developer.huawei.com/repo/' }
    }
}

若出现以下报错
在这里插入图片描述
那说明漏了配置AGC插件,参考相关链接
在这里插入图片描述
接着添加依赖
在这里插入图片描述

dependencies {
    // 极光推送  'cn.jiguang.sdk:jpush:5.2.3' 和 'cn.jiguang.sdk.plugin:huawei:5.2.3' 版本需一致
    implementation 'cn.jiguang.sdk:jpush:5.2.3'
    implementation 'com.huawei.agconnect:agconnect-core:1.8.1.300'
    implementation 'com.huawei.hms:push:6.12.0.300'
    implementation 'cn.jiguang.sdk.plugin:huawei:5.2.3' // 这里版本一定要和极光插件版本一致!!!
}

最后配置签名文件,若出现以下错误,就代表没有配置签名
在这里插入图片描述
在这里插入图片描述

    signingConfigs {
        debug {
            //keystore中key的别名
            keyAlias 'demo_key'
            //keystore中key的密码
            keyPassword '123456'
            //keystore的文件路径,可以是绝对路径也可以是相对路径
            storeFile file('../demostration_project_key.jks')
            //keystore的密码l
            storePassword '123456'
        }
    }

最后在极光平台厂商通道配置设置App ID 和App Secret,并启用
在这里插入图片描述

华为平台配置

在这里插入图片描述
回执配置参考链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里的自分类是华为控制滥发消息的,需要设置一下,参考链接
在这里插入图片描述
选一个要发的场景
在这里插入图片描述
填写信息,和场景相关的信息
在这里插入图片描述
在这里插入图片描述
激活功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

找一台华为手机来运行项目

若出现以下这句,就代表配置成功了
在这里插入图片描述
这里的检测会有延迟,真机测试能离线收到消息就ok
在这里插入图片描述

错误集锦

1、版本不一致

1、极光厂商插件版本和JPush版本不一致,即便输出huawei token,也是收不到离线消息的

    // 极光推送  'cn.jiguang.sdk:jpush:5.2.3' 和 'cn.jiguang.sdk.plugin:huawei:5.2.3' 版本需一致
    implementation 'cn.jiguang.sdk:jpush:5.2.3'
    // 华为
    implementation 'com.huawei.agconnect:agconnect-core:1.8.1.300'
    implementation 'com.huawei.hms:push:6.12.0.300'
    implementation 'cn.jiguang.sdk.plugin:huawei:5.2.3'

2、权限

网络权限记得加上

<uses-permission android:name="android.permission.INTERNET" />

Ios

官方配置参考链接

Push

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Podfile

在这里插入图片描述

  pod 'JPush'
  pod 'JOperate'
  pod 'JCore'

终端 pod install
在这里插入图片描述

Token Authentication配置

在这里插入图片描述
developer.apple.com
在这里插入图片描述
后续步骤直接参考上面的链接,很详细
最后获取到的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行项目

在这里插入图片描述
配置完成

推送API

推送API参考文档

鉴权方式

用冒号拼接appkey和masterSecret,并用base64加密该字符串,最终再拼上"Basic "

    final content = utf8.encode("$appKey:$masterSecret");
    String base64AuthString = "Basic ${base64Encode(content)}";

测试代码

import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '推送',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '信息推送'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final String appKey = "XXX";
  final String masterSecret = "XXX";
  late String base64AuthString;
  final Dio dio = Dio();

  late String notificationAlert;
  late String notificationTitle;
  late String notificationAudienceAlias;

  
  void initState() {
    final content = utf8.encode("$appKey:$masterSecret");
    base64AuthString = "Basic ${base64Encode(content)}";
    super.initState();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: ListView(
            children: [
              TextField(
                decoration: const InputDecoration(
                  labelText: "主标题",
                  hintText: "请输入...",
                ),
                onChanged: (s) {
                  notificationAlert = s;
                },
              ),
              TextField(
                decoration: const InputDecoration(
                  labelText: "副标题",
                  hintText: "请输入...",
                ),
                onChanged: (s) {
                  notificationTitle = s;
                },
              ),
              TextField(
                decoration: const InputDecoration(
                  labelText: "别名",
                  hintText: "请输入...",
                ),
                onChanged: (s) {
                  notificationAudienceAlias = s;
                },
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: ElevatedButton(
                  onPressed: () {
                    showDialog(
                        context: context,
                        builder: (context) {
                          return SimpleDialog(
                            title: const Text("确定发送?"),
                            children: [
                              SimpleDialogOption(
                                child: const Text("确定"),
                                onPressed: () {
                                  pushMessage(
                                    notificationAlert: notificationAlert,
                                    notificationTitle: notificationTitle,
                                    notificationAudienceAlias: [
                                      notificationAudienceAlias
                                    ],
                                  );
                                  Navigator.of(context).pop();
                                },
                              ),
                              SimpleDialogOption(
                                child: const Text("取消"),
                                onPressed: () {
                                  Navigator.of(context).pop();
                                },
                              )
                            ],
                          );
                        });
                  },
                  child: const Text("推送消息"),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  /// 推送
  pushMessage({
    required String notificationAlert,
    required String notificationTitle,
    required List<String> notificationAudienceAlias,
  }) async {
    const String url = "https://api.jpush.cn/v3/push";
    var data = json.encode({
      "platform": ["android", "ios"],
      "inapp_message": {"inapp_message": false},
      "options": {
        "classification": 0,
        "time_to_live": 86400,
        "apns_production": false,
        "third_party_channel": {
          "huawei": {
            "skip_quota": false,
            "distribution": "secondary_push",
            "channel_id": "",
            "category": "DEVICE_REMINDER",
            "receipt_id": ""
          }
        }
      },
      "notification": {
        "alert": notificationAlert,
        "android": {
          "alert": notificationAlert,
          "title": notificationTitle,
          "intent": {"url": "intent:#Intent;action=android.intent.action.MAIN;end"},
          "sound": "",
          "priority": 0,
          "category": "",
          "alert_type": 7,
          "style": 0,
          "builder_id": 0,
          "large_icon": "",
          "badge_add_num": 1,
          "extras": {
            "param": "123"
          }
        },
        "ios": {
          "alert": {
            "title": notificationAlert,
            "body": notificationTitle,
          },
          "content-available": 0,
          "mutable-content": 1,
          "sound": "default",
          "badge": "+1",
          "thread-id": "",
          "interruption-level": "active",
          "filter-criteria": "",
          "extras": {
            "参数": "A"
          }
        }
      },
      "audience": {
        "alias": notificationAudienceAlias,
      }
    });
    final response = await dio.request(
      url,
      data: data,
      options: Options(
        headers: {
          HttpHeaders.authorizationHeader: base64AuthString,
        },
        method: "POST",
      ),
    );
    print(response.data.toString());
  }
}

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 对于您提出的问题,我可以回答。华为 OBS 存储是一种云存储服务,它可以为开发者提供预定义的标准对象存储服务,并可以实现数据的安全存储、复制、备份和恢复。它使用Flutter作为其开发平台,可以实现快速开发和部署,提高了开发者项目的效率。 ### 回答2: 华为obs存储是一种云存储服务,而flutter是一种跨平台的移动应用开发框架。华为obs存储和flutter可以结合使用,实现在移动应用中使用云存储功能。 使用flutter开发应用时,可以利用华为obs存储的API和SDK,实现文件上传、下载、管理等功能。开发者可以通过调用华为obs存储的接口,将移动应用中的文件传输到华为云的存储空间中,或者从华为云的存储空间中下载文件到应用中进行使用。 华为obs存储提供了稳定可靠的存储服务,具备高可用性和高扩展性,能够满足不同规模的应用需求。同时,华为obs存储还提供了数据加密、多副本备份等安全措施,保障数据的安全性和可靠性。 在使用flutter开发应用时,如果需要使用云存储功能,可以选择集成华为obs存储,通过华为obs存储的API进行文件的上传和下载操作,实现应用和云存储之间的数据传输。这样可以充分利用云存储的优势,提高应用的数据存储和传输效率,为用户提供更好的使用体验。 综上所述,华为obs存储和flutter可以很好地结合使用,实现移动应用中的云存储功能。开发者可以通过调用华为obs存储的接口,实现文件的上传、下载和管理等操作,提升应用的数据存储和传输效率,为用户提供更好的使用体验。 ### 回答3: 华为OBS存储是华为云提供的对象存储服务,而Flutter是由Google开发的跨平台移动应用开发框架。 华为OBS存储可以用于存储各种类型的数据,包括图片、视频、文档等。在Flutter开发中,我们可以利用华为OBS存储来上传、下载和管理这些数据。 首先,我们需要在华为云平台上创建一个OBS存储桶,用于存放我们的数据。然后,通过Flutter提供的网络请求库,我们可以使用华为OBS提供的API接口来实现文件的上传和下载。 在Flutter中,我们可以使用一些第三方库来简化与华为OBS存储的交互。例如,可以使用dio库来发送网络请求,通过设置请求头和参数来实现文件的上传和下载。我们可以使用华为OBS提供的Access Key和Secret Key来进行身份验证,并指定需要上传或下载的文件路径。 除了上传和下载,我们还可以利用华为OBS存储的其他功能。例如,可以通过Flutter应用程序与华为OBS存储进行通信,实时获取存储桶的状态信息,如获取当前存储桶中文件的列表、删除指定的文件等操作。 综上所述,华为OBS存储与Flutter的结合可以实现方便、高效的文件上传、下载及管理功能。通过利用华为OBS存储在移动应用开发中的优势,我们可以提供更好的用户体验和数据管理能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheng_er_sheng

打赏是什么?好吃么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值