独立开发呼吸训练 iOS App:Swift 帧率自适应动画方案分享与踩坑记录

Apple Intelligence深度解析:系统级生成式AI的端云协同架构 生成式人工智能(GenAI)正从应用层功能演进为操作系统核心能力。理解其底层原理,需回归‘意图识别—任务调度—安全执行’的技术主线:苹果通过Intent Understanding Engine实现毫秒级语义解析,依托On-Device Synthesis Core与Private Cloud Compute构建分级推理体系,在保障隐私与实时性的前提下,让AI能力自然融入文本润色、跨App协同等高频场景。这种系统级集成并非简单调用大模型,而是以芯片微架构优化(如Sparse Attention Unit)、 阅读详情

背景:为什么要做这个 App

去年年底开始被焦虑困扰,尤其是开会前那几分钟,心跳加速、思路混乱。试了市面上几个冥想 App,要么太重(动辄几百 MB),要么上来就让我订阅年费。我就想:一个呼吸训练而已,能不能做得足够轻、足够专注?

于是我做了「呼吸视界」——一个专注结构化呼吸练习的 iOS App。目前 App Store 上线几个月,12 条评价全部 5 星,累计下载几百次。量级很小,属于刚起步阶段。但看到有用户反馈"可以跟随练习呼吸,保持稳定的心情",觉得方向没错,值得继续打磨。

今天主要想聊聊技术层面的实现,特别是呼吸引导动画的帧率自适应方案,以及独立开发过程中的一些取舍思考。

产品层面的减法

做这个 App 我砍掉了三样东西:

1. 砍掉冥想模块。 呼吸训练本身变体就很多——4-7-8 法、盒式呼吸、腹式呼吸、Wim Hof 法……光把这些做透就够忙的了。砍掉之后包体控制在 10MB 以内。

2. 砍掉云端同步。 呼吸训练记录不需要多端同步,本地持久化完全够用。我用了一套 ProgramProgressRecord 方案管理课程进度,每次练习结束写入一条记录,启动时加载,零网络请求。省了服务器成本,也省了用户的隐私顾虑。

3. 砍掉装饰性动效。 动效只服务于呼吸节奏引导——吸气时扩张、呼气时收缩——不做任何与呼吸无关的过渡动画。

留下来的核心是结构化课程进度系统:用户从基础课程开始,逐步解锁更高阶的练习方案,每完成一节课进度条往前走一格。参数层面,4-7-8 呼吸法来自 Andrew Weil 博士的建议,盒式呼吸的 4-4-4-4 节拍参考了美国海军 SEALs 的压力管理训练方案,这些作为默认值内置,用户不需要自己查论文。

核心技术:呼吸动画的帧率自适应

呼吸引导的核心交互是一个跟随吸气-屏息-呼气节奏变化的视觉动画。听起来简单,做起来有个硬性要求:不能掉帧。用户在跟着画面呼吸,卡顿会直接打断身体节奏,体验从"放松"变成"烦躁"。

问题分析

在 iPhone SE2 这类老设备上,如果同时跑背景粒子(120个)、高斯模糊图层、高精度贝塞尔圆环,GPU 吃不消,帧率会掉到 40fps 以下。但在 iPhone 14 Pro 上跑满特效毫无压力。所以需要一套运行时的性能检测 + 动态降级机制。

实现方案

我用环形缓冲区记录最近 60 帧的耗时,低于 45fps 触发降级,恢复到 55fps 以上且持续 3 秒才升级回来(避免反复震荡):

class PerformanceMonitor {
    private var frameTimes = RingBuffer<CFTimeInterval>(capacity: 60)
        private let degradeThreshold: Double = 45.0
            private let recoverThreshold: Double = 55.0
                private var recoverCounter: Int = 0
                    
