HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)

iOS

'''很多开发者以为 App 一旦上线,安全策略也就定型了。但现实是,App 上线只是攻击者的起点——从黑产扫描符号表、静态分析资源文件、注入调试逻辑,到篡改功能模块,这些行为都可能在你“以为很安全”的上线版本里悄然发生。

本篇文章结合我们几个项目的实际经验,介绍一套适用于“已上线、源码不可频繁更改”的 App 后期安全加固策略,并分享我们使用的多种工具方法(包括 Ipa Guard、AntiDebugKit、JS Obfuscator 等),实现“上线后补强 + 无源码再混淆”的动态安全方案。


一、上线后 App 还会被干什么?

在我们的几个案例中,客户 App 在发布后不久即出现以下情况:

  • 版本被抓包提取 IPA,用于类名提取与资源还原;
  • 被添加第三方广告 SDK 后重打包流传;
  • 被改 UI、接入盗版支付 API 进行仿冒;
  • WebView 注入 JS,绕过前端检测逻辑;
  • 日志信息暴露调试内容、接口路径;

这些问题有一个共同点:即使代码已上线,你仍有责任防护后续版本


二、我们设计的“上线后安全补强层”

我们将上线后可行的补强操作拆解为三个阶段:

  1. IPA 层级混淆处理(已上线包)
  2. 本地运行时动态防御机制
  3. 周期性版本安全重评与加固迭代

三、IPA 层混淆:不动源码也能保护结构

工具:Ipa Guard

  • 适合对发布后的 IPA 包进行处理;
  • 功能包括:
    • 混淆类名、方法名、变量名;
    • 批量重命名资源文件(支持图片/JS/HTML/JSON);
    • 修改 MD5、UDID 等元信息;
    • 本地签名配置,生成可直接测试的安装包;
  • 使用建议:
    • 每次 App Store 发布前,生成版本再处理;
    • 可用于 TF 测试阶段提前验证效果;
    • 特别适用于历史版本或 CI 输出中间包补强。

四、动态防御策略:App 运行时的“自我感知”

上线后包虽然难以修改逻辑代码,但我们仍可以用以下方式增强运行时安全:

工具:AntiDebugKit / JailbreakDetection

  • 功能:
    • 检测是否被调试、注入动态库;
    • 检测越狱环境运行;
    • 阻断在调试状态下执行关键逻辑;
  • 优势:轻量集成,不破坏功能;
  • 使用建议:封装为 SDK 接入主项目,按模块调用。

五、前端资源加密与混淆:防 Web 注入与资源还原

工具组合:

  • JS 混淆工具(如 javascript-obfuscator、UglifyJS)
  • HTML 压缩 + 路径混淆工具
  • 配置 JSON base64/加密处理

实施策略:

  • 将 WebView 加载内容改为压缩后、路径不可读文件;
  • 配合 Ipa Guard 的资源混淆进一步隐藏入口点;
  • 定期更换资源入口名,破坏攻击者“路径记忆”;

六、版本周期安全复检机制

为避免“上线即放弃防护”,我们建立以下发布复检清单:

1. Release 编译 strip 检查;  
2. Swift Shield / LLVM 插件执行混淆;  
3. Ipa Guard 对 Release IPA 进行符号与资源混淆;  
4. class-dump 模拟攻击预演;  
5. AntiDebug 模拟运行环境检查;  
6. JS 资源是否再次压缩混淆;

这些流程目前已集成进我们 CI/CD 系统中,确保即使迭代快,安全也不落后。


七、结语:安全不是一次性的,而是循环的

App 的上线并不意味着防护任务结束,而是另一个阶段的开始。安全防护需要在迭代过程中不断补强,尤其是在业务快速变动、团队资源有限的现实下,借助工具组合进行上线后混淆与防御,正是成本低、收益高的策略之一。

不论你是否还保有源码,只要手上有 IPA,就可以从 Ipa Guard 开始,再搭配动态防护机制与资源策略,让你的 App 至少比“容易破解的那个”安全一大步。'''

继续阅读 »

'''很多开发者以为 App 一旦上线,安全策略也就定型了。但现实是,App 上线只是攻击者的起点——从黑产扫描符号表、静态分析资源文件、注入调试逻辑,到篡改功能模块,这些行为都可能在你“以为很安全”的上线版本里悄然发生。

本篇文章结合我们几个项目的实际经验,介绍一套适用于“已上线、源码不可频繁更改”的 App 后期安全加固策略,并分享我们使用的多种工具方法(包括 Ipa Guard、AntiDebugKit、JS Obfuscator 等),实现“上线后补强 + 无源码再混淆”的动态安全方案。


一、上线后 App 还会被干什么?

在我们的几个案例中,客户 App 在发布后不久即出现以下情况:

  • 版本被抓包提取 IPA,用于类名提取与资源还原;
  • 被添加第三方广告 SDK 后重打包流传;
  • 被改 UI、接入盗版支付 API 进行仿冒;
  • WebView 注入 JS,绕过前端检测逻辑;
  • 日志信息暴露调试内容、接口路径;

这些问题有一个共同点:即使代码已上线,你仍有责任防护后续版本


二、我们设计的“上线后安全补强层”

我们将上线后可行的补强操作拆解为三个阶段:

  1. IPA 层级混淆处理(已上线包)
  2. 本地运行时动态防御机制
  3. 周期性版本安全重评与加固迭代

三、IPA 层混淆:不动源码也能保护结构

工具:Ipa Guard

  • 适合对发布后的 IPA 包进行处理;
  • 功能包括:
    • 混淆类名、方法名、变量名;
    • 批量重命名资源文件(支持图片/JS/HTML/JSON);
    • 修改 MD5、UDID 等元信息;
    • 本地签名配置,生成可直接测试的安装包;
  • 使用建议:
    • 每次 App Store 发布前,生成版本再处理;
    • 可用于 TF 测试阶段提前验证效果;
    • 特别适用于历史版本或 CI 输出中间包补强。

四、动态防御策略:App 运行时的“自我感知”

上线后包虽然难以修改逻辑代码,但我们仍可以用以下方式增强运行时安全:

工具:AntiDebugKit / JailbreakDetection

  • 功能:
    • 检测是否被调试、注入动态库;
    • 检测越狱环境运行;
    • 阻断在调试状态下执行关键逻辑;
  • 优势:轻量集成,不破坏功能;
  • 使用建议:封装为 SDK 接入主项目,按模块调用。

五、前端资源加密与混淆:防 Web 注入与资源还原

工具组合:

  • JS 混淆工具(如 javascript-obfuscator、UglifyJS)
  • HTML 压缩 + 路径混淆工具
  • 配置 JSON base64/加密处理

实施策略:

  • 将 WebView 加载内容改为压缩后、路径不可读文件;
  • 配合 Ipa Guard 的资源混淆进一步隐藏入口点;
  • 定期更换资源入口名,破坏攻击者“路径记忆”;

六、版本周期安全复检机制

为避免“上线即放弃防护”,我们建立以下发布复检清单:

1. Release 编译 strip 检查;  
2. Swift Shield / LLVM 插件执行混淆;  
3. Ipa Guard 对 Release IPA 进行符号与资源混淆;  
4. class-dump 模拟攻击预演;  
5. AntiDebug 模拟运行环境检查;  
6. JS 资源是否再次压缩混淆;

这些流程目前已集成进我们 CI/CD 系统中,确保即使迭代快,安全也不落后。


七、结语:安全不是一次性的,而是循环的

App 的上线并不意味着防护任务结束,而是另一个阶段的开始。安全防护需要在迭代过程中不断补强,尤其是在业务快速变动、团队资源有限的现实下,借助工具组合进行上线后混淆与防御,正是成本低、收益高的策略之一。

不论你是否还保有源码,只要手上有 IPA,就可以从 Ipa Guard 开始,再搭配动态防护机制与资源策略,让你的 App 至少比“容易破解的那个”安全一大步。'''

收起阅读 »

告别主观感觉:如何用数据驱动优化 iOS App 性能?(含 KeyMob 等工具实战)

iOS

