华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

news2024/9/23 6:20:51

场景介绍

通知消息通过Push Kit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。

开通权益

Push Kit根据消息内容,将通知消息分类为服务与通讯资讯营销两大类别,开放通知消息自分类权益。

两种类型的通知消息在提醒方式、消息展示位置、推送数量上皆存在差异。更多说明与权益申请详情参见申请通知消息自分类权益。

说明

  • 若您仅需发送资讯营销类(category取值为MARKETING)消息,则无需申请通知消息自分类权益。
  • 资讯营销类消息每天可发送消息数量根据应用类型分为2条5条,若您发送通知消息被频控,请参考下方频控规则,尝试发送测试消息或申请自分类权益。

频控规则

调测阶段,每个项目每日全网最多可推送1000条测试消息。发送测试消息需设置testMessage为true。

正式发布阶段,单设备单应用下每日推送消息总条数受设备消息频控限制,所有场景化消息发送条数不超过3000条。

服务通讯类消息与资讯营销类消息存在不同的频控策略,详情请参见通知消息推送数量管理规则。

开发步骤

  1. 获取Push Token。
  2. 为确保应用可正常收到消息,建议应用发送通知前调用requestEnableNotification()方法弹出提醒,告知用户需要允许接收通知消息。详情请参见Notification Kit-请求通知授权。
  3. 应用服务端调用Push Kit服务端的REST API推送通知消息,请求示例如下:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 0
    },
    "notifyId": 12345
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​
  • [projectId]:项目ID,登录AppGallery Connect网站,选择“我的项目”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
  • Authorization:JWT格式字符串,可参见Authorization获取。
  • push-type:0表示Alert消息,此处为通知消息场景。
  • category:表示通知消息自分类的类别,MARKETING为资讯营销类消息,更多类别可参见category获取。
  • actionType:0表示点击消息打开应用首页。
  • token:Push Token,可参见获取Push Token获取。
  • testMessage:测试消息标识,true表示测试消息。每个项目每天限制发送1000条测试消息,单次推送可发送Token数不超过10个。详情请参见testMessage。
  • notifyId:(选填)自定义消息标识字段,仅支持数字,范围 [0, 2147483647],若要用于消息撤回则必填。详情请参见notifyId

4. 发送成功后,可检查设备是否收到通知消息。

点击消息动作

