plist字段列表及CFBundleVersion与CFBundleShortVersionString

iOS第三方客户端开发全流程:签名、API接入与TestFlight分发实践 在iOS生态中,第三方客户端开发不仅要关注界面布局,更需打通账号授权、API接入、应用签名和测试分发整条链路。开发者需理解Bundle Identifier、证书和描述文件的关系,正确使用Keychain存储令牌,并借助Xcode完成归档、导出和上传。TestFlight作为高效的测试分发工具,能帮助开发者将构建快速送达内部测试员或外部用户,但需注意构建号递增、签名匹配、上传处理状态和隐私合规等细节。掌握这些标准化流程,可以显著减少独立开发中反复踩坑的几率,让从代码到真机安装的过程更稳定可靠。无论是面向Bu 阅读详情

iOS 获得版本号 区分BundleVersion和BundleShortVersionString

CFBundleVersion与CFBundleShortVersionString


plist字段列表,很全


Dictionary *bundleDic = [[NSBundle mainBundle] infoDictionary];

// 产品版本号

NSString *bundleShortVersionString = [bundleDic objectForKey:@"CFBundleShortVersionString"]


iOS应用静态分析与二进制检查:从Mach-O结构到代码反编译的完整实战指南 静态分析是软件工程与安全领域的基础技术,指在不运行程序的情况下,通过分析其二进制代码、资源文件及元数据来理解程序结构、检测漏洞的技术。其核心原理基于对可执行文件格式(如iOS的Mach-O)的解析,结合控制流与数据流分析,识别代码模式与潜在风险。这项技术的价值在于能在开发早期或安全评估阶段,系统性发现硬编码密钥、不安全API调用、第三方库漏洞等问题,提升应用安全性与代码质量。在移动安全、合规审计、竞品分析等场景中,静态分析结合反汇编工具(如Hopper、Ghidra)与自动化脚本,能高效完成从应用解包、元信 阅读详情

相关推荐

iOS应用脱壳实战:原理、工具与逆向分析入门

在iOS应用安全与逆向工程领域,理解应用加密与解密机制是核心技术基础。苹果的FairPlay DRM系统会对App Store分发的应用进行加密保护,使得静态分析工具无法直接读取代码逻辑。脱壳技术正是针对这一保护机制,通过从内存中提取已解密的代码段,生成可供分析的明文二进制文件,从而为后续的漏洞挖掘、代码审计与学习提供可能。其核心原理涉及Mach-O文件结构、内存映射与动态调试,常见于安全研究、应用审计与开发学习等场景。本文聚焦于iOS应用脱壳,详细解析了frida-ios-dump等工具的使用方法,并探讨

453

iOS Safari扩展开发构建版本时出现的常见问题的解决方法

iOS Safari扩展开发构建版本时遇到的一些问题解决方法

weixin_43456810的博客 3128

利用Fiddler抓包实现iOS应用旧版下载:原理、配置与脚本自动化

在软件分发与版本管理中,客户端与服务器的通信协议是核心技术环节。通过中间人(MITM)代理原理,可以拦截和修改HTTPS加密流量,实现对网络请求的深度分析与定制化处理。这项技术在软件测试、安全研究和数据恢复等领域具有重要价值,尤其适用于需要回溯历史版本进行兼容性验证或恢复特定功能的场景。以苹果App Store为例,其严格的应用版本控制策略使得用户难以获取历史版本。本文聚焦于使用Fiddler这一经典抓包工具,通过解密HTTPS流量、定位关键请求、篡改版本参数(如appExtVrsId),并结合Fiddle

weixin_33892359的博客 443

关于‘CFBundleIconName‘ is missing问题的解决办法

'CFBundleIconName' is missing in the bundle问题,ERROR ITMS-90023,ERROR ITMS-90022, xcode新版本上传包出错,AppIcon问题

天下皆白唯我独黑的博客 1万+

ipatool实战:用命令行下载App Store的ipa安装包

在iOS开发与测试流程中,获取应用安装包(.ipa)是常见需求,但App Store官方并未提供直接导出功能。ipa本质是zip压缩包,内含Payload目录与应用签名信息。通过命令行工具ipatool,开发者可以基于Apple ID认证,按Bundle ID搜索并下载合法授权范围内的ipa文件。这一能力使得版本归档、批量检查、自动化测试和CI流水线中的安装包管理变得更加高效。ipatool以认证、搜索、下载、解包校验的完整链路,解决了图形界面难以脚本化的问题,配合环境变量与JSON输出,可无缝嵌入自动化脚

weixin_33860553的博客 373