'''“感觉卡顿”、“应该是某个操作太重了”、“我们优化过但好像没改善”……在实际项目中,开发和测试经常对性能问题“说不清,道不明”。

这类问题不是技术能力不够,而是缺少数据依据。如果我们能用图表、趋势、对比数据,替代主观印象,就能从“猜测”进化到“可度量优化”。

这篇文章我结合过去几轮 iOS 项目的经验,分享如何用可视化数据(如 FPS、CPU、内存、GPU)来驱动调优决策,过程中使用 KeyMob、Instruments、PerfDog、Crashlytics 等工具,不作推荐,只讲组合实战。


一、数据驱动 vs 直觉调试:差别在哪?

传统方式 数据驱动方式
“点这个会卡” 点这个时帧率从60跌至28,CPU 峰值达90%
“用户说加载慢” 页面初始化从500ms增长到1.2s
“崩了但复现不了” 崩溃时间段系统日志/资源记录对照分析
“好像比上个版本卡” 同流程下 FPS 下降、内存未释放对比图

本质区别是:数据可记录、可对比、可说服他人


二、如何采集“有价值”的性能数据?

工具组合建议(我们常用的):
指标 采集工具组合
FPS KeyMob 实时图 + Instruments (FPS Overlay)
CPU/GPU KeyMob 趋势图 + PerfDog (批量设备测试)
内存 Instruments Allocations + KeyMob 图表
崩溃 Crashlytics + KeyMob 崩溃日志本地记录

重点是:采集过程中标记操作步骤,才能“人和图对得上”。


三、我们如何做“数据对比优化”

场景:优化一个有图片渲染 + 动画滑动的界面

步骤如下:

  1. 记录旧版本数据
    • 用 KeyMob 抓图,记录滑动过程帧率、GPU 使用率、内存浮动
    • 导出为图 + 日志段,作为基线
  2. 新版本修改后重新跑一轮
    • 再跑 KeyMob,流程一致,抓相同指标
    • 标记点如:“滚动列表”“加载图片”“点击进入详情”等操作时刻
  3. 对比变化
    • FPS 是否上升?内存是否回落?卡顿是否少了?
    • 若问题没改善,重新分析对照图(有一次我们以为优化了,但数据没变,问题根源在异步任务竞争)

四、怎么用数据指导团队协作与验收?

我们每次重要功能上线前,都会:

  • 要求开发附带 KeyMob 或 PerfDog 的性能图(30秒内)
  • 要求 QA 在 Bug 报告中附加“当时帧率/内存截图” + 操作路径
  • 每次版本发布做一次“对比分析”:从上版本到当前版本,性能数据是提升还是退化

这不是“高标准”,而是减少返工和扯皮最有效方式。


五、遇到的几个常见误区

  • “优化了但数据没变”:说明修改方向错了,或影响点不在关键路径
  • “新设备测不出问题”:低端机测试是数据对比中最具洞察力的来源
  • “只看平均值”:需关注峰值和极端场景(例如切后台/动画冲突/网络拥塞)

小结:调优不靠经验,靠数据说话

想让团队形成一致判断、让优化结果被认可、让调试流程高效,唯一的方法是“用数据表达性能”。

我的建议是:

  • 开发阶段每功能都记录一次图表数据
  • 测试阶段默认记录关键操作流程的系统资源趋势
  • 所有优化都要求有“变化对比图”支持

KeyMob 是我们团队实际采集中最常用工具之一,因为它无需越狱、支持性能+日志同屏,适合日常对比分析。你也可以结合其他方案构建自己的数据驱动流程。

希望这篇文章能帮你把“性能好不好”的判断,从“感觉”转化为“图表”,从主观讨论变成可落地优化。'''

继续阅读 »

'''“感觉卡顿”、“应该是某个操作太重了”、“我们优化过但好像没改善”……在实际项目中,开发和测试经常对性能问题“说不清,道不明”。

这类问题不是技术能力不够,而是缺少数据依据。如果我们能用图表、趋势、对比数据,替代主观印象,就能从“猜测”进化到“可度量优化”。

这篇文章我结合过去几轮 iOS 项目的经验,分享如何用可视化数据(如 FPS、CPU、内存、GPU)来驱动调优决策,过程中使用 KeyMob、Instruments、PerfDog、Crashlytics 等工具,不作推荐,只讲组合实战。


一、数据驱动 vs 直觉调试:差别在哪?

传统方式 数据驱动方式
“点这个会卡” 点这个时帧率从60跌至28,CPU 峰值达90%
“用户说加载慢” 页面初始化从500ms增长到1.2s
“崩了但复现不了” 崩溃时间段系统日志/资源记录对照分析
“好像比上个版本卡” 同流程下 FPS 下降、内存未释放对比图

本质区别是:数据可记录、可对比、可说服他人


二、如何采集“有价值”的性能数据?

工具组合建议(我们常用的):
指标 采集工具组合
FPS KeyMob 实时图 + Instruments (FPS Overlay)
CPU/GPU KeyMob 趋势图 + PerfDog (批量设备测试)
内存 Instruments Allocations + KeyMob 图表
崩溃 Crashlytics + KeyMob 崩溃日志本地记录

重点是:采集过程中标记操作步骤,才能“人和图对得上”。


三、我们如何做“数据对比优化”

场景:优化一个有图片渲染 + 动画滑动的界面

步骤如下:

  1. 记录旧版本数据
    • 用 KeyMob 抓图,记录滑动过程帧率、GPU 使用率、内存浮动
    • 导出为图 + 日志段,作为基线
  2. 新版本修改后重新跑一轮
    • 再跑 KeyMob,流程一致,抓相同指标
    • 标记点如:“滚动列表”“加载图片”“点击进入详情”等操作时刻
  3. 对比变化
    • FPS 是否上升?内存是否回落?卡顿是否少了?
    • 若问题没改善,重新分析对照图(有一次我们以为优化了,但数据没变,问题根源在异步任务竞争)

四、怎么用数据指导团队协作与验收?

我们每次重要功能上线前,都会:

  • 要求开发附带 KeyMob 或 PerfDog 的性能图(30秒内)
  • 要求 QA 在 Bug 报告中附加“当时帧率/内存截图” + 操作路径
  • 每次版本发布做一次“对比分析”:从上版本到当前版本,性能数据是提升还是退化

这不是“高标准”,而是减少返工和扯皮最有效方式。


五、遇到的几个常见误区

  • “优化了但数据没变”:说明修改方向错了,或影响点不在关键路径
  • “新设备测不出问题”:低端机测试是数据对比中最具洞察力的来源
  • “只看平均值”:需关注峰值和极端场景(例如切后台/动画冲突/网络拥塞)

小结:调优不靠经验,靠数据说话

想让团队形成一致判断、让优化结果被认可、让调试流程高效,唯一的方法是“用数据表达性能”。

我的建议是:

  • 开发阶段每功能都记录一次图表数据
  • 测试阶段默认记录关键操作流程的系统资源趋势
  • 所有优化都要求有“变化对比图”支持

KeyMob 是我们团队实际采集中最常用工具之一,因为它无需越狱、支持性能+日志同屏,适合日常对比分析。你也可以结合其他方案构建自己的数据驱动流程。

希望这篇文章能帮你把“性能好不好”的判断,从“感觉”转化为“图表”,从主观讨论变成可落地优化。'''

收起阅读 »

记录cli从2.0.2-3090920231225001升级到2.0.2-4060620250520001遇到的问题

升级更新

vue2
升级原因是打包ios app时提示cli版本与打包机器的版本不一致,即使打包成功也无法上传appstore
先在这里cv一遍配置文件:https://uniapp.dcloud.net.cn/vue2-cli-release.html
然后又发现这里的还不是最新版本,又运行命令升级到最新版本:npx @dcloudio/uvm@latest

启动项目,报错:

ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema.  
 - options has an unknown property 'disableHostCheck'. These properties are valid:  
   object { allowedHosts?, bonjour?, client?, compress?, devMiddleware?, headers?, historyApiFallback?, host?, hot?, http2?, https?, ipc?, liveReload?, magicHtml?, onAfterSetupMiddleware?, onBeforeSetupMiddleware?, onListening?, open?, port?, proxy?, server?, setupExitSignals?, setupMiddlewares?, static?, watchFiles?, webSocketServer? }

修改vue.config.js,把disableHostCheck: true,修改为allowedHosts: 'all',

启动项目,F12报错:

Reason: Error: ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: 42

百度半天,找到解决方法:
原因是自定义的业务代码的js文件里存在module.exports={},新版好像不支持这种写法了,只能全部替换成export function xxxxx。百度说babel能解决这个问题,看了半天直接放弃,直接替换吧


删除devDependencies里的"@babel/runtime": "~7.12.0",删除node_modules文件夹,重新install
改了半天js,终于能看到页面了

随便点几个地方测试,页面出现


之前是没有这玩意的,只有控制台打印的异常,解决方法是修改vue.config.js,增加

config.devServer = {  
                client: {  
                    overlay: false  
                }  
}