点击消息进入应用首页并传递数据

  1. 发送消息时clickAction中携带data字段并设置actionType字段为0:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 0,
    "data": {"testKey": "testValue"}
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​

    • actionType:点击消息的动作,0表示点击消息后进入首页。
    • data:点击消息时携带的JSON格式的数据。
  2. 在应用首页中(通常为项目模块级别下的src/main/module.json5mainElement的值)的onCreate()方法中覆写如下代码:
    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class MainAbility extends UIAbility {
    onCreate(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    onNewWant()方法中覆写如下代码:

    1. import { UIAbility, Want } from '@kit.AbilityKit';
      import { hilog } from '@kit.PerformanceAnalysisKit';
      export default class MainAbility extends UIAbility {
      onNewWant(want: Want): void {
      // 获取消息中传递的data数据
      const data = want.parameters;
      hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
      // 根据实际业务场景对data进行处理
      }
      }

    注意

    onNewWant()方法仅在单例(singleton)模式下可用。

  3. 当点击消息首次进入应用首页时,会在onCreate()方法中获取消息data数据,当前应用进程存在时,点击新消息进入首页会在onNewWant()方法中获取消息数据。

点击消息进入应用内页并传递数据

  1. 在您的项目模块级别下的src/main/module.json5 中设置待跳转Ability的skills标签中的actions或uris值。

    设置actions参数完成点击消息进入应用内页示例(若skills中添加了uris参数,则uris内容需为空):

    {
    "name": "TestAbility",
    "srcEntry": "./ets/abilities/TestAbility.ets",
    "exported": false,
    "startWindowIcon": "$media:icon",
    "startWindowBackground": "$color:start_window_background",
    "skills": [
    {
    "actions": [
    "com.test.action"
    ]
    }
    ]
    }

    设置uris参数完成点击消息进入应用内页示例(skills中必须同时设置actions参数,actions参数为空),uris对象内部结构说明请参见skills标签。

    {
    "name": "TestAbility",
    "srcEntry": "./ets/abilities/TestAbility.ets",
    "exported": false,
    "skills": [
    {
    "actions": [""],
    "uris": [
    {
    "scheme": "https",
    "host": "www.test.com",
    "port": "8080",
    "path": "push/test"
    }
    ]
    }
    ]
    }

    注意

    module.json5文件中的skills标签下可以同时存在多个skill对象,每个对象对应一种能力。

    若您需要同时设置推送消息跳转能力和其他跳转能力(如NFC跳转、浏览器跳转等),需要在skills数组中创建不同的skill对象,分别映射对应的能力。

  2. 发送消息时clickAction中携带data字段并设置actionType字段为1:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 1,
    "action": "com.test.action",
    "uri": "https://www.test.com:8080/push/test",
    "data": {"testKey": "testValue"}
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​
    • actionType:点击消息动作,1表示点击消息后进入应用内页。当本字段设置为1时,uri和action至少填写一个,若都填写优先寻找与action匹配的应用页面。
    • action:表示能够接收Want的action值的集合,取值可以自定义。
    • uri:表示与Want中uris相匹配的集合,uris规则请参见skills标签。
    • data:点击消息时携带的JSON格式的数据。
  3. 在待跳转页面(下以TestAbility为例)中的onCreate()方法中覆写如下代码:
    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class TestAbility extends UIAbility {
    onCreate(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    onNewWant()方法中覆写如下代码:

    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class TestAbility extends UIAbility {
    onNewWant(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    注意

    onNewWant()方法仅在单例(singleton)模式下可用。

  4. 当点击消息首次进入应用内页面时,会在onCreate()方法中获取消息data数据;当前应用进程存在时,点击消息会在onNewWant()方法中获取消息数据。

设置通知消息样式

Push Kit提供了多种通知消息样式,您可以自定义其中内容来吸引用户,从而提高应用的日活跃用户数量。

普通通知

您在发送通知消息时notification参数中必须携带titlebody字段,来设置应用收到通知消息后展示在通知中心的标题与内容。文本内容最多显示3行,超出3行以“...”折断。

cke_8707.jpeg

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "推送服务",
"body": "推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务SDK,可以向客户端应用实时推送消息,构筑良好的客户关系,提升用户的感知度和活跃度。",
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

通知角标

您可以发送通知消息时携带badge字段来设置应用收到通知消息后以数字的形式展示角标,提醒用户查看消息。

cke_36250.png

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "通知标题",
"body": "通知内容",
"badge":{
"addNum": 1,
"setNum": 99
},
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

说明

  • addNum设置后为应用角标累加数字,非应用角标实际显示数字。
  • setNum设置后为应用角标实际显示数字。setNum优先级高于addNum。
  • 打开应用或者点击、清理通知消息并不会清理角标数字,开发者可通过setBadgeNumber()方法清理角标,使用前需先导入模块。
  • 当setBadgeNumber()方法中的badgeNumber设置为0时,可以实现清理效果。

通知大图标

您可以发送通知消息时携带image字段设置消息大图标内容,提醒用户查看消息。

cke_58214.png

消息体示例:

​
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "主文本 标题",
"body": "副文本 内容详情内容详情内容详情",
"image": "https://example.com/image.png",
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}
​

说明

支持图片格式为png、jpg、jpeg、bmp,图片长*宽建议小于128*128像素,若超过49152像素,则图片不展示。

多行文本样式

您可以发送通知消息时在notification中携带inboxContentstyle字段设置通知消息为多行文本样式。

cke_71795.png

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "通知标题",
"body": "通知内容",
"style": 3,
"inboxContent": [
"1.Push Kit(推送服务)是华为提供的消息推送平台",
"2.建立了从云端到终端的消息推送通道",
"3.所有HarmonyOS应用可通过集成Push Kit,实现向应用实时推送消息"
],
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

说明

  • 多行文本样式需要设置style字段为3。
  • 当您发送多条通知消息导致用户通知消息折叠时,多行文本样式在展开前显示的标题与内容取自title与body字段。
  • 当用户展开多行文本消息,或仅存在一条多行文本消息时,通知中显示的标题与内容取自title与inboxContent字段。

开发通知消息账号校验

Push Kit提供了账号校验功能,该功能支持您根据终端设备上不同账户属性来推送消息,将通知发送给对应设备上的对应账号。

举例:华为手机上某个应用存在账号A和账号B,若当前登录的账号A切换至账号B后,发送给账号A的通知消息在到达设备后不会进行展示,以避免账号B看到账号A的消息。

注意

  • 当Push Token变更后,账号与应用的绑定关系自动解除。
  • 绑定的应用内账号数量最大为10。

Push Kit支持华为账号和应用账号两种账号类型:

  • 华为账号

    该profileId为应用通过华为账号映射的唯一匿名标识。

    调用bindAppProfileId()绑定接口时机:

    • 在应用内通过华为账号授权登录后。
    • 在应用内从其他账号切换到当前华为账号后。

    调用unbindAppProfileId()解绑接口时机:

    • 在应用内登出华为账号后。

    举例: 用户选择华为账号作为应用登录账号并登录账号A成功后,调用Push Kit绑定接口bindAppProfileId()将账号A的profileId绑定到当前设备的应用token上。应用服务器发送通知消息时若携带该账号A的profileId,则只有当前登录的华为账号为账号A时,才会展示通知消息;若不携带profileId,则无论当前登录的华为账号是否为账号A,都正常展示通知消息。

  • 应用账号

    该profileId为应用通过自己的账号映射的唯一匿名标识。

    调用bindAppProfileId()绑定接口时机:

    • 在应用内登录应用账号后。
    • 在应用内从其他应用账号切换到当前应用账号后。

    调用unbindAppProfileId()解绑接口时机:

    • 在应用内登出应用账号后。

    举例: 用户成功登录应用的账号A后,调用Push Kit绑定接口bindAppProfileId()将账号A的profileId绑定到当前设备的应用token上。应用服务器发送通知消息时若携带账号A的profileId,则只有当前登录的应用账号为账号A时,才会展示通知消息;若不携带profileId,则无论当前登录的应用账号是否为账号A,都正常展示通知消息。

注意

若在账号登出时未做unbindAppProfileId()解绑,或者在账号切换时未做bindAppProfileId()重新绑定,则会导致应用依然能接收到原账号的通知消息。

  1. 获取Push Token。
  2. 为确保应用可正常收到通知消息,建议应用发送通知前调用requestEnableNotification()方法弹出提醒,告知用户需要允许接收通知消息。详情请参见Notification Kit-请求通知授权。
  3. 为待绑定的账号生成一个非空唯一的profileId(不建议使用真实的账号id,推荐使用账号id自行生成对应的匿名标识,能与该账号id建立唯一映射关系即可,生成算法无限制),调用bindAppProfileId()方法,添加当前设备上该用户与应用的关系,代码示例:
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { pushCommon, pushService } from '@kit.PushKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    // 定义需要绑定的profileId
    const profileId = '1****9';
    // 绑定应用账号
    pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId).then(() => {
    hilog.info(0x0000, 'testTag', 'Succeeded in binding app profile id');
    }).catch((err: BusinessError) => {
    hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', err.code, err.message);
    });
     
  4. 建议您将Push Token和生成的profileId上报到应用服务端,便于应用服务端向终端推送消息。
  5. 应用服务端调用REST API推送通知消息,通知消息示例如下:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "profileId": "111***222",
    "clickAction": {
    "actionType": 0
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    }
    }
    ​
    • [projectId]:项目ID,登录AppGallery Connect网站,选择“我的项目”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
    • Authorization:JWT格式字符串,可参见Authorization获取。
    • push-type:0表示通知消息场景。
    • actionType:0表示点击消息打开应用首页。
    • token:Push Token,可参见获取Push Token获取。
    • profileId:应用内账号id匿名标识。详情请参见profileId。

  6. 消息发送成功后,Push Kit会先校验绑定账号时的AppProfileType(华为账号或应用账号):

    • 若绑定华为账号则先校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,再校验当前登录的华为账号和绑定时登录的分布式账号是否一致,若全部满足则展示消息,否则不展示消息。
    • 若绑定应用账号则校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,若满足则展示消息,否则不展示消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2156851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支,切换到该分支下面,输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支,因为刚刚提交的分支在dev环境,所以master是没有 3、合并分支 点击push,将dev里面的代码合并到…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类,服务类容器,和工作类容器 服务类容器通常持续提供服务,需要一直运行,比如HTTP,Server,Daemon等, 工作类容器则是一次性任务,比如批处理程序&#xff0…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU(Gate Recurrent Unit)是循环神经网络(Recurrent Neural Network, RNN)的一种。和LSTM(Long-Short Term Memory)一样,也是为了解决长期记忆 和反向传播中的梯度等问题…

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall 数据集-目标检测系列-吸烟检测数据集 (smoking cigarette) 数据量:1W 想要进一步了解,请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

Qt系统相关——事件

文章目录 事件和信号槽的关系事件处理鼠标事件鼠标进入和离开鼠标点击获取位置鼠标释放鼠标双击鼠标移动鼠标滚轮 键盘事件定时器事件窗口移动和窗口改变 事件和信号槽的关系 Qt信号槽机制: 用户进行的操作就可能产生信号,可以给某个信号指定槽函数&…

Effective Java 学习笔记 如何为方法编写文档

目录 方法的文档注解设计的原则 Javadoc常用的文档注释 一些注意细节 通过Javadoc命令生成h5页面 这是第8章Java方法的最后一部分,聚焦为导出的API编写文档注释。 如果要想使得API真正可用,配套的文档是必须的。Java提供了Javadoc这个文档生成工具&…

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

基于SpringBoot+Vue+MySQL的特色旅游网站系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展,人们对旅游体验的需求日益多样化与个性化。传统的旅游信息查询与预订方式已难以满足现代游客的需求。因此,我们开发了这款基于SpringBootVueMySQL的特色旅游网站系统。该系统旨在通…

HTML实现的简单网站首页模板

这个是简单的网站首页模板&#xff0c;用于学习或者参考 实现代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击&#xff1a;移动硬盘为何需格式化才能访问&#xff1f; 在数字化时代&#xff0c;移动硬盘作为数据存储与传输的重要工具&#xff0c;其稳定性与可靠性直接关系到用户数据的安全。然而&#xff0c;不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;C卷D卷E卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木&#xff0c;所以只能在…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

stm32单片机个人学习笔记7(TIM定时中断)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

Python可迭代对象(1)---从C++开发者学习python日记

目录 1。什么是可迭代对象&#xff1f; 2。列表(list) 列表的创建 列表基本操作 以上全部代码的总运行结果 列表脚本操作符 列表常用的方法和函数 列表推导式 ​编辑列表的嵌套 以上全部代码的总运行结果 复习列表内容 3。元组(tuple) 元组的基本运算 元组的方法 …