Cocos Creator游戏打包全攻略:从构建到上架的实战指南

游戏打包是将开发完成的游戏项目转换为可在不同平台运行的可分发产品的关键环节,其本质是一个涉及代码编译、资源处理和平台适配的自动化流程。理解构建原理对于解决打包过程中的常见问题至关重要,例如图标配置、启动图适配以及原生平台编译等。从技术价值看,规范的打包流程能确保游戏以最佳状态交付,直接影响用户体验和商店审核。在应用场景上,无论是面向Web、原生Android/iOS还是微信小游戏等平台,都需要针对其特定规范进行配置。本文聚焦于Cocos Creator引擎,详细解析了构建流程、平台差异以及图标与启动图的个性

weixin_34174105的博客 449

CFBundleVersion与CFBundleShortVersionString

CFBundleVersion,标识(发布或未发布)的内部版本号。这是一个单调增加的字符串,包括一个或多个时期分隔的整数。 CFBundleShortVersionString  标识应用程序的发布版本号。该版本的版本号是三个时期分隔的整数组成的字符串。第一个整数代表重大修改的版本,如实现新的功能或重大变化的修订。第二个整数表示的修订,实现较突出的特点。第三个整数代表维护版本。该键的值不

1116

研发流程后端开发工具,提示功能开发效率

后端开发工具

项目包中的 Info.plist 必须包含 CFBundleShortVersionString 键。

info.plist 里面添加一个 Bundle versions string, short 。这个就是CFBundleShortVersion

我来也 4982

【参数不确定】敏感性分析(sensitivity analysis)

【运筹学】灵敏性分析

羊肉蛋花汤的博客 14万+

BLE透传速率调优(二)

摘要:本文分析了蓝牙协议中MDbit=1时应连续发送多包但实际只发一包的问题。通过波形分析和代码调试,发现问题的根源在于接收端出现sync error导致提前关闭接收窗口,而非发送端问题。最终通过调整RF时序参数(将rxpathdly改为13us)解决了TX到RX转换的同步问题,使连接事件能正常发送多个数据包,传输速率提升至70kb/s。文中详细记录了使用逻辑分析仪和trace宏调试的过程,揭示了CEVA芯片设计中TX中断与ACK接收的关联特性。

袁赟的博客 800

关于[[NSBundle mainBundle] infoDictionary]里面的那些东西

在开发中, 假如我们设置启动页面的时候, 需要判读一下我们的应用是不是第一次启动,或者 是不是版本的升级。然而我们需要在程序中,通过 //获取当前版本号     NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];     NSLog(@"%@",infoDic);     NSString *

刺骨寒的博客 6454

细说VLAN之untag和tag

一、拓扑图 先给出上面拓扑图的结论,后面再详细讲解: 结论:只有PC1与PC4之间能相互通信,除此之外,所有PC之间均不能通信,比如PC1与PC3不能建立通信。 针对Ping命令的一个知识: 要想ping通某台主机,必须满足两个条件: 1,源主机的ICMP请求包必须能达到目的主机。 2,目的主机的ICMP应答包必须能回到源主机。 二、理论基础 端口的出...

NoobMaster的博客 3万+

使用Go与Bubbletea构建跨平台TUI桌宠应用

终端用户界面(TUI)是一种在命令行环境中模拟图形交互的技术,它通过ANSI转义序列控制光标和颜色实现界面渲染。其核心原理在于事件驱动与状态管理,结合异步通信机制处理用户输入与后端服务交互。这种技术方案在开发工具、系统监控和交互式CLI应用中具有重要价值,能够提升开发效率与用户体验。基于Model-View-Update架构的TUI框架如Bubbletea,为构建状态驱动的终端应用提供了优雅的解决方案。在实际工程实践中,开发者常需将TUI应用打包为独立桌面程序,实现跨平台部署。本文以构建智能桌宠为例,详细解

weixin_33797791的博客 363

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 366

OpenClaw 自定义 Skill 开发完整指南(最新版)

OpenClaw 中的每个 Skill,本质是一套“能力描述 + 执行逻辑”的组合包,核心特征如下:核心载体:以文件夹为单位,文件夹内必须包含SKILL.md文件(能力描述核心);扩展文件:可选agent.py(Python 执行逻辑)、index.ts(TypeScript 执行逻辑)、(辅助文档/示例资源)等;核心优势:AI 通过阅读 SKILL.md 的自然语言描述理解技能,无需严格遵循代码接口,灵活度极高;

haolove527的专栏 2万+

从零搭建iOS原生Buzz客户端并完成TestFlight分发全流程