终于一切正常了,dev启动一切正常,发ios,真机运行发现tabbar没了
原因:编译的时候出现一堆这种警告Deprecation Warning [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.
,看不到这个一开始就打印的重要报错:

[webpack-dev-server] Project is running at:  
TypeError: Cannot read property 'compress' of undefined

又是webpack的锅,如图修改:

继续阅读 »

vue2
升级原因是打包ios app时提示cli版本与打包机器的版本不一致,即使打包成功也无法上传appstore
先在这里cv一遍配置文件:https://uniapp.dcloud.net.cn/vue2-cli-release.html
然后又发现这里的还不是最新版本,又运行命令升级到最新版本:npx @dcloudio/uvm@latest

启动项目,报错:

ValidationError: Invalid options object. Dev Server has been initialized using an options object that does not match the API schema.  
 - options has an unknown property 'disableHostCheck'. These properties are valid:  
   object { allowedHosts?, bonjour?, client?, compress?, devMiddleware?, headers?, historyApiFallback?, host?, hot?, http2?, https?, ipc?, liveReload?, magicHtml?, onAfterSetupMiddleware?, onBeforeSetupMiddleware?, onListening?, open?, port?, proxy?, server?, setupExitSignals?, setupMiddlewares?, static?, watchFiles?, webSocketServer? }

修改vue.config.js,把disableHostCheck: true,修改为allowedHosts: 'all',

启动项目,F12报错:

Reason: Error: ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: 42

百度半天,找到解决方法:
原因是自定义的业务代码的js文件里存在module.exports={},新版好像不支持这种写法了,只能全部替换成export function xxxxx。百度说babel能解决这个问题,看了半天直接放弃,直接替换吧


删除devDependencies里的"@babel/runtime": "~7.12.0",删除node_modules文件夹,重新install
改了半天js,终于能看到页面了

随便点几个地方测试,页面出现


之前是没有这玩意的,只有控制台打印的异常,解决方法是修改vue.config.js,增加

config.devServer = {  
                client: {  
                    overlay: false  
                }  
}

终于一切正常了,dev启动一切正常,发ios,真机运行发现tabbar没了
原因:编译的时候出现一堆这种警告Deprecation Warning [import]: Sass @import rules are deprecated and will be removed in Dart Sass 3.0.0.
,看不到这个一开始就打印的重要报错:

[webpack-dev-server] Project is running at:  
TypeError: Cannot read property 'compress' of undefined

又是webpack的锅,如图修改:

收起阅读 »

多语言版本上架真麻烦?分享我们发布本地化 iOS App 的全流程踩坑经验(含实用工具对比)

iOS

'''如果你准备把 iOS App 发布到全球市场,开启多语言版本(如英文、日文、韩文、阿拉伯语等),很快你会发现——

App Store 多语言发布并不是“翻译一份文案”这么简单。

这篇文章我将以我们的出海版本上线经历为例,分享本地化 App 发布过程中的实际难点与解决方式,并对比我们用过的几种工具(包括 Apple 原生后台、Fastlane、Appuploader等)在“多语言版本管理”方面的表现,帮你少踩坑。


为什么多语言发布会比预想更复杂?

我们以为是:

  • 翻译几份 App 描述
  • 提供不同语言截图
  • 上传即可完成

实际问题远多于此:

  • 描述文字和关键词需要逐市场策略优化,而不是直接翻译
  • 截图命名规则极易出错,尤其是多个尺寸 + 多语种
  • 不同市场审核人员对“描述语义”和“图片展示”的接受标准不同
  • App Store Connect 界面支持有限,操作繁琐、极易遗漏

我们遇到的典型挑战

1. “上传成功了,但截图显示不对”

  • 原因:我们用了错误的文件命名方式(如 screenshot1.png 放入英文文件夹,实际为日语版本)
  • 教训:命名需严格按 Apple 要求 + 保证文件夹结构准确

2. “描述词中关键词不生效,无法搜索到”

  • 原因:复制中文关键词翻译为英文直接上传,缺乏语义和搜索逻辑适配
  • 教训:各地区 App Store 的 SEO 规则不一样,需结合语言市场调研词优化

3. “有的地区审核特别慢 / 被拒理由不同”

  • 原因:语言文字中包含“特定敏感词”,或者截图展示有地区文化误读
  • 教训:多语言内容不仅是翻译,更要理解目标文化与审查敏感点

我们使用过的工具与对比

Apple App Store Connect 后台

  • 官方支持,界面清晰
  • 多语言切换操作繁琐,截图上传逐一点击
  • 易错文件匹配(不提醒命名错误)

适合:操作次数少、语言版本不多的团队


Fastlane deliver

  • 支持文本元数据结构化配置(.txt/.json)
  • 可以脚本自动上传描述和截图
  • 需编写复杂 config,截图命名严格,报错不友好
  • 不适合非技术人员操作

适合:有脚本化需求、熟悉 CLI 的 DevOps 团队


Appuploader

  • 图形化上传,支持按语言/尺寸目录批量上传截图
  • 多语言关键词、描述支持 导入,版本可控
  • 状态反馈及时,出错提示明确
  • Windows,Linux,Mac都可以上架,非必须Mac

适合:团队多人协作、希望产品/设计能参与多语言上传操作的场景


我们的解决方案策略

文件结构规范 + 本地目录命名标准化

/screenshots  
  /zh-CN/6.7-inch/  
  /en-US/6.7-inch/  
  /ja-JP/6.7-inch/  
  /ar-SA/6.7-inch/

上传执行角色解耦

  • 开发者构建 IPA
  • 产品填写文案、放入目录
  • 使用 Appuploader 上传截图和元数据,不依赖 Mac 或 CLI

成果:从“上传混乱”到“版本清晰”

  • 所有语言内容每次都可快速回查
  • 多语言截图不再混传,准确率提升 90%
  • 新语言版本上线周期从一周压缩到 2 天内
  • 跨角色协作更顺畅,产品可以主动推动版本发布

小结:多语言上架不难,难在流程管理与文化适配

工具只是载体,关键是有没有建立一套适合自己团队的流程体系。如果你想避免每次上传都像“翻山越岭”,可以从以下三点做起:

  1. 结构化命名文件 + 固定目录布局
  2. 明确语言内容版本责任归属
  3. 选用适合你团队角色的上传工具(如 Appuploader等)

如果你也在进行多语言发布,欢迎分享你的管理方法、踩坑案例或使用的工具组合,我们一起打造一套出海团队的“本地化上架指南”。'''

继续阅读 »

'''如果你准备把 iOS App 发布到全球市场,开启多语言版本(如英文、日文、韩文、阿拉伯语等),很快你会发现——

App Store 多语言发布并不是“翻译一份文案”这么简单。

这篇文章我将以我们的出海版本上线经历为例,分享本地化 App 发布过程中的实际难点与解决方式,并对比我们用过的几种工具(包括 Apple 原生后台、Fastlane、Appuploader等)在“多语言版本管理”方面的表现,帮你少踩坑。


为什么多语言发布会比预想更复杂?

我们以为是:

  • 翻译几份 App 描述
  • 提供不同语言截图
  • 上传即可完成

实际问题远多于此:

  • 描述文字和关键词需要逐市场策略优化,而不是直接翻译
  • 截图命名规则极易出错,尤其是多个尺寸 + 多语种
  • 不同市场审核人员对“描述语义”和“图片展示”的接受标准不同
  • App Store Connect 界面支持有限,操作繁琐、极易遗漏

我们遇到的典型挑战

1. “上传成功了,但截图显示不对”

  • 原因:我们用了错误的文件命名方式(如 screenshot1.png 放入英文文件夹,实际为日语版本)
  • 教训:命名需严格按 Apple 要求 + 保证文件夹结构准确

2. “描述词中关键词不生效,无法搜索到”

  • 原因:复制中文关键词翻译为英文直接上传,缺乏语义和搜索逻辑适配
  • 教训:各地区 App Store 的 SEO 规则不一样,需结合语言市场调研词优化

3. “有的地区审核特别慢 / 被拒理由不同”

  • 原因:语言文字中包含“特定敏感词”,或者截图展示有地区文化误读
  • 教训:多语言内容不仅是翻译,更要理解目标文化与审查敏感点

我们使用过的工具与对比

Apple App Store Connect 后台

  • 官方支持,界面清晰
  • 多语言切换操作繁琐,截图上传逐一点击
  • 易错文件匹配(不提醒命名错误)

适合:操作次数少、语言版本不多的团队


Fastlane deliver

  • 支持文本元数据结构化配置(.txt/.json)
  • 可以脚本自动上传描述和截图
  • 需编写复杂 config,截图命名严格,报错不友好
  • 不适合非技术人员操作

适合:有脚本化需求、熟悉 CLI 的 DevOps 团队


Appuploader

  • 图形化上传,支持按语言/尺寸目录批量上传截图
  • 多语言关键词、描述支持 导入,版本可控
  • 状态反馈及时,出错提示明确
  • Windows,Linux,Mac都可以上架,非必须Mac

适合:团队多人协作、希望产品/设计能参与多语言上传操作的场景


我们的解决方案策略

文件结构规范 + 本地目录命名标准化

/screenshots  
  /zh-CN/6.7-inch/  
  /en-US/6.7-inch/  
  /ja-JP/6.7-inch/  
  /ar-SA/6.7-inch/

上传执行角色解耦

  • 开发者构建 IPA
  • 产品填写文案、放入目录
  • 使用 Appuploader 上传截图和元数据,不依赖 Mac 或 CLI

成果:从“上传混乱”到“版本清晰”

  • 所有语言内容每次都可快速回查
  • 多语言截图不再混传,准确率提升 90%
  • 新语言版本上线周期从一周压缩到 2 天内
  • 跨角色协作更顺畅,产品可以主动推动版本发布

小结:多语言上架不难,难在流程管理与文化适配

工具只是载体,关键是有没有建立一套适合自己团队的流程体系。如果你想避免每次上传都像“翻山越岭”,可以从以下三点做起:

  1. 结构化命名文件 + 固定目录布局
  2. 明确语言内容版本责任归属
  3. 选用适合你团队角色的上传工具(如 Appuploader等)

如果你也在进行多语言发布,欢迎分享你的管理方法、踩坑案例或使用的工具组合,我们一起打造一套出海团队的“本地化上架指南”。'''

收起阅读 »

我用6种方法解决了真机抓不到包的问题(附工具组合实战经验)

iOS

'''最近一次项目联调阶段,我们集成了第三方支付SDK。功能流程正常,日志也没有报错,但后台反馈接口调用失败,我们在 Charles 和 Fiddler 上怎么都抓不到请求。

这不是第一次遇到“真机抓不到包”的问题,但这次更棘手——没有日志、抓不到请求、模拟器复现不了。最终,我通过6种方法逐步排查,才定位到问题根源。

这篇文章就是想把那次经验总结下来,供你下次遇到类似问题时,不至于像我一样从零开始试。


方法一:基础抓包工具排查(Charles/Fiddler)

我第一反应是打开 Charles 和 Fiddler,确认网络代理配置:

  • 手机设置代理到电脑IP+端口;
  • Charles 打开 SSL Proxying;
  • 证书安装并信任完成;

但结果很奇怪:

  • 浏览器请求能抓;
  • SDK 请求抓不到;
  • 没有握手失败提示,只是“像没发请求一样安静”;

这种情况在以前我遇到过,可能是请求没走系统代理,或者被HTTPS Pinning拦住了。


方法二:确认请求是否“真的发出去了”(Wireshark)

于是我用 Wireshark 抓取物理网卡流量,过滤设备IP和目标域名,观察是否真的有发起TCP连接。

结果是:有连接行为,但没有TLS握手成功。

这说明请求“尝试发出去了”,但中间被阻断了。很可能就是证书校验失败。


方法三:查阅系统日志 & SDK输出

adb logcat(Android)+ Xcode 控制台(iOS)查看App的网络层输出,发现:

  • SDK 请求开始后,log中没有任何状态码信息;
  • 没有超时、没有fail callback,只是“调用后无响应”;

而 SDK 文档里也明确说“出于安全考虑启用了双向认证机制”,这意味着中间人代理证书(Charles等)肯定被拒绝。


方法四:尝试 mitmproxy 拦截调试

我尝试用 mitmproxy 构建一个脚本环境:

  • 拦截指定请求路径;
  • 构造假响应;
  • 打印出完整请求头;

mitmproxy 支持更高级别的TLS调试,有时能绕开Charles的问题。但结果依旧:

  • 请求未通过代理;
  • 拦截器没有命中;
  • 无任何日志输出;

方法五:尝试封装替代接口还原(不推荐)

我尝试复制SDK调用接口,直接用Postman或fetch重构请求行为:

  • 构造相同Header;
  • 使用测试账号信息;
  • 强行调用服务端接口验证参数构成;

但结果和预期不同:重构请求能成功,但实际SDK调用仍然失败。这说明SDK内部行为有我们无法模拟的特殊处理逻辑。


方法六:物理抓包——Sniffmaster(最终成功)

最后我启用了我们团队授权的工具:Sniffmaster 抓包大师

这工具支持:

  • 插线即抓包,无需越狱或代理;
  • 可抓取真机上所有TCP/HTTPS流量;
  • 还能筛选特定App包名,减少噪音干扰;

启动后我立即看到了目标请求的流量,发现 SDK 发送时带了一个错误参数字段值为 null,而构建脚本中该字段未注入,服务端解析失败。

问题修复只需加一行构建配置,但如果没有抓到真实包体,我们根本不知道请求内容有问题。


总结:我的抓包组合建议

排查目的 工具组合
快速验证设置 Charles / Fiddler
抓不到时排查发包状态 Wireshark
深层TLS调试 mitmproxy
系统限制/信任问题 adb logcat / Xcode 控制台
封装请求真实内容查看 Sniffmaster

这次经验告诉我:抓不到包,不是你不会抓,而是你可能看错了地方。

下次再遇到“请求消失”的问题,不妨按照这6步方法顺序逐个尝试。'''

继续阅读 »

'''最近一次项目联调阶段,我们集成了第三方支付SDK。功能流程正常,日志也没有报错,但后台反馈接口调用失败,我们在 Charles 和 Fiddler 上怎么都抓不到请求。

这不是第一次遇到“真机抓不到包”的问题,但这次更棘手——没有日志、抓不到请求、模拟器复现不了。最终,我通过6种方法逐步排查,才定位到问题根源。

这篇文章就是想把那次经验总结下来,供你下次遇到类似问题时,不至于像我一样从零开始试。


方法一:基础抓包工具排查(Charles/Fiddler)

我第一反应是打开 Charles 和 Fiddler,确认网络代理配置:

  • 手机设置代理到电脑IP+端口;
  • Charles 打开 SSL Proxying;
  • 证书安装并信任完成;

但结果很奇怪:

  • 浏览器请求能抓;
  • SDK 请求抓不到;
  • 没有握手失败提示,只是“像没发请求一样安静”;

这种情况在以前我遇到过,可能是请求没走系统代理,或者被HTTPS Pinning拦住了。


方法二:确认请求是否“真的发出去了”(Wireshark)

于是我用 Wireshark 抓取物理网卡流量,过滤设备IP和目标域名,观察是否真的有发起TCP连接。

结果是:有连接行为,但没有TLS握手成功。

这说明请求“尝试发出去了”,但中间被阻断了。很可能就是证书校验失败。


方法三:查阅系统日志 & SDK输出

adb logcat(Android)+ Xcode 控制台(iOS)查看App的网络层输出,发现:

  • SDK 请求开始后,log中没有任何状态码信息;
  • 没有超时、没有fail callback,只是“调用后无响应”;

而 SDK 文档里也明确说“出于安全考虑启用了双向认证机制”,这意味着中间人代理证书(Charles等)肯定被拒绝。


方法四:尝试 mitmproxy 拦截调试

我尝试用 mitmproxy 构建一个脚本环境:

  • 拦截指定请求路径;
  • 构造假响应;
  • 打印出完整请求头;

mitmproxy 支持更高级别的TLS调试,有时能绕开Charles的问题。但结果依旧:

  • 请求未通过代理;
  • 拦截器没有命中;
  • 无任何日志输出;

方法五:尝试封装替代接口还原(不推荐)

我尝试复制SDK调用接口,直接用Postman或fetch重构请求行为:

  • 构造相同Header;
  • 使用测试账号信息;
  • 强行调用服务端接口验证参数构成;

但结果和预期不同:重构请求能成功,但实际SDK调用仍然失败。这说明SDK内部行为有我们无法模拟的特殊处理逻辑。


方法六:物理抓包——Sniffmaster(最终成功)

最后我启用了我们团队授权的工具:Sniffmaster 抓包大师

这工具支持:

  • 插线即抓包,无需越狱或代理;
  • 可抓取真机上所有TCP/HTTPS流量;
  • 还能筛选特定App包名,减少噪音干扰;

启动后我立即看到了目标请求的流量,发现 SDK 发送时带了一个错误参数字段值为 null,而构建脚本中该字段未注入,服务端解析失败。

问题修复只需加一行构建配置,但如果没有抓到真实包体,我们根本不知道请求内容有问题。


总结:我的抓包组合建议

排查目的 工具组合
快速验证设置 Charles / Fiddler
抓不到时排查发包状态 Wireshark
深层TLS调试 mitmproxy
系统限制/信任问题 adb logcat / Xcode 控制台
封装请求真实内容查看 Sniffmaster

这次经验告诉我:抓不到包,不是你不会抓,而是你可能看错了地方。

下次再遇到“请求消失”的问题,不妨按照这6步方法顺序逐个尝试。'''

收起阅读 »

iOS 应用如何防止源码与资源被轻易还原?多维度混淆策略与实战工具盘点(含 Ipa Guard)

iOS

'''在当今 iOS 应用开发中,安全已不仅限于接口加密、用户认证,而延伸到了“安装包本体”的结构保护。尤其在应用发布或分发后,任何人都可以下载 IPA 文件并进行反编译、静态分析,一旦类名、方法名、资源结构暴露,就可能被仿制、篡改,甚至造成用户和数据安全风险。

这篇文章,我不会只推荐一个工具,而是分享一套我们团队在多个项目中验证过的“多维度 App 安全混淆策略”,包括源码层、构建层、IPA 层的组合方法,并实际使用过多个工具(如 Ipa Guard、Swift Shield、LLVM 插件等),实现从逻辑到资源的全流程防护


一、核心问题:iOS 安装包暴露了什么?

用 class-dump、Hopper、IDA 等工具打开 IPA,你会看到什么?

  • Swift/OC 类名、函数名、模块结构;
  • HTML、JS、json 配置等资源文件;
  • 图标、按钮命名明确表达功能;
  • 甚至 log 调试输出、接口路径等敏感数据;

因此,我们将混淆目标划分为两个层面:

  1. 源码层级(可控项目):函数名、变量名、类名混淆;
  2. IPA 层级(不可控或已交付项目):资源、符号、路径结构的再混淆。

二、源码层混淆策略(适合源码可控项目)

工具 1:Swift Shield

  • 功能:混淆 Swift 的类、结构体、方法名称;
  • 特点:保留类型完整性,不影响调试;
  • 优势:适合 Swift 项目,无需重写业务逻辑;
  • 使用建议:集成 Xcode build phases。

工具 2:Obfuscator-LLVM

  • 功能:基于 LLVM 插件在编译阶段进行控制流、字符串等深度混淆;
  • 特点:适合高安全场景,如支付/身份验证功能;
  • 优势:不可读性极强,但集成复杂;
  • 使用建议:适用于长期维护或敏感项目。

三、IPA 层混淆策略(适合无源码或快速交付场景)

当你只有 IPA 文件,例如外包交付包、历史项目、非源码构建的 CI 输出文件,就无法做源码级混淆。这时推荐以下方法:

工具 3:Ipa Guard

  • 功能:对 IPA 文件中的类名、方法名、资源名等进行深度混淆;
  • 特点:
    • 无需源码;
    • 支持 OC、Swift、Flutter、H5、React Native;
    • 支持图片/配置/js/json 等资源文件自动重命名并同步引用;
    • 支持修改 md5、UDID 等元数据;
    • 本地执行,支持签名后直接测试;
  • 适用场景:老项目、交付文件、外包交接、紧急加固;
  • 使用建议:接入构建流程或作为交付前加固环节。

工具 4:ResignTool(签名辅助工具)

  • 用于对 IPA 文件在修改后快速重签名;
  • 搭配 Ipa Guard 使用,形成完整流程。

四、资源防护组合策略

除了类名方法结构,资源泄露也是重灾区,推荐以下组合方法:

防护点 推荐方式 工具
图片命名/路径结构 重命名 + MD5 重写 Ipa Guard
js/html/json 文件 混淆路径 + 加密内容 Ipa Guard + JS混淆工具(如 javascript-obfuscator)
本地接口地址配置 base64 + 加密配置文件 自定义逻辑 + 文件重命名工具
文件结构可读性 拆分压缩 + 文件打乱 ZIP保护 + 混淆同步工具

五、实战流程推荐(兼顾灵活与强度)

1. 项目初期(源码控制)  
   → Swift Shield + strip debug symbols  
   → 插入 AntiDebugKit 检测机制  

2. 构建阶段(release 输出)  
   → 调用 Obfuscator-LLVM 插件(如使用 OC)  

3. 打包后(无源码阶段)  
   → 使用 Ipa Guard 处理 IPA 文件  
   → 自动执行重签名 ResignTool 流程  
1  
4. 测试分发  
   → 上传 TF 或蒲公英等平台

六、小结:安全是组合拳,不是单点工具

App 安全不是靠一个插件、一个混淆脚本就能万无一失的,它是由多个策略共同组成的一张防护网。根据实际项目阶段(开发中/交付后/上线前),选择合适工具组合,既能节省开发成本,也能最大程度保护应用资产。

如果你的项目正处于上线前或代码已交付阶段,不妨尝试引入 Ipa Guard 作为“后混淆工具”处理 IPA 文件,让 App 至少“看起来不好分析”。'''

继续阅读 »

'''在当今 iOS 应用开发中,安全已不仅限于接口加密、用户认证,而延伸到了“安装包本体”的结构保护。尤其在应用发布或分发后,任何人都可以下载 IPA 文件并进行反编译、静态分析,一旦类名、方法名、资源结构暴露,就可能被仿制、篡改,甚至造成用户和数据安全风险。

这篇文章,我不会只推荐一个工具,而是分享一套我们团队在多个项目中验证过的“多维度 App 安全混淆策略”,包括源码层、构建层、IPA 层的组合方法,并实际使用过多个工具(如 Ipa Guard、Swift Shield、LLVM 插件等),实现从逻辑到资源的全流程防护


一、核心问题:iOS 安装包暴露了什么?

用 class-dump、Hopper、IDA 等工具打开 IPA,你会看到什么?

  • Swift/OC 类名、函数名、模块结构;
  • HTML、JS、json 配置等资源文件;
  • 图标、按钮命名明确表达功能;
  • 甚至 log 调试输出、接口路径等敏感数据;

因此,我们将混淆目标划分为两个层面:

  1. 源码层级(可控项目):函数名、变量名、类名混淆;
  2. IPA 层级(不可控或已交付项目):资源、符号、路径结构的再混淆。

二、源码层混淆策略(适合源码可控项目)

工具 1:Swift Shield

  • 功能:混淆 Swift 的类、结构体、方法名称;
  • 特点:保留类型完整性,不影响调试;
  • 优势:适合 Swift 项目,无需重写业务逻辑;
  • 使用建议:集成 Xcode build phases。

工具 2:Obfuscator-LLVM

  • 功能:基于 LLVM 插件在编译阶段进行控制流、字符串等深度混淆;
  • 特点:适合高安全场景,如支付/身份验证功能;
  • 优势:不可读性极强,但集成复杂;
  • 使用建议:适用于长期维护或敏感项目。

三、IPA 层混淆策略(适合无源码或快速交付场景)

当你只有 IPA 文件,例如外包交付包、历史项目、非源码构建的 CI 输出文件,就无法做源码级混淆。这时推荐以下方法:

工具 3:Ipa Guard

  • 功能:对 IPA 文件中的类名、方法名、资源名等进行深度混淆;
  • 特点:
    • 无需源码;
    • 支持 OC、Swift、Flutter、H5、React Native;
    • 支持图片/配置/js/json 等资源文件自动重命名并同步引用;
    • 支持修改 md5、UDID 等元数据;
    • 本地执行,支持签名后直接测试;
  • 适用场景:老项目、交付文件、外包交接、紧急加固;
  • 使用建议:接入构建流程或作为交付前加固环节。

工具 4:ResignTool(签名辅助工具)

  • 用于对 IPA 文件在修改后快速重签名;
  • 搭配 Ipa Guard 使用,形成完整流程。

四、资源防护组合策略

除了类名方法结构,资源泄露也是重灾区,推荐以下组合方法:

防护点 推荐方式 工具
图片命名/路径结构 重命名 + MD5 重写 Ipa Guard
js/html/json 文件 混淆路径 + 加密内容 Ipa Guard + JS混淆工具(如 javascript-obfuscator)
本地接口地址配置 base64 + 加密配置文件 自定义逻辑 + 文件重命名工具
文件结构可读性 拆分压缩 + 文件打乱 ZIP保护 + 混淆同步工具

五、实战流程推荐(兼顾灵活与强度)

1. 项目初期(源码控制)  
   → Swift Shield + strip debug symbols  
   → 插入 AntiDebugKit 检测机制  

2. 构建阶段(release 输出)  
   → 调用 Obfuscator-LLVM 插件(如使用 OC)  

3. 打包后(无源码阶段)  
   → 使用 Ipa Guard 处理 IPA 文件  
   → 自动执行重签名 ResignTool 流程  
1  
4. 测试分发  
   → 上传 TF 或蒲公英等平台

六、小结:安全是组合拳,不是单点工具

App 安全不是靠一个插件、一个混淆脚本就能万无一失的,它是由多个策略共同组成的一张防护网。根据实际项目阶段(开发中/交付后/上线前),选择合适工具组合,既能节省开发成本,也能最大程度保护应用资产。

如果你的项目正处于上线前或代码已交付阶段,不妨尝试引入 Ipa Guard 作为“后混淆工具”处理 IPA 文件,让 App 至少“看起来不好分析”。'''

收起阅读 »

2025年DCloud插件大赛启动,30部鸿蒙手机大放送!

插件大赛 鸿蒙next harmony

国产鸿蒙生态发展艰巨而重要。

  • 很多开发者想迁移鸿蒙而苦于轮子不完善,不能低成本适配。
  • 很多开发者想要一个完美的跨平台方案来全平台覆盖,不必为了跨平台而牺牲性能体验。

uni-app x已经完成Android、iOS、鸿蒙、Web、微信小程序等主流平台全覆盖。

为进一步繁荣uni生态,特别是推动鸿蒙平台的生态建设,惠及产业和开发者,DCloud 正式启动「2025年度插件大赛」。

大赛准备了丰富的奖励,除了流量、荣誉外还有30部纯血鸿蒙手机。

奖项设置:

本次大赛与往届有一个差别,就是更加普惠。本次没有特等奖,三等奖也发放价值2699元的纯血鸿蒙手机(全新机)。

欢迎更多插件作者积极参与,给大家更多机会。

一等奖(2名):

奖品:1万元插件包销 + 鸿蒙手机1部 + 插件市场置顶推荐半个月 + HBuilderX预置 + HBuilderX超大鼠标垫 + DCloud奖牌

二等奖(8名):

奖品:1000元插件包销 + 鸿蒙手机1部 + 插件市场置顶推荐1个星期 + HBuilderX超大鼠标垫 + DCloud奖牌

三等奖(20名):

奖品:200元uniCloud代金券 + 鸿蒙手机1部 + HBuilderX超大鼠标垫 + DCloud奖牌

贡献奖(50名):

奖品:HBuilderX超大鼠标垫

奖品说明:

  1. “插件包销”,是指获奖插件通过插件市场销售,DCloud兜底包销。以1等奖的1万元包销为例,如果获奖插件在插件市场1年内销售额没有达到1万元,则由DCloud付差额给获奖者进行兜底。包销只针对付费插件,如免费插件获得二等奖及以上奖励,其中的包销奖励无效。包销插件需持续迭代,如插件作者放弃维护,则包销无效。

  2. “HBuilderX预置”,是在HBuilderX新建项目界面,可直接选择该项目模板。这为插件带来大量的流量。不适合预置的插件类型,无法领取此奖项。HBuilderX预置窗体界面如下:

  1. 本次插件大赛,目标是普惠更广大开发者,解决很多工程师缺少鸿蒙真机的困境,故本次奖励的鸿蒙手机为统一型号为nova 14 256GB

  2. 鸿蒙手机的奖励需满足两个条件:

    • 插件兼容鸿蒙平台
    • 插件作者通过DCloud专属链接到鸿蒙开发者平台注册一个新的开发者账号

除上述奖品外:

  • 二等奖及以上获奖插件作者,都将进入DCloud VIP技术支持群,享受优先的技术支付、问题反馈。
  • 所有获奖插件的集锦页面,还将通过HBuilderX工具、论坛、IM/QQ/微信群进行全量推广,给予优秀插件充分的曝光。

参赛要求:

  1. 参赛起止时间:从2025年6月1日起,到2025年8月31日止。
  2. 插件鼓励范围
    • 兼容鸿蒙的插件,包括前端插件和uts原生插件。uts插件同时支持uni-app和uni-app x。
    • 适配uni-app x的插件。
    • uniCloud插件:优秀的云端一体插件
    • 有助于开发者广告变现的运营类插件
    • HBuilder插件
      你的插件若能同时覆盖多个鼓励范围的插件,则buff叠满!
  3. 在本次大赛有效期内提交或更新插件到插件市场,且下载人数不低于50人,即可自动进入大赛候选名单,无需单独报名。

如需帮助或技术指导,可进入uni-im进行交流,官方团队将为你提供支持。


继续阅读 »

国产鸿蒙生态发展艰巨而重要。

  • 很多开发者想迁移鸿蒙而苦于轮子不完善,不能低成本适配。
  • 很多开发者想要一个完美的跨平台方案来全平台覆盖,不必为了跨平台而牺牲性能体验。

uni-app x已经完成Android、iOS、鸿蒙、Web、微信小程序等主流平台全覆盖。

为进一步繁荣uni生态,特别是推动鸿蒙平台的生态建设,惠及产业和开发者,DCloud 正式启动「2025年度插件大赛」。

大赛准备了丰富的奖励,除了流量、荣誉外还有30部纯血鸿蒙手机。

奖项设置:

本次大赛与往届有一个差别,就是更加普惠。本次没有特等奖,三等奖也发放价值2699元的纯血鸿蒙手机(全新机)。

欢迎更多插件作者积极参与,给大家更多机会。

一等奖(2名):

奖品:1万元插件包销 + 鸿蒙手机1部 + 插件市场置顶推荐半个月 + HBuilderX预置 + HBuilderX超大鼠标垫 + DCloud奖牌

二等奖(8名):

奖品:1000元插件包销 + 鸿蒙手机1部 + 插件市场置顶推荐1个星期 + HBuilderX超大鼠标垫 + DCloud奖牌

三等奖(20名):

奖品:200元uniCloud代金券 + 鸿蒙手机1部 + HBuilderX超大鼠标垫 + DCloud奖牌

贡献奖(50名):

奖品:HBuilderX超大鼠标垫

奖品说明:

  1. “插件包销”,是指获奖插件通过插件市场销售,DCloud兜底包销。以1等奖的1万元包销为例,如果获奖插件在插件市场1年内销售额没有达到1万元,则由DCloud付差额给获奖者进行兜底。包销只针对付费插件,如免费插件获得二等奖及以上奖励,其中的包销奖励无效。包销插件需持续迭代,如插件作者放弃维护,则包销无效。

  2. “HBuilderX预置”,是在HBuilderX新建项目界面,可直接选择该项目模板。这为插件带来大量的流量。不适合预置的插件类型,无法领取此奖项。HBuilderX预置窗体界面如下:

  1. 本次插件大赛,目标是普惠更广大开发者,解决很多工程师缺少鸿蒙真机的困境,故本次奖励的鸿蒙手机为统一型号为nova 14 256GB

  2. 鸿蒙手机的奖励需满足两个条件:

    • 插件兼容鸿蒙平台
    • 插件作者通过DCloud专属链接到鸿蒙开发者平台注册一个新的开发者账号

除上述奖品外:

  • 二等奖及以上获奖插件作者,都将进入DCloud VIP技术支持群,享受优先的技术支付、问题反馈。
  • 所有获奖插件的集锦页面,还将通过HBuilderX工具、论坛、IM/QQ/微信群进行全量推广,给予优秀插件充分的曝光。

参赛要求:

  1. 参赛起止时间:从2025年6月1日起,到2025年8月31日止。
  2. 插件鼓励范围
    • 兼容鸿蒙的插件,包括前端插件和uts原生插件。uts插件同时支持uni-app和uni-app x。
    • 适配uni-app x的插件。
    • uniCloud插件:优秀的云端一体插件
    • 有助于开发者广告变现的运营类插件
    • HBuilder插件
      你的插件若能同时覆盖多个鼓励范围的插件,则buff叠满!
  3. 在本次大赛有效期内提交或更新插件到插件市场,且下载人数不低于50人,即可自动进入大赛候选名单,无需单独报名。

如需帮助或技术指导,可进入uni-im进行交流,官方团队将为你提供支持。


收起阅读 »

uview-plus3.0 up-popup与scroll-view使用在ios上出现层级问题

插件讨论

在弹出层中如果使用 scroll-view,在嵌套使用up-popup组件时会出现弹出层的层级以及遮罩层的层级错乱。
解决办法:在编译成微信小程序时 在up-popup外部加一层 <root-portal> </root-portal> 即可

继续阅读 »

在弹出层中如果使用 scroll-view,在嵌套使用up-popup组件时会出现弹出层的层级以及遮罩层的层级错乱。
解决办法:在编译成微信小程序时 在up-popup外部加一层 <root-portal> </root-portal> 即可

收起阅读 »

如何将 iOS 性能调试融入日常开发流程?构建“默认监控机制”的实战经验(含 KeyMob 工具搭配)

iOS

'''性能调试,很多人认为是“上线前最后一步”或“出问题才分析”的事情。但随着项目体积变大、组件多层嵌套、功能发布频繁,“临时调试”已不足以应对持续迭代的复杂度。

这篇文章,我想分享我们团队是如何把性能调试融入到每次功能开发、提测、合并、发布等流程中的。过程中使用了 Instruments、KeyMob(克魔)、Xcode 自带工具、日志归档策略等,目的不是打造庞大系统,而是建立一套“用得起、能落地”的日常机制。


一、为什么要“日常调试”而不是“上线前再看”?

真实项目中我们遇到过:

  • 某个合并功能造成页面加载时间+200%,上线前才发现
  • 测试反馈“卡一下”,无法复现,后查为主线程 I/O 导致帧率抖动
  • 多人开发同一模块,谁引入性能问题说不清

根源是:调试和开发分离,性能变成事后处理,无法关联修改点与性能变动。


二、我们建立的“日常性能监控点”有哪些?

开发环节 性能观察动作 工具
新功能提交前 跑一遍关键操作流程,记录性能图 KeyMob
合并前审核 除代码 review,附带“性能变化截图” KeyMob + Instruments
测试阶段 测试同事连接 KeyMob,对卡顿/波动打标反馈 KeyMob
上线预演 低端设备连续运行30分钟,抓异常波段和日志 KeyMob + Crashlytics

这些步骤看起来很多,其实大部分只需 10~20 分钟即可完成,重点是让“性能数据成为沟通语言”。


三、关键机制:日志归档 + 性能趋势图对比

我们把日志和性能图归档制度做成“版本文档规范”,每轮迭代固定记录:

  • 日志关键路径:启动流程、异步处理、API返回点
  • KeyMob 导出的性能图(可筛选 FPS/CPU/GPU)
  • 如果有异常点,截图 + 时间戳 + 操作说明

这在一次提测中发现页面卡顿时非常关键,QA 给出“4月12日 下午2:36 登录后卡顿”,我们用图对比两个版本发现了启动动画改动引发的 GPU 峰值。


四、为什么用 KeyMob 做日常监控?

不止是工具本身的性能图表能力,更重要是它:

  • 跨平台可用(QA 用 Windows、我用 macOS,操作一致)
  • 日志/性能并排查看,方便关联操作和系统资源变化
  • 无需越狱、低上手门槛,适合非技术角色也能参与

我们测试部同事现在每天都开着 KeyMob 跑 App 流程,遇到感觉异常的地方就截图时间点给我,我用日志+图表直接排查。


五、补充流程建议:不打断节奏的集成方式

我们不希望工具成为“流程障碍”,所以:

  • 所有 KeyMob 操作设为“预设模板”,测试打开即用
  • 所有日志格式统一(例如 [INFO][模块][时间][事件]
  • 合并请求 checklist 加上“是否跑过性能流程”

这不是强制,而是一种“默认动作”设计:每次功能开发,都默认有人看过性能图,有对比记录,有归档。


小结:性能调试的最佳时机不是上线前,而是写代码那一刻

调试不是“等出问题再做”,也不一定需要强大平台,关键是是否建立了一种习惯——每一次功能都顺手带上性能感知

我的建议是:

  • 不求精准分析,只求能观察变化
  • 不靠专项检测,只靠流程融入
  • 不追求复杂数据,只求能被理解和比对

希望这篇文章能帮你构建起一套“默认性能意识”,让问题在最早发现、最少代价下解决。'''

继续阅读 »

'''性能调试,很多人认为是“上线前最后一步”或“出问题才分析”的事情。但随着项目体积变大、组件多层嵌套、功能发布频繁,“临时调试”已不足以应对持续迭代的复杂度。

这篇文章,我想分享我们团队是如何把性能调试融入到每次功能开发、提测、合并、发布等流程中的。过程中使用了 Instruments、KeyMob(克魔)、Xcode 自带工具、日志归档策略等,目的不是打造庞大系统,而是建立一套“用得起、能落地”的日常机制。


一、为什么要“日常调试”而不是“上线前再看”?

真实项目中我们遇到过:

  • 某个合并功能造成页面加载时间+200%,上线前才发现
  • 测试反馈“卡一下”,无法复现,后查为主线程 I/O 导致帧率抖动
  • 多人开发同一模块,谁引入性能问题说不清

根源是:调试和开发分离,性能变成事后处理,无法关联修改点与性能变动。


二、我们建立的“日常性能监控点”有哪些?

开发环节 性能观察动作 工具
新功能提交前 跑一遍关键操作流程,记录性能图 KeyMob
合并前审核 除代码 review,附带“性能变化截图” KeyMob + Instruments
测试阶段 测试同事连接 KeyMob,对卡顿/波动打标反馈 KeyMob
上线预演 低端设备连续运行30分钟,抓异常波段和日志 KeyMob + Crashlytics

这些步骤看起来很多,其实大部分只需 10~20 分钟即可完成,重点是让“性能数据成为沟通语言”。


三、关键机制:日志归档 + 性能趋势图对比

我们把日志和性能图归档制度做成“版本文档规范”,每轮迭代固定记录:

  • 日志关键路径:启动流程、异步处理、API返回点
  • KeyMob 导出的性能图(可筛选 FPS/CPU/GPU)
  • 如果有异常点,截图 + 时间戳 + 操作说明

这在一次提测中发现页面卡顿时非常关键,QA 给出“4月12日 下午2:36 登录后卡顿”,我们用图对比两个版本发现了启动动画改动引发的 GPU 峰值。


四、为什么用 KeyMob 做日常监控?

不止是工具本身的性能图表能力,更重要是它:

  • 跨平台可用(QA 用 Windows、我用 macOS,操作一致)
  • 日志/性能并排查看,方便关联操作和系统资源变化
  • 无需越狱、低上手门槛,适合非技术角色也能参与

我们测试部同事现在每天都开着 KeyMob 跑 App 流程,遇到感觉异常的地方就截图时间点给我,我用日志+图表直接排查。


五、补充流程建议:不打断节奏的集成方式

我们不希望工具成为“流程障碍”,所以:

  • 所有 KeyMob 操作设为“预设模板”,测试打开即用
  • 所有日志格式统一(例如 [INFO][模块][时间][事件]
  • 合并请求 checklist 加上“是否跑过性能流程”

这不是强制,而是一种“默认动作”设计:每次功能开发,都默认有人看过性能图,有对比记录,有归档。


小结:性能调试的最佳时机不是上线前,而是写代码那一刻

调试不是“等出问题再做”,也不一定需要强大平台,关键是是否建立了一种习惯——每一次功能都顺手带上性能感知

我的建议是:

  • 不求精准分析,只求能观察变化
  • 不靠专项检测,只靠流程融入
  • 不追求复杂数据,只求能被理解和比对

希望这篇文章能帮你构建起一套“默认性能意识”,让问题在最早发现、最少代价下解决。'''

收起阅读 »

实战对比4种 iOS IPA 上传工具:从 Xcode 到 Appuploader,哪种方式最适合你?

iOS

'''作为一名前端出身、后转移动开发的工程师,iOS 上架流程一度让我感到“神秘又繁琐”。尤其是将构建好的 IPA 文件提交到 App Store Connect,过程远比上传安卓包复杂。

这几年我尝试了多种方式,从 Xcode 自带 Transporter,到命令行工具、自动化方案,再到图形工具,今天就分享我真实使用过的几种方法,以及它们在不同场景下的表现。


上传方式 1:Xcode Transporter / Transporter App

优点:

  • 官方出品,稳定性好,权限校验完整
  • 支持拖拽 IPA,界面清晰
  • 可以直接登录 Apple ID,适合已有完整 Apple 生态的开发者

局限:

  • 只能在 macOS 系统中使用
  • 登录频繁触发双重验证
  • 无法批量管理截图、本地化内容
  • 对非开发人员不够友好,操作上下文较多

适用场景:

  • 原生开发者、使用 Xcode 构建 App 的团队
  • 有 macOS 设备,愿意在官方路径上操作上传

上传方式 2:altool 命令行工具(Xcode CLI)

优点:

  • 可写入自动化脚本,适合 CI/CD 流程
  • 支持 API 密钥调用,绕过 Apple ID 验证
  • 适用于版本控制的命令行用户

局限:

  • 命令参数复杂,初学者容易出错
  • 无界面提示,错误信息不直观
  • 无截图或元数据上传能力(只能上传 IPA)

适用场景:

  • DevOps 团队、使用 Jenkins/Fastlane 进行持续交付
  • 高度熟悉命令行开发环境的开发者

上传方式 3:Fastlane deliver

优点:

  • 自动化程度高,支持 IPA + 截图 + 文案上传
  • 可集成版本描述、多语言信息、元数据管理
  • 社区活跃,有完整文档和配置示例

局限:

  • 配置复杂度较高,需要维护 deliverfile
  • 脚本需不断适配 Apple 审核机制更新
  • 非技术角色几乎无法参与流程

适用场景:

  • 有自动化需求的团队
  • 熟悉 Ruby 或已有 Fastlane 体系的项目组

上传方式 4:Appuploader

优点:

  • 支持 Windows / Linux / macOS,平台适配好
  • 图形化操作,适合产品/运营参与截图上传
  • 支持证书创建、描述文件管理、截图识别上传
  • 不依赖 Mac 或 Xcode,可全流程完成 IPA 提交

局限:

  • 不属于官方工具
  • 不支持复杂 CI/CD 自动化(更偏向手动交付场景)

适用场景:

  • 跨平台开发者(如使用 Flutter、React Native)
  • 无 Mac 环境、希望非技术成员参与上架流程
  • 需要在 Windows 或 Linux 上完成 iOS 发布的场景

总结对比一览:

工具 系统限制 自动化程度 支持截图上传 适合人群
Xcode Transporter macOS 原生开发者
altool CLI macOS 高阶技术用户
Fastlane deliver 跨平台 自动化工程师团队
Appuploader 跨平台 独立开发者、非技术团队

我的选择建议:

  • 如果你是小团队或非 Mac 用户:推荐使用 Appuploader,可以一人完成构建 + 上架全过程
  • 如果你已有自动化发布体系:Fastlane + altool 是更合适的组合
  • 只偶尔手动发布,且使用 Mac 开发:Xcode Transporter 也足够应付
  • 要支持产品参与多语言内容上传:图形工具(如 Appuploader)更易协作

上架工具没有绝对优劣,关键在于你的使用场景、协作模式与团队结构。你用的是什么方式上传 IPA?是否考虑多工具结合使用?欢迎分享你的发布流程!'''

继续阅读 »

'''作为一名前端出身、后转移动开发的工程师,iOS 上架流程一度让我感到“神秘又繁琐”。尤其是将构建好的 IPA 文件提交到 App Store Connect,过程远比上传安卓包复杂。

这几年我尝试了多种方式,从 Xcode 自带 Transporter,到命令行工具、自动化方案,再到图形工具,今天就分享我真实使用过的几种方法,以及它们在不同场景下的表现。


上传方式 1:Xcode Transporter / Transporter App

优点:

  • 官方出品,稳定性好,权限校验完整
  • 支持拖拽 IPA,界面清晰
  • 可以直接登录 Apple ID,适合已有完整 Apple 生态的开发者

局限:

  • 只能在 macOS 系统中使用
  • 登录频繁触发双重验证
  • 无法批量管理截图、本地化内容
  • 对非开发人员不够友好,操作上下文较多

适用场景:

  • 原生开发者、使用 Xcode 构建 App 的团队
  • 有 macOS 设备,愿意在官方路径上操作上传

上传方式 2:altool 命令行工具(Xcode CLI)

优点:

  • 可写入自动化脚本,适合 CI/CD 流程
  • 支持 API 密钥调用,绕过 Apple ID 验证
  • 适用于版本控制的命令行用户

局限:

  • 命令参数复杂,初学者容易出错
  • 无界面提示,错误信息不直观
  • 无截图或元数据上传能力(只能上传 IPA)

适用场景:

  • DevOps 团队、使用 Jenkins/Fastlane 进行持续交付
  • 高度熟悉命令行开发环境的开发者

上传方式 3:Fastlane deliver

优点:

  • 自动化程度高,支持 IPA + 截图 + 文案上传
  • 可集成版本描述、多语言信息、元数据管理
  • 社区活跃,有完整文档和配置示例

局限:

  • 配置复杂度较高,需要维护 deliverfile
  • 脚本需不断适配 Apple 审核机制更新
  • 非技术角色几乎无法参与流程

适用场景:

  • 有自动化需求的团队
  • 熟悉 Ruby 或已有 Fastlane 体系的项目组

上传方式 4:Appuploader

优点:

  • 支持 Windows / Linux / macOS,平台适配好
  • 图形化操作,适合产品/运营参与截图上传
  • 支持证书创建、描述文件管理、截图识别上传
  • 不依赖 Mac 或 Xcode,可全流程完成 IPA 提交

局限:

  • 不属于官方工具
  • 不支持复杂 CI/CD 自动化(更偏向手动交付场景)

适用场景:

  • 跨平台开发者(如使用 Flutter、React Native)
  • 无 Mac 环境、希望非技术成员参与上架流程
  • 需要在 Windows 或 Linux 上完成 iOS 发布的场景

总结对比一览:

工具 系统限制 自动化程度 支持截图上传 适合人群
Xcode Transporter macOS 原生开发者
altool CLI macOS 高阶技术用户
Fastlane deliver 跨平台 自动化工程师团队
Appuploader 跨平台 独立开发者、非技术团队

我的选择建议:

  • 如果你是小团队或非 Mac 用户:推荐使用 Appuploader,可以一人完成构建 + 上架全过程
  • 如果你已有自动化发布体系:Fastlane + altool 是更合适的组合
  • 只偶尔手动发布,且使用 Mac 开发:Xcode Transporter 也足够应付
  • 要支持产品参与多语言内容上传:图形工具(如 Appuploader)更易协作

上架工具没有绝对优劣,关键在于你的使用场景、协作模式与团队结构。你用的是什么方式上传 IPA?是否考虑多工具结合使用?欢迎分享你的发布流程!'''

收起阅读 »

移动端抓包指南:为什么真机HTTPS总是抓不到?(多工具对比 + Sniffmaster实战)

iOS

'''如果你做过APP调试或SDK集成测试,可能会有这种经历:

  • 明明配置好了代理和证书,还是抓不到真机请求;
  • 模拟器测试一切正常,一上真机请求就“消失”;
  • Fiddler/Charles 连接正常,但没有任何HTTPS流量;
  • 封装SDK网络行为根本无法验证;

这些“抓不到包”的时刻,是移动端调试中最让人崩溃的场景之一。尤其是涉及 HTTPS 请求、双向认证、APP安全策略,常规工具很容易失效。

本文不打算介绍“怎么用抓包工具”,而是深入探讨:

  1. 为什么真机HTTPS抓包越来越难
  2. 哪些抓包原理注定会“失灵”?
  3. 如何用 Sniffmaster + 多工具组合,解决无法抓包的根本问题?

抓不到HTTPS,是技术趋势决定的

在过去几年,为了用户数据安全,大部分主流服务端和SDK提供商都采用了以下安全策略:

强制 HTTPS 传输

  • 明文HTTP全面淘汰;
  • 全站开启TLS加密;
  • APP与服务端所有通信必须加密;

HTTPS Pinning(双向证书验证)

  • 客户端内置证书公钥指纹;
  • 中间人证书一律拒绝握手;
  • 防止伪装服务器劫持数据;

请求封装隐藏

  • 统一封装如 OkHttp/NSURLSession;
  • 使用 Native 模块/自研网络组件;
  • 请求代码无法通过日志输出查看;

限制代理或系统抓包机制

  • 禁用系统代理;
  • 检测抓包行为(如检测Charles/Fiddler);
  • 使用 QUIC/TCP/Socket 自建链路规避 HTTP 协议;

我们团队遇到的抓包失败场景

  1. 微信授权SDK请求日志为空,抓不到流;
  2. iOS 真机连接 Charles,HTTPS 全部 handshake failed;
  3. 安卓真机设置代理但无请求流出现;
  4. Fiddler 抓到部分请求,但封装SDK请求全空;
  5. mitmproxy 成功劫持,但SDK检测证书返回错误码;

为什么传统工具在真机场景里抓不到?

工具 原理 弱点
Fiddler 基于HTTP代理 必须走系统代理,不能处理Pinning
Charles 类似Fiddler 证书信任链被Pin校验拒绝
mitmproxy 脚本级代理 证书替换容易被检测
Proxyman UI好、原理同Charles 不能突破封装和双向认证限制
Wireshark 底层抓包 能看见流量但看不懂HTTPS内容

它们共同的软肋是:基于代理、依赖证书注入、需要中间人劫持机制。而在 Pinning 和封装SDK面前,它们“无能为力”。


Sniffmaster 是怎么解决的?

插线真机,无需设置代理

只需将 iOS 或 Android 真机连接电脑,Sniffmaster 会直接从USB口监听网络接口。

不需要安装任何证书

绕过了系统信任链,天然不被Pin机制阻断。

支持识别封装请求

能看到App发出的所有TCP/HTTPS/UDP数据流,哪怕SDK自己建了Socket连接也能抓到。

支持爆破双向Pin验证

这是很多其他抓包工具完全做不到的一点,Sniffmaster 可以解密双向验证下的HTTPS流量。


我们现在如何组合工具调试网络问题?

场景 工具组合 使用说明
模拟器调试 Charles + Postman 基础开发阶段调试
接口容错验证 mitmproxy + Postman 脚本模拟错误、字段缺失
真机SDK调试 Sniffmaster + Wireshark 真实抓包 + 协议解密
构建包验证 Sniffmaster + Charles 验证上线包参数一致性
网络层失败 Wireshark + curl DNS、TCP握手排查

总结:要想抓得准,得用对工具

抓不到包,并不是“你操作失误”,也不是“设备有问题”,而是你面临的技术环境已经变化。

Charles/Fiddler 依然好用,但更多是针对传统Web服务或开发初期模拟器场景。

而在现实工作中,你需要能在以下条件下工作的工具:

  • 真机;
  • HTTPS 加密;
  • 无Root越狱;
  • 不修改APP代码;
  • 不依赖系统代理;
  • 能筛选具体APP抓包;'''
继续阅读 »

'''如果你做过APP调试或SDK集成测试,可能会有这种经历:

  • 明明配置好了代理和证书,还是抓不到真机请求;
  • 模拟器测试一切正常,一上真机请求就“消失”;
  • Fiddler/Charles 连接正常,但没有任何HTTPS流量;
  • 封装SDK网络行为根本无法验证;

这些“抓不到包”的时刻,是移动端调试中最让人崩溃的场景之一。尤其是涉及 HTTPS 请求、双向认证、APP安全策略,常规工具很容易失效。

本文不打算介绍“怎么用抓包工具”,而是深入探讨:

  1. 为什么真机HTTPS抓包越来越难
  2. 哪些抓包原理注定会“失灵”?
  3. 如何用 Sniffmaster + 多工具组合,解决无法抓包的根本问题?

抓不到HTTPS,是技术趋势决定的

在过去几年,为了用户数据安全,大部分主流服务端和SDK提供商都采用了以下安全策略:

强制 HTTPS 传输

  • 明文HTTP全面淘汰;
  • 全站开启TLS加密;
  • APP与服务端所有通信必须加密;

HTTPS Pinning(双向证书验证)

  • 客户端内置证书公钥指纹;
  • 中间人证书一律拒绝握手;
  • 防止伪装服务器劫持数据;

请求封装隐藏

  • 统一封装如 OkHttp/NSURLSession;
  • 使用 Native 模块/自研网络组件;
  • 请求代码无法通过日志输出查看;

限制代理或系统抓包机制

  • 禁用系统代理;
  • 检测抓包行为(如检测Charles/Fiddler);
  • 使用 QUIC/TCP/Socket 自建链路规避 HTTP 协议;

我们团队遇到的抓包失败场景

  1. 微信授权SDK请求日志为空,抓不到流;
  2. iOS 真机连接 Charles,HTTPS 全部 handshake failed;
  3. 安卓真机设置代理但无请求流出现;
  4. Fiddler 抓到部分请求,但封装SDK请求全空;
  5. mitmproxy 成功劫持,但SDK检测证书返回错误码;

为什么传统工具在真机场景里抓不到?

工具 原理 弱点
Fiddler 基于HTTP代理 必须走系统代理,不能处理Pinning
Charles 类似Fiddler 证书信任链被Pin校验拒绝
mitmproxy 脚本级代理 证书替换容易被检测
Proxyman UI好、原理同Charles 不能突破封装和双向认证限制
Wireshark 底层抓包 能看见流量但看不懂HTTPS内容

它们共同的软肋是:基于代理、依赖证书注入、需要中间人劫持机制。而在 Pinning 和封装SDK面前,它们“无能为力”。


Sniffmaster 是怎么解决的?

插线真机,无需设置代理

只需将 iOS 或 Android 真机连接电脑,Sniffmaster 会直接从USB口监听网络接口。

不需要安装任何证书

绕过了系统信任链,天然不被Pin机制阻断。

支持识别封装请求

能看到App发出的所有TCP/HTTPS/UDP数据流,哪怕SDK自己建了Socket连接也能抓到。

支持爆破双向Pin验证

这是很多其他抓包工具完全做不到的一点,Sniffmaster 可以解密双向验证下的HTTPS流量。


我们现在如何组合工具调试网络问题?

场景 工具组合 使用说明
模拟器调试 Charles + Postman 基础开发阶段调试
接口容错验证 mitmproxy + Postman 脚本模拟错误、字段缺失
真机SDK调试 Sniffmaster + Wireshark 真实抓包 + 协议解密
构建包验证 Sniffmaster + Charles 验证上线包参数一致性
网络层失败 Wireshark + curl DNS、TCP握手排查

总结:要想抓得准,得用对工具

抓不到包,并不是“你操作失误”,也不是“设备有问题”,而是你面临的技术环境已经变化。

Charles/Fiddler 依然好用,但更多是针对传统Web服务或开发初期模拟器场景。

而在现实工作中,你需要能在以下条件下工作的工具:

  • 真机;
  • HTTPS 加密;
  • 无Root越狱;
  • 不修改APP代码;
  • 不依赖系统代理;
  • 能筛选具体APP抓包;'''
收起阅读 »

代做.9.png、安卓/uniapp、苹果启动图

启动图片

十年开发、设计经验
1.代做 安卓.9.png 、iOS苹果storyboard 启动图片,不满意免费修改;
2.代上架安卓应用市场/苹果APP Store;
3.解决前/后端问题;
4.定制/二次开发app、小程序、各类网站系统。
5.前端可以做: react、vue、uniapp、Flutter、原生安卓开发、小程序原生开发、安卓原生开发
6.后端可以做:PHP、Java、Python、nodejs
联系方式: wx:lh1845407111 QQ:1845407111
工作室官网:https://www.xiaohongzi.top/h5/#/home 欢迎大家访问
价格便宜,包满意!包满意!包满意!

继续阅读 »

十年开发、设计经验
1.代做 安卓.9.png 、iOS苹果storyboard 启动图片,不满意免费修改;
2.代上架安卓应用市场/苹果APP Store;
3.解决前/后端问题;
4.定制/二次开发app、小程序、各类网站系统。
5.前端可以做: react、vue、uniapp、Flutter、原生安卓开发、小程序原生开发、安卓原生开发
6.后端可以做:PHP、Java、Python、nodejs
联系方式: wx:lh1845407111 QQ:1845407111
工作室官网:https://www.xiaohongzi.top/h5/#/home 欢迎大家访问
价格便宜,包满意!包满意!包满意!

收起阅读 »