                        func onFrame(duration: CFTimeInterval) {
                                frameTimes.append(duration)
                                        let avgFPS = 1.0 / (frameTimes.sum / Double(frameTimes.count))
                                                
                                                        if avgFPS < degradeThreshold {
                                                                    QualityManager.shared.degrade()
                                                                                recoverCounter = 0
                                                                                        } else if avgFPS > recoverThreshold {
                                                                                                    recoverCounter += 1
                                                                                                                if recoverCounter > 180 { // 连续3秒稳定在55fps以上
                                                                                                                                QualityManager.shared.recover()
                                                                                                                                            }
                                                                                                                                                    }
                                                                                                                                                        }
                                                                                                                                                        }
                                                                                                                                                        ```
为什么用环形缓冲区而不是普通数组?因为 `removeFirst()` 在 Swift Array 上是 O(n)。虽然 60 个元素的量级其实影响不大,但既然是每帧都在跑的逻辑,能省就省,写法上也更清晰。

### 降级策略

`degrade()` 具体做三件事:

| 维度 | 正常模式 | 降级模式 |
|------|---------|---------|
| 背景粒子数量 | 120 | 40 |
| 模糊图层 | 高斯模糊 | 纯色半透明 |
| 圆环贝塞尔采样点 | 64 | 32 |

三刀下去 GPU 负载直接腰斩,在 iPhone SE2 上也能稳 60fps。用户几乎感知不到视觉差异(呼吸引导的核心——扩张/收缩节奏完全不受影响),但流畅度保住了。

### 设计思考

这里有个取舍:为什么不直接用 Core Animation 的隐式动画,而要自己管帧?

原因是呼吸引导需要**精确的时间控制**。比如"吸气4秒-屏息7秒-呼气8秒",每个阶段的动画曲线不同(吸气用 easeIn,呼气用 easeOut),而且阶段切换要丝滑过渡。用 `CADisplayLink` + 自定义插值比叠一堆 `UIView.animate` 组合更可控,也更容易做性能监控。

## 国际化:CI 自动检测漏翻译

做了中英双语支持后,字符串一多就容易漏翻译。我写了个 Python 脚本集成到 GitHub Actions,每次 push 自动检查中英文 key 的一致性:

```python
def check_parity(en_path: Path, zh_path: Path) -> list[str]:
    en_keys = set(re.findall(r'"([^"]+)"\s*:', en_path.read_text()))
        zh_keys = set(re.findall(r'"([^"]+)"\s*:', zh_path.read_text()))
            errors = []
                for key in sorted(zh_keys - en_keys):
                        errors.append(f"missing in EN: {key}")
                            for key in sorted(en_keys - zh_keys):
                                    errors.append(f"missing in ZH: {key}")
                                        return errors  # 非空则 exit(1),PR 合不进去
                                        ```
很朴素的正则提取 + 集合对比,但集成到 CI 之后真的帮我拦住了四五次漏网之鱼。有一次加了个新的课程名称,英文写了中文忘了,CI 红了才发现。成本极低但收益很高,推荐所有做多语言的同学试试。

## 设计 Token 体系

健康类 App 的视觉一致性比功能型产品重要得多——用户对"感觉不对"特别敏感,哪怕说不出哪里不对。

我在代码里建了一套 Style Token:所有 `SPACE`、`RADIUS`、`SHADOW`、`MOTION` 参数统一导出,组件里不允许 hardcode 数值,改一处全局生效。前期多花了两天搭这套东西,但后面调设计稿的时候省心太多。比如想把所有卡片圆角从 12px 调到 16px,改一个常量就行,不用全局搜索替换。

## 接下来的计划

- **Widget 支持**:把 1 分钟快速呼吸放到锁屏/桌面,降低启动门槛
- - **HealthKit 接入**:训练数据写入健康 App,跟心率变异性(HRV)联动,量化呼吸训练效果
- - **性能监控细化**:把降级/恢复事件打到本地日志,分机型统计实际触发率
另外还在纠结要不要加一个「匿名氛围墙」的社交元素——用户完成训练后,一朵花出现在公共画布上,不暴露任何个人信息,但能看到"今天有 47 个人和你一起练了呼吸"。如果你做过类似的轻社交功能,想听听实际效果如何。

## 小结

「呼吸视界」目前在 App Store 可以搜到,10MB 的包体,12 条全五星评价,还在持续迭代中。

这篇文章主要想分享的是:即使是一个"小"功能(呼吸动画),要做到在所有设备上流畅运行,背后的性能自适应方案也值得认真设计。独立开发资源有限,把精力集中在核心体验上,用技术手段兜底边界情况,是我目前觉得性价比最高的做法。

如果你也在做 iOS 独立开发,或者对动画性能优化、健康类 App 设计有想法,欢迎评论区交流。
3D点云修复实战:用PCN网络快速补全缺失的激光雷达数据(附代码) 本文详细介绍了PCN(Point Completion Network)网络在3D点云修复领域的实战应用。针对激光雷达数据常见的缺失问题,PCN通过端到端的深度学习架构,直接处理原始点云,实现由粗到精的快速补全。文章深入解析了其核心思想与编码器-解码器架构,并提供了完整的环境搭建、数据准备、模型实现、训练评估及在真实场景下的优化策略与代码示例,为自动驾驶、机器人等领域的开发者提供了高效的数据修复解决方案。 阅读详情

相关推荐

ChromeOS安装教程

ChromeOS,是基于Linux内核研发的ChromiumOS开源系统的闭源系统,最大的特色就是内置了Chrome浏览器,早期主要以Web云端应用程序为主,后来逐渐引入了Android子系统和Linux子系统。本文主要简述摸索的家用笔记本安装ChromeOS安装方法,供各位玩机朋友参考。

weixin_45751495的博客 8109

独立开发iOS呼吸训练App:状态机驱动动画与工程实践分享

去年有段时间焦虑得厉害,开会前心跳加速,睡前脑子停不下来。试了好几个冥想类App,要么太重(动辄几百MB),要么上来就让我买年费会员。我就想,呼吸训练这事儿,核心逻辑其实不复杂,为什么不自己做一个?于是就有了「呼吸视界」—— 一个专注呼吸训练的iOS工具App。目前App Store上12个评分,均为5星。有用户反馈说"可以跟随练习呼吸,保持稳定的心情",说明方向没偏。吸气4秒、屏息7秒、呼气8秒——每个阶段时长不同,视觉反馈要精确跟随。呼吸App最核心的体验是。

same4869的博客 45

BambuStudio学习笔记:OpenCSG - 实时构造实体几何(CSG)渲染的 OpenGL 方案

**OpenCSG** 是一个基于 **OpenGL** 的 **构造实体几何(CSG)** 实时渲染库,通过 **深度剥离算法** 实现布尔运算(并集、交集、差集)的可视化。其核心目标是简化复杂几何体的交互式建模,适用于 CAD 原型设计、3D 打印预览、教育工具等场景。

zzzkk2009的专栏 928

7行代码实现iOS呼吸灯动画:Pulsator完全指南

你是否还在为实现优雅的脉冲动画(Pulse Animation)编写数百行Core Animation代码?是否需要为地图标注、按钮提示或状态指示器添加引人注目的呼吸效果?本文将带你掌握Pulsator——这个仅需7行代码就能集成的Swift动画库,彻底解决iOS开发中动态视觉效果实现复杂、性能优化困难的痛点。 读完本文你将获得: - 从零开始的Pulsator集成步骤(支持CocoaPods/

gitblog_01021的博客 487

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

【项目实战】TARA威胁分析和风险评估

TARA是信息安全领域中的一种风险评估方法,在汽车信息安全的上下文中,TARA分析特别重要,因为它可以帮助识别和管理与智能网联车辆相关的各种威胁,包括数据泄露、未经授权的访问、远程操控等。通过TARA分析,企业可以制定出针对性的安全目标、产品要求和产品安全声明,以确保汽车及其零部件符合相关的信息安全标准和法规。此外,TARA分析还可以与数字化建模系统结合,以更系统化和高效的方式进行风险评估和管理。

奶爸的编程之路,也就一周冷个三天 2709

iOS呼吸动画

所谓的呼吸灯效果就是设置某个元件的透明度从无到有一直循环。 1 - 首先定义动画方法 #pragma mark -呼吸灯动画 -(CABasicAnimation*) AlphaLight:(float)time { CABasicAnimation*animation =[CABasicAnimation

星宇大前端 3233

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2372

Moltbook:基于眼动与生物信号的旁观式社交网络架构

旁观式交互是一种新兴的人机交互范式,其核心在于将人类自然生理行为(如注视、眨眼、微动)作为首要输入源,而非传统点击或语音指令。它依托眼动追踪、环境感知与生物信号建模等技术,实现对用户无意识注意力状态的实时解码,从而构建‘非交互式’但高度个性化的信息流。该范式在注意力经济、沉浸式内容分发与无障碍交互等领域具备显著技术价值,尤其适用于高信息摄入、低表达意愿的沉默大多数用户群体。Moltbook正是这一理念的工程化实践,深度融合瞳孔追踪、UWB环境指纹与注视衰减预测模型,重新定义社交产品的底层逻辑。

weixin_30493401的博客 366

(八)DDR_PHY架构及功能——(PUB组成、初始化及Training流程、Clock关系)

文章目录一、DDR_PHY结构组成1.1、DDR Memory子系统1.2、DDR_PHY架构组成1.3、PUB模块功能实现流程1.3.1、DDR系统初始化流程1.3.2、PLL初始化流程 一、DDR_PHY结构组成 1.1、DDR Memory子系统   Memory子系统主要由DDR Controller和DDR_PHY(含DDR_IO)两个部分组成。DDR Controller主要承担其它子系统(如CPU)与Memory子系统进行数据交互时的传输效率及调度,DDR_PHY主要负责数据交互过程中的传输速

Mr.翟的博客 1万+

【基于Arduino 的CNC笔式绘图仪】

该机器的结构基于我之前视频中的DIY CNC激光雕刻机,目标是以尽可能少的零件制造最简单的CNC机器。它使用 3 个 NEMA 17 步进电机进行 X、Y 和 Z 轴运动,并使用一个小伺服器进行夹持器。这款数控笔式绘图仪的大脑是一块Arduino UNO板,结合了一个数控屏蔽和三个A4988步进驱动器。在我看来,相当大的工作区域,360x280mm,以及这款笔式绘图仪可以输出的细节水平也令人印象深刻。我真的很惊讶这些图纸的好坏和精确程度,尤其是我使用0.6毫米中性笔的图纸。

vor234的博客 1497

iOS 多语言本地化教程,VS Code KXApp 编辑 String Catalog .xcstrings

做 iOS 多语言本地化总要在 VS Code 和 Xcode 之间来回切?这篇讲用 KXApp(快蝎)在 VS Code 里直接编辑 String Catalog(.xcstrings):双击打开和 Xcode 一样的表格,`.xcstrings` 与老的 `.strings`、`.stringsdict` 同表编辑,加语言同步登记到工程、从源码扫描同步新 key,复数、设备变体和变量占位都在表里处理,改源语言文本后已有翻译自动标需复核。文件仍是标准格式,回 Xcode 打开一致。

2501_91592143的博客 162

基于深度学习的AI生成式人脸图像鉴别

AIGC(AI内容生成)技术的快速发展确实为创作者提供了高效生产力工具,但同时也引发了一些问题和挑战。这些技术可以生成以假乱真的图像、视频换脸等,给不法分子提供了滥用的机会。其中,一些不法分子可能利用AIGC技术制造虚假新闻、违反版权、绕过活体身份验证、散布谣言和诽谤他人、进行敲诈勒索等非法活动,以谋取不当利益。这些行为给社会造成了严重的负面影响,破坏了信息的真实性和可信度。因此,我们需要认识到AIGC技术的潜在风险,并采取相应的措施来应对。

mingo_敏 4494

4G 功能机操作系统选型指南:KaiOS、Mocor、MAUI、PMAOS 的能力边界与验证方法

4G 功能机如何选择操作系统?本文梳理 KaiOS、Mocor、MAUI、PMAOS 四条路线的技术定位与能力边界,从市场认证、应用清单、芯片与 BSP、内存与整机成本、交付维护五个维度建立选型流程,并提供场景决策矩阵和签约前八项验证清单,帮助研发与产品团队区分平台宣称、演示能力与目标机型的实际交付能力。

PMAOS的博客 189

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

iOS 小组件开发,Windows 上用 KXBuild 加 WidgetKit 扩展 给 App 加 iOS 桌面小组件

iOS 小组件开发用 WidgetKit。这篇在 Windows 上用 KXBuild 的 add-target --type widget 给 SwiftUI 工程加一个桌面小组件扩展:写时间线和主屏小号/中号、锁屏圆形多种尺寸界面,用 App Group 和 App 共享数据,App 里调 WidgetCenter 主动刷新,按 F5 装到 iOS 17+ 的 iPhone 调试,再随 ipa 一起上架。以喝水打卡为例,附 App ID、描述文件准备和小组件不刷新、签名报错的排查。

2501_91600747的博客 188

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

安卓IOS打包证书

.p12 、 .mobileprovision 、 keystore 相关证书申请

weixin_58431406的博客 281

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

React Native项目开发(iOS侧为例)

本文基于React Native 0.71+,通过npx react-native init初始化项目后,详细讲解如何使用TypeScript搭建两个页面:入口页(Entrance.tsx)和我的页面(Profile.tsx)。重点介绍了配置tsconfig.json、初始化TypeScript环境、集成React Navigation实现页面跳转,并通过创建共享类型文件(navigation.ts)实现路由类型安全。文章还涵盖依赖安装、iOS构建问题排查、目录结构规范及常见错误解决方案。

D_xw_的博客 245

iOS 推送通知怎么实现,从 APNs p8 密钥到 iOS 真机收到第一条推送

iOS 推送通知要跑通,核心是 App ID 开通 Push Notifications 并重新生成描述文件、签名带上 aps-environment、再用 APNs 的 .p8 密钥签 JWT 把推送发到设备令牌。这篇用 KXBuild 按五步做:开能力、加 entitlements、代码里请求权限拿设备令牌、建 .p8 认证密钥、用一段 Node 脚本或 curl 走 HTTP/2 发测试推送,让 iPhone 弹出第一条通知。附拿不到令牌、APNs 报错码、TestFlight 收不到的排查。

2501_91591841的博客 236

[iOS]Runtime2

为了让你在父类中依然能访问当前对象(也就是子类的实例),编译器在底层会生成一个结构体,叫 : 当调用 时,底层调用的函数是 : 拿着(也就是当前的子类对象)作为消息接收者,但是把方法查找的起点定位在了 (父类)这里需要注意的就是仍然是调用者自己,即先讲一下上篇没讲过的,我们如果缓存未命中,那我们就会进入慢速查找,现在我们来详细的讲解在进入慢速查找的瞬间会再看一遍方法列表,然后立刻调用加锁,因为多线程下别人正在动态添加方法或者扩容,不加锁会崩溃类就绪OC的机制就是在编译期只生成了 结构,当类首次被发送消息时(

wzm20070304的博客 230

iOS App 图标、启动屏和多语言搭配 方法,上架前使用KXBuild一次做好 App 图标

上架前,iOS 的 App 图标、启动屏和多语言这三样配不齐,上传时就可能被拦或显示不对。这篇用 KXBuild 一次配好:图标只要一张 1024×1024、不带透明通道的 PNG,在资源目录编辑器里右键就生成全部尺寸,还支持 iOS 18 深色/着色和 Xcode 26 的 .icon;启动屏在 Info.plist 的 UILaunchScreen 填背景色和 Logo;界面文字、App 名称用 .xcstrings 翻译,商店信息再到 App Store Connect 按语言填。附上架前检查清单。

2501_91600889的博客 286

Appuploader 创建 iOS 描述文件详解,Development / Ad Hoc / App Store

搞不清 iOS 描述文件(Provisioning Profile)该选 Development、Ad Hoc 还是 App Store?本文讲清四种类型各装到哪、哪些要绑设备、能不能上架,重点辨析最容易混的 Development 与 Ad Hoc,说明设备或证书变动后为什么要重建、重建后要重新导入签名,并给出不用 Mac 在 Windows/Linux 上用 Appuploader 新建与重建描述文件的实操步骤,附装机"描述文件不匹配"等常见问题排查。

2501_91373349的博客 220

Windows 开发 iOS,Sign in with Apple 苹果登录,KXBuild 真机调试全流程

Sign in with Apple 接入分四步:App ID 开能力并重新生成描述文件,entitlements 加 com.apple.developer.applesignin,用 SignInWithAppleButton 拿 identityToken 交服务端验签,删账号时调 revoke。本文讲清审核指南 4.8 为什么要你提供它、姓名邮箱只给一次、用 user 当主键,并在 Windows 上用 KXBuild 真机测登录,附 1000 报错排查。

2501_91373349的博客 214

iOS 深度链接配置教程,URL Scheme 与 Universal Links,KXBuild 真机验证

深度链接两种:URL Scheme(myapp://)只改 Info.plist 的 CFBundleURLTypes;Universal Links(https://)要开 Associated Domains、在 entitlements 写 applinks 域名、网站放 /.well-known/apple-app-site-association。讲清两者怎么选、onOpenURL 处理代码,在 Windows 上用 KXBuild 装 Debug 包真机验证,附 CDN 缓存和十个不跳转排查。

2501_91600747的博客 272

手机远程控制电脑哪家强?2026年iOS/安卓/鸿蒙横评实测,ToDesk/向日葵谁更流畅

手机远程控制电脑已成刚需,ToDesk凭借全平台覆盖、低延迟、无广告、免费不限速等优势,成为最佳选择。其iOS、安卓、鸿蒙及Mac系统均支持,实测连接快、操作流畅,虚拟键盘、外接键鼠、互动批注等功能体验出色。相较之下,向日葵存在限时踢线、传输慢、广告多等痛点。选购建议:无论用何种手机,首选ToDesk,实现高效便捷的远程办公与协助。

lx08113的博客 284

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 161

Cocos Creator3.8.8 + Xcode27.2 编译运行失败

Cocos Creator3.8构建IOS工程后,使用最新的Xcode27.2版本进行真机调试,遇到C++标准库冲突,如is_floating_point、is_arithmetic和is_signed失败,以及webp对齐失败等问题。

HYNN12的博客 357
上一篇: 做了一个 iOS 订阅管理 App「订阅斩」,用 SwiftData 让「砍掉订阅」变成一件有爽感的事
下一篇: 做了一个把走路面积量化的 iOS App,25m 网格精度下踩了不少坑
SameX-4869
博客等级 码龄18年 3354粉丝 657原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值