在移动应用开发中,原生与跨平台技术栈的取舍始终是开发者关注的重点。原生开发凭借对系统能力的直接调用、可控的性能表现以及稳定的分发链路,在追求极致用户体验的场景中依然占据重要地位。SwiftUI作为苹果新一代界面框架,配合URLSession与async/await,能够高效构建响应式列表与网络请求层,而Codable协议则大幅简化了JSON数据映射。当应用完成基础功能后,TestFlight作为官方测试分发工具,成为连接开发与真实用户的关键桥梁。从项目骨架搭建、API接入到证书配置与构建上传,一条成熟的工程

weixin_34414650的博客 351

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

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

3步搞定libui跨平台GUI应用部署:Windows、macOS、Linux打包实战

跨平台GUI开发的核心挑战之一在于如何将应用高效地分发到不同操作系统。其原理在于确保应用的可执行文件及其所有运行时依赖(如动态链接库)能作为一个完整的包交付给用户,从而解决因系统环境差异导致的“水土不服”问题。这项技术的价值在于极大降低了多平台维护成本,提升了开发效率,是实现“一次编写,处处运行”愿景的关键工程实践。在应用场景上,无论是使用C++、Go还是Rust编写的桌面工具,都需要一套标准化的构建、依赖收集和打包流程来生成可分发的软件包,例如Windows的安装程序、macOS的.app Bundle或

weixin_30825199的博客 402

Simulink开发项1000例实战专栏--实例148:构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块

电动汽车的动力电池是其核心部件,而电池的健康状态(State of Health, SOH)直接影响车辆的续航能力和使用寿命。SOH通常定义为当前电池容量与初始容量的比值,用百分比表示。通过基于MATLAB/Simulink平台的SOH评估仿真,可以实时监测电池的退化情况,并为电池管理系统(BMS)提供决策依据。本项目旨在构建一个完整的电动汽车电池SOH评估仿真模型,包括电池建模模块、数据采集模块、SOH估算算法模块以及性能评估模块,并通过仿真验证SOH评估的准确性。

xiaoheshang_123的博客 342

5G/NR SSB学习总结

6.1 SSB概念 同步信号和PBCH块(Synchronization Signal and PBCH block, 简称SSB),它由主同步信号(Primary Synchronization Signals, 简称PSS)、辅同步信号(Secondary Synchronization Signals, 简称SSS)、PBCH三部分共同组成。 6.2 SSB特征 ...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 8万+

关于App Store中审核时报Missing Info.plist key的问题解决方案

最近提交App Store碰到提交.ipa时能上传成功,在发布程序中找不到相应的发布版本。App Store返回的问题点是Missing Info.plist key在打包时缺少权限。不同的打包工具添加方式不同,本人用的是Hbuilder打包。在网上找了很久没有发现怎么添加Missing Info.plist key中的key值。在向官网反应后得到的处理方式很有用,希望帮助各位正在爬坑的你。 打...

b0303的博客 3499

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

iPhone开发--XCode11下获取CFBundleVersion和CFBundleShortVersionString

在XCode11下调用 /usr/libexec/PlistBuddy -c 'Print CFBundleVersion' XXXX/XXXX-Info.plist 返回结果为 CURRENT_PROJECT_VERSION 并不是想象中的BundleVersion。 如何解决? 搜google,找stackoverflow,发现真的有解决办法,但是很繁琐,各种正则取值。复杂的方法而且和内容...

zcl369369的专栏 2905

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

区分BundleVersion和BundleShortVersionString

区分BundleVersion和BundleShortVersionString 最近遇到了关于检查更新的版本问题了。 问题出在了Info.Plist配置中的两个字段,BundleVersion和BundleShortVersionString。 搞了两年的开发,第一次看到还有另一个字段的版本。 由于版本检测升级的问题,搞得一众人手忙脚乱,一直讨论都没有一...

weixin_34174422的博客 280

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

iOS 中的 CFBundleShortVersionString 与 CFBundleVersion

原文地址:iOS 中的 CFBundleShortVersionString 与 CFBundleVersion iOS 开发中经常看到 CFBundleShortVersionString 和 CFBundleVersion 两个都可以用来标识应 用版本号的变量, 究竟应该用哪个呢? 下面就一探究竟。 CFBundleShortVersionString CFBundleS

宋波的专栏 4094
上一篇: 关于<AppName>-Prefix.pch文件的科幻用法
下一篇: 在发布(Release)版本中屏蔽掉代码中的NSLog输出
cocoasprite
博客等级 码龄14年 72粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值