HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

上架教育 App 被拒|iOS 教育类应用高频驳回原因、整改方案与申诉全攻略

               上架教育 App 被拒|iOS 教育类应用高频驳回原因、整改方案与申诉全攻略  
                                                          前言  
     线上网课、题库刷题、少儿启蒙、职业考证类教育 App 是 App Store 热门赛道,但也是审核驳回重灾区。2026 年苹果针对教育类应用出台多重专项审核标准,很多开发者投入数月开发,提交后直接被 4.3 垃圾应用、3.1.1 内购违规、1.1.6 内容不合规、隐私缺失、无教学价值等条款驳回,反复整改拉长上线周期、消耗账号权重。  

教育 App 审核区别于普通工具软件,苹果重点核查教学价值、付费合规、内容风控、青少年保护、账号隐私、同质化马甲六大维度。本文汇总一线上架实操经验,拆解教育 App 全部被拒类型、根源、落地整改方案、提审规范、申诉模板,覆盖少儿、题库、网课、职业培训全品类教育软件,一次性解决上架被拒难题。
一、教育 App 九大高频被拒类型(附官方拒审条款 + 诱因)

  1. Guideline 4.3 垃圾应用 / 同质化马甲(教育类最高发驳回)
    拒审表现
    系统判定应用与市面上题库、网课模板高度雷同,或开发者名下多款教育 App 仅更换名称、图标、配色,底层代码、课程框架、刷题逻辑完全一致,判定批量换皮垃圾应用。
    教育场景专属诱因
    采购通用网课 / 题库开源模板,仅替换课程封面、文字,无原创教学功能;
    批量上架学科马甲包(语文、数学、英语分开打包),共用一套源码、后端接口、打包设备;
    纯 WebView 套壳 H5 网校,无原生独立教学功能,苹果判定无独立产品价值。
    快速整改方案
    代码层面:重构 30% 以上核心教学逻辑,新增专属题库题型、互动练习、学习规划功能,稀释模板代码占比;
    产品层面:彻底改版课程首页、学习路径、刷题 UI 布局,新增 1-2 个独家学习工具(错题本专项、学情分析、背诵打卡);
    环境隔离:每款教育包独立电脑、独立热点网络打包,不共用隐私协议、服务器域名;
    元数据全重做:标题、描述、截图、预览视频全部原创,不复用其他教育 App 素材。
  2. 3.1.1 支付违规,绕过苹果 IAP 内购(教育 App 致命驳回)
    拒审表现
    应用内课程会员、题库解锁、直播课时、考证资料付费,引导用户微信、支付宝、线下转账、网页充值,未使用苹果官方内购订阅 / 一次性购买,直接驳回,严重直接封号。
    教育场景专属诱因
    网课引导用户添加微信购买完整版课程;
    题库 App 内放置第三方付费网页链接,跳转外部支付;
    线下培训机构配套 App,售卖线下课程套餐不走苹果内购。
    整改方案
    全部虚拟课程、会员、题库解锁功能接入 App Store IAP 内购;
    删除所有微信、支付宝、企业微信、外部付费网页入口;
    线下实体课程仅展示介绍,线上不得收取任何虚拟教学资源费用;
    提审备注清晰说明全部付费项目均通过苹果内购完成。
  3. 无实质教学价值(4.2.2 功能残缺垃圾应用)
    拒审表现
    审核人员判定 App 仅堆砌零散视频、文档,无完整学习体系、无互动练习、无学习闭环,只是资源集合,不具备教育产品属性直接驳回。
    诱因
    仅上传一堆录播课,无课时划分、无课后习题、无学习进度记录;
    题库只有题目,无解析、错题收藏、模拟测试、知识点划分;
    少儿启蒙 App 仅几张静态图片,无跟读、互动小游戏、分级学习。
    整改方案
    完善完整学习链路:预习 - 课程学习 - 课后练习 - 错题复盘 - 学情报告;
    增加互动教学模块:随堂测验、背诵打卡、AI 跟读、模拟试卷;
    商店描述重点写明分层教学目标、课程体系,截图展示完整学习流程。
  4. 隐私合规缺失(5.1 数据收集强制驳回)
    拒审表现
    未提供可正常访问的隐私政策链接、未弹窗告知用户权限用途、强制登录、无账号注销入口、违规收集学生身份证、人脸、通讯录等敏感信息。
    教育专属坑点
    少儿教育 App 过度收集未成年人人脸、相册、定位;
    登录必须手机号,未提供游客试用模式;
    账号仅支持退出登录,无永久注销账号功能;
    隐私协议链接失效、放置第三方共用隐私域名。
    整改标准
    搭建独立隐私政策网页,登录页、设置页放置永久可点击入口;
    所有权限(相机、麦克风、相册)弹窗说明教育用途;
    设置内添加清晰永久注销账号功能;
    少儿类 App 精简权限,非必要不收集定位、通讯录。
  5. 缺少青少年 / 未成年人保护机制
    拒审表现
    少儿启蒙、中小学题库、学生网课 App 未配置青少年模式、无使用时长限制、无内容过滤、无家长管控功能。
    整改方案
    新增青少年模式:每日时长限制、付费家长授权、屏蔽娱乐广告;
    题库内容过滤涉政、暴力、作弊类题目,内置内容举报通道;
    元数据、提审备注主动标注未成年人保护相关功能。
  6. 元数据误导、关键词堆砌、素材造假
    拒审表现
    标题堆砌大量无关教育关键词、截图展示未上线课程功能、预览图使用第三方网校素材、名称夸大宣传(100% 提分、必过考证)。
    整改要点
    App 名称控制 30 字符内,禁止堆砌 “考研、公考、中小学、四六级” 等无关长尾词;
    所有截图、预览视频均为本 App 真实界面,删除 “即将上线” 占位内容;
    删除无法佐证的绝对化宣传话术,客观描述课程功能。
  7. 内容版权 / 违规题库内容(1.1.6 内容不合规)
    拒审表现
    题库收录真题无版权、课程视频盗用第三方讲师内容、存在替考、作弊、违规备考素材,敏感历史、时政题目未做合规处理。
    整改方案
    清理无版权课件、真题,补充版权授权证明;
    删除作弊、代考类相关题库、功能;
    所有课程内容建立人工审核机制,提审备注说明内容合规审核流程。
  8. 缺少测试账号,审核人员无法完整体验课程
    拒审表现
    教育 App 需要登录解锁完整课程,但未提供可用测试账号,审核人员只能查看免费片段,无法核验付费课程、题库全部功能,直接驳回。
    标准操作
    提审备注内清晰填写测试账号、密码,标注可解锁全部课程、题库;若有青少年模式,额外提供学生账号。
  9. WebView 套壳网校,原生功能严重不足
    拒审表现
    App 本质仅内嵌网页 H5 网校,无原生离线缓存、本地刷题、推送提醒、学情记录,判定简易网页封装,低价值应用 4.3 驳回。
    整改方案
    新增原生独立功能:离线题库、本地错题缓存、学习推送、桌面打卡小组件,弱化网页依赖,形成独立原生教学体验。
    二、教育 App 提审前置自查清单(上架前必核对,大幅降低拒审概率)
    (一)产品功能自查
    拥有完整学习闭环:课程分层、课后练习、错题、学习记录;
    付费课程全部接入苹果 IAP,无任何外部支付渠道;
    支持游客试用,账号设置页存在永久注销入口;
    少儿类配备青少年模式、时长管控、内容过滤;
    无作弊、代考、违规敏感题库内容,课件具备版权;
    无闪退、页面空白、课程加载失败等 bug。
    (二)隐私与法律自查
    独立可访问隐私政策、用户协议链接;
    所有权限弹窗标注教育用途,不强制授权;
    年龄分级匹配对应受众,少儿类选择儿童类目规范;
    无其他应用商店、安卓版本导流文案、图标。
    (三)商店元数据自查
    标题简洁无关键词堆砌,无夸大宣传;
    截图、预览视频为 App 真实界面,展示完整教学功能;
    描述重点突出差异化教学价值,写明课程体系;
    配套完整技术支持网址,联系方式有效。
    (四)打包环境自查(规避 4.3)
    单账号单教育 App,不批量上架多学科马甲包;
    独立电脑、独立热点网络打包,不共用旧项目工程;
    清理模板 Demo 资源、废弃测试页面,重构部分业务代码。
    三、教育 App 被拒标准处理流程
    停止重复提交:收到拒审通知不要直接改素材重提,无效提交持续降低账号权重;
    定位拒审核心条款:根据苹果驳回邮件,优先解决硬性违规(内购、隐私、4.3);
    分层整改
    轻度问题(元数据、截图、测试账号缺失):24 小时内修改素材、补充账号信息;
    中度问题(教学功能单薄、界面同质化):新增学习功能、改版页面布局;
    重度问题(支付违规、4.3 马甲、隐私缺失):重构业务逻辑、更换打包环境、补齐合规功能;
    填写专业提审备注:主动说明整改内容、教学差异化、合规措施;
    误判情况提交申诉:自研原创教育 App 被 4.3 误判,提交双语申诉 + 佐证截图。
    四、教育 App 专用申诉模板(4.3 误判 / 无教学价值误判通用)
    中文申诉
    尊敬的 App 审核团队:
    本次应用为独立自研教育学习软件,不存在模板换皮、批量马甲包行为。App 搭建完整分层课程体系,内置随堂练习、错题本、学情分析等独家教学功能,具备完整闭环学习体验,拥有独立产品定位与差异化教学内容,不存在 4.3 垃圾应用、无教学价值等违规情形。
    我方已完整整改界面、代码、商店素材,所有付费功能均接入苹果官方内购,配齐隐私政策、青少年保护、账号注销等合规功能,恳请审核人员人工复核测试账号内全部课程功能。
    English
    Dear App Review Team,
    This is an independently developed educational app without open-source templates or duplicate spam apps. It has complete hierarchical courses, exclusive exercises, error question records and learning analysis to form a full learning experience with unique educational value.
    All payment functions adopt official Apple IAP, and we have fully equipped privacy policy, minor protection and account deletion functions. Please review all course content with the test account we provided. Thank you.
    五、长期避坑:教育 App 稳定上架核心要点
    放弃多马甲包矩阵:苹果对教育类马甲管控极严,多学科需求建议单 App 内分模块,不拆分多个安装包;
    杜绝纯 H5 套壳开发:至少开发 3 个以上原生核心教学功能,提升产品独特性;
    付费逻辑严格合规:任何虚拟课程、题库解锁、会员订阅一律使用 IAP,杜绝私域引流付费;
    提前完善未成年人保护:中小学、少儿类教育 App 优先开发青少年模式,避免专项驳回;
    不要复用通用题库 / 网课模板:模板类教育 App 是 4.3 重点扫描对象,必须重构核心业务代码;
    被拒后间隔 3-5 天再提交,连续多次驳回会大幅拉高账号审核权重,后续审核周期拉长至 5-7 天。
    六、总结
    教育 App 上架被拒,大多不是单一细节问题,而是教学价值不足、付费不合规、隐私缺失、同质化马甲四大核心问题叠加导致。
    想要一次过审,核心思路:先保证合规底线(内购、隐私、青少年保护),再打造差异化教学闭环,最后隔离打包环境规避 4.3 垃圾应用判定。
    遇到误判及时提交完整申诉,存在违规则深度整改,不投机取巧修改表层素材,才能稳定通过苹果审核,避免账号权重受损、上线计划延期。
继续阅读 »
               上架教育 App 被拒|iOS 教育类应用高频驳回原因、整改方案与申诉全攻略  
                                                          前言  
     线上网课、题库刷题、少儿启蒙、职业考证类教育 App 是 App Store 热门赛道,但也是审核驳回重灾区。2026 年苹果针对教育类应用出台多重专项审核标准,很多开发者投入数月开发,提交后直接被 4.3 垃圾应用、3.1.1 内购违规、1.1.6 内容不合规、隐私缺失、无教学价值等条款驳回,反复整改拉长上线周期、消耗账号权重。  

教育 App 审核区别于普通工具软件,苹果重点核查教学价值、付费合规、内容风控、青少年保护、账号隐私、同质化马甲六大维度。本文汇总一线上架实操经验,拆解教育 App 全部被拒类型、根源、落地整改方案、提审规范、申诉模板,覆盖少儿、题库、网课、职业培训全品类教育软件,一次性解决上架被拒难题。
一、教育 App 九大高频被拒类型(附官方拒审条款 + 诱因)

  1. Guideline 4.3 垃圾应用 / 同质化马甲(教育类最高发驳回)
    拒审表现
    系统判定应用与市面上题库、网课模板高度雷同,或开发者名下多款教育 App 仅更换名称、图标、配色,底层代码、课程框架、刷题逻辑完全一致,判定批量换皮垃圾应用。
    教育场景专属诱因
    采购通用网课 / 题库开源模板,仅替换课程封面、文字,无原创教学功能;
    批量上架学科马甲包(语文、数学、英语分开打包),共用一套源码、后端接口、打包设备;
    纯 WebView 套壳 H5 网校,无原生独立教学功能,苹果判定无独立产品价值。
    快速整改方案
    代码层面:重构 30% 以上核心教学逻辑,新增专属题库题型、互动练习、学习规划功能,稀释模板代码占比;
    产品层面:彻底改版课程首页、学习路径、刷题 UI 布局,新增 1-2 个独家学习工具(错题本专项、学情分析、背诵打卡);
    环境隔离:每款教育包独立电脑、独立热点网络打包,不共用隐私协议、服务器域名;
    元数据全重做:标题、描述、截图、预览视频全部原创,不复用其他教育 App 素材。
  2. 3.1.1 支付违规,绕过苹果 IAP 内购(教育 App 致命驳回)
    拒审表现
    应用内课程会员、题库解锁、直播课时、考证资料付费,引导用户微信、支付宝、线下转账、网页充值,未使用苹果官方内购订阅 / 一次性购买,直接驳回,严重直接封号。
    教育场景专属诱因
    网课引导用户添加微信购买完整版课程;
    题库 App 内放置第三方付费网页链接,跳转外部支付;
    线下培训机构配套 App,售卖线下课程套餐不走苹果内购。
    整改方案
    全部虚拟课程、会员、题库解锁功能接入 App Store IAP 内购;
    删除所有微信、支付宝、企业微信、外部付费网页入口;
    线下实体课程仅展示介绍,线上不得收取任何虚拟教学资源费用;
    提审备注清晰说明全部付费项目均通过苹果内购完成。
  3. 无实质教学价值(4.2.2 功能残缺垃圾应用)
    拒审表现
    审核人员判定 App 仅堆砌零散视频、文档,无完整学习体系、无互动练习、无学习闭环,只是资源集合,不具备教育产品属性直接驳回。
    诱因
    仅上传一堆录播课,无课时划分、无课后习题、无学习进度记录;
    题库只有题目,无解析、错题收藏、模拟测试、知识点划分;
    少儿启蒙 App 仅几张静态图片,无跟读、互动小游戏、分级学习。
    整改方案
    完善完整学习链路:预习 - 课程学习 - 课后练习 - 错题复盘 - 学情报告;
    增加互动教学模块:随堂测验、背诵打卡、AI 跟读、模拟试卷;
    商店描述重点写明分层教学目标、课程体系,截图展示完整学习流程。
  4. 隐私合规缺失(5.1 数据收集强制驳回)
    拒审表现
    未提供可正常访问的隐私政策链接、未弹窗告知用户权限用途、强制登录、无账号注销入口、违规收集学生身份证、人脸、通讯录等敏感信息。
    教育专属坑点
    少儿教育 App 过度收集未成年人人脸、相册、定位;
    登录必须手机号,未提供游客试用模式;
    账号仅支持退出登录,无永久注销账号功能;
    隐私协议链接失效、放置第三方共用隐私域名。
    整改标准
    搭建独立隐私政策网页,登录页、设置页放置永久可点击入口;
    所有权限(相机、麦克风、相册)弹窗说明教育用途;
    设置内添加清晰永久注销账号功能;
    少儿类 App 精简权限,非必要不收集定位、通讯录。
  5. 缺少青少年 / 未成年人保护机制
    拒审表现
    少儿启蒙、中小学题库、学生网课 App 未配置青少年模式、无使用时长限制、无内容过滤、无家长管控功能。
    整改方案
    新增青少年模式:每日时长限制、付费家长授权、屏蔽娱乐广告;
    题库内容过滤涉政、暴力、作弊类题目,内置内容举报通道;
    元数据、提审备注主动标注未成年人保护相关功能。
  6. 元数据误导、关键词堆砌、素材造假
    拒审表现
    标题堆砌大量无关教育关键词、截图展示未上线课程功能、预览图使用第三方网校素材、名称夸大宣传(100% 提分、必过考证)。
    整改要点
    App 名称控制 30 字符内,禁止堆砌 “考研、公考、中小学、四六级” 等无关长尾词;
    所有截图、预览视频均为本 App 真实界面,删除 “即将上线” 占位内容;
    删除无法佐证的绝对化宣传话术,客观描述课程功能。
  7. 内容版权 / 违规题库内容(1.1.6 内容不合规)
    拒审表现
    题库收录真题无版权、课程视频盗用第三方讲师内容、存在替考、作弊、违规备考素材,敏感历史、时政题目未做合规处理。
    整改方案
    清理无版权课件、真题,补充版权授权证明;
    删除作弊、代考类相关题库、功能;
    所有课程内容建立人工审核机制,提审备注说明内容合规审核流程。
  8. 缺少测试账号,审核人员无法完整体验课程
    拒审表现
    教育 App 需要登录解锁完整课程,但未提供可用测试账号,审核人员只能查看免费片段,无法核验付费课程、题库全部功能,直接驳回。
    标准操作
    提审备注内清晰填写测试账号、密码,标注可解锁全部课程、题库;若有青少年模式,额外提供学生账号。
  9. WebView 套壳网校,原生功能严重不足
    拒审表现
    App 本质仅内嵌网页 H5 网校,无原生离线缓存、本地刷题、推送提醒、学情记录,判定简易网页封装,低价值应用 4.3 驳回。
    整改方案
    新增原生独立功能:离线题库、本地错题缓存、学习推送、桌面打卡小组件,弱化网页依赖,形成独立原生教学体验。
    二、教育 App 提审前置自查清单(上架前必核对,大幅降低拒审概率)
    (一)产品功能自查
    拥有完整学习闭环:课程分层、课后练习、错题、学习记录;
    付费课程全部接入苹果 IAP,无任何外部支付渠道;
    支持游客试用,账号设置页存在永久注销入口;
    少儿类配备青少年模式、时长管控、内容过滤;
    无作弊、代考、违规敏感题库内容,课件具备版权;
    无闪退、页面空白、课程加载失败等 bug。
    (二)隐私与法律自查
    独立可访问隐私政策、用户协议链接;
    所有权限弹窗标注教育用途,不强制授权;
    年龄分级匹配对应受众,少儿类选择儿童类目规范;
    无其他应用商店、安卓版本导流文案、图标。
    (三)商店元数据自查
    标题简洁无关键词堆砌,无夸大宣传;
    截图、预览视频为 App 真实界面,展示完整教学功能;
    描述重点突出差异化教学价值,写明课程体系;
    配套完整技术支持网址,联系方式有效。
    (四)打包环境自查(规避 4.3)
    单账号单教育 App,不批量上架多学科马甲包;
    独立电脑、独立热点网络打包,不共用旧项目工程;
    清理模板 Demo 资源、废弃测试页面,重构部分业务代码。
    三、教育 App 被拒标准处理流程
    停止重复提交:收到拒审通知不要直接改素材重提,无效提交持续降低账号权重;
    定位拒审核心条款:根据苹果驳回邮件,优先解决硬性违规(内购、隐私、4.3);
    分层整改
    轻度问题(元数据、截图、测试账号缺失):24 小时内修改素材、补充账号信息;
    中度问题(教学功能单薄、界面同质化):新增学习功能、改版页面布局;
    重度问题(支付违规、4.3 马甲、隐私缺失):重构业务逻辑、更换打包环境、补齐合规功能;
    填写专业提审备注:主动说明整改内容、教学差异化、合规措施;
    误判情况提交申诉:自研原创教育 App 被 4.3 误判,提交双语申诉 + 佐证截图。
    四、教育 App 专用申诉模板(4.3 误判 / 无教学价值误判通用)
    中文申诉
    尊敬的 App 审核团队:
    本次应用为独立自研教育学习软件,不存在模板换皮、批量马甲包行为。App 搭建完整分层课程体系,内置随堂练习、错题本、学情分析等独家教学功能,具备完整闭环学习体验,拥有独立产品定位与差异化教学内容,不存在 4.3 垃圾应用、无教学价值等违规情形。
    我方已完整整改界面、代码、商店素材,所有付费功能均接入苹果官方内购,配齐隐私政策、青少年保护、账号注销等合规功能,恳请审核人员人工复核测试账号内全部课程功能。
    English
    Dear App Review Team,
    This is an independently developed educational app without open-source templates or duplicate spam apps. It has complete hierarchical courses, exclusive exercises, error question records and learning analysis to form a full learning experience with unique educational value.
    All payment functions adopt official Apple IAP, and we have fully equipped privacy policy, minor protection and account deletion functions. Please review all course content with the test account we provided. Thank you.
    五、长期避坑:教育 App 稳定上架核心要点
    放弃多马甲包矩阵:苹果对教育类马甲管控极严,多学科需求建议单 App 内分模块,不拆分多个安装包;
    杜绝纯 H5 套壳开发:至少开发 3 个以上原生核心教学功能,提升产品独特性;
    付费逻辑严格合规:任何虚拟课程、题库解锁、会员订阅一律使用 IAP,杜绝私域引流付费;
    提前完善未成年人保护:中小学、少儿类教育 App 优先开发青少年模式,避免专项驳回;
    不要复用通用题库 / 网课模板:模板类教育 App 是 4.3 重点扫描对象,必须重构核心业务代码;
    被拒后间隔 3-5 天再提交,连续多次驳回会大幅拉高账号审核权重,后续审核周期拉长至 5-7 天。
    六、总结
    教育 App 上架被拒,大多不是单一细节问题,而是教学价值不足、付费不合规、隐私缺失、同质化马甲四大核心问题叠加导致。
    想要一次过审,核心思路:先保证合规底线(内购、隐私、青少年保护),再打造差异化教学闭环,最后隔离打包环境规避 4.3 垃圾应用判定。
    遇到误判及时提交完整申诉,存在违规则深度整改,不投机取巧修改表层素材,才能稳定通过苹果审核,避免账号权重受损、上线计划延期。
收起阅读 »

微信小程序审核时遇到问题,把我气笑了.

微信小程序

我的产品核心用途:面向学生群体,用于拍摄英语课本、单词笔记、试卷习题,提取图片里的英文词句,自动合成标准英语语音进行听写朗读,纯学习工具类小程序,无图文浏览、图片发布、社交图库功能。但在第一版审核时直接通过,后来第二版在UI上做了点修改没加任何功能,得到通知:你的小程序"如意英语听写",提审时间:2026-06-30 11:50:25,版本审核未通过。
1: 你好,你的小程序【图片识别】功能在进行内容安全验证时,存在信息安全风险,请尽快完善内容机制:1、确保已接入内容安全API并要求所调用API可在小程序内任意发布的场景生效;2、小程序内检测结果安全说明仅需提示用户所发布内容含违规信息即可。我看了下他们测试的图片我真给气笑了。


他们直接搞了张涩图来测,我的小程序图片识别过滤机制:程序内置文字识别筛选规则,仅提取图片内英文字母、英文短句,人像、风景、纯中文、空白、杂物实拍图等不含英文的图片,识别后直接返回空内容,不会生成文字、不会触发语音播报,不存在输出违规图文、语音的渠道。
我不能拦截用户相册里的图片素材,只能在识别阶段过滤无效 / 非英文图片,无任何渠道提前预判用户要上传什么图片。他们怎么这样测呢?真不解是不是在上班摸鱼随手在自己浏览的网站上找了张图来测?

继续阅读 »

我的产品核心用途:面向学生群体,用于拍摄英语课本、单词笔记、试卷习题,提取图片里的英文词句,自动合成标准英语语音进行听写朗读,纯学习工具类小程序,无图文浏览、图片发布、社交图库功能。但在第一版审核时直接通过,后来第二版在UI上做了点修改没加任何功能,得到通知:你的小程序"如意英语听写",提审时间:2026-06-30 11:50:25,版本审核未通过。
1: 你好,你的小程序【图片识别】功能在进行内容安全验证时,存在信息安全风险,请尽快完善内容机制:1、确保已接入内容安全API并要求所调用API可在小程序内任意发布的场景生效;2、小程序内检测结果安全说明仅需提示用户所发布内容含违规信息即可。我看了下他们测试的图片我真给气笑了。


他们直接搞了张涩图来测,我的小程序图片识别过滤机制:程序内置文字识别筛选规则,仅提取图片内英文字母、英文短句,人像、风景、纯中文、空白、杂物实拍图等不含英文的图片,识别后直接返回空内容,不会生成文字、不会触发语音播报,不存在输出违规图文、语音的渠道。
我不能拦截用户相册里的图片素材,只能在识别阶段过滤无效 / 非英文图片,无任何渠道提前预判用户要上传什么图片。他们怎么这样测呢?真不解是不是在上班摸鱼随手在自己浏览的网站上找了张图来测?

收起阅读 »

如何解决NavDestination切换页面后浏览位置无法保存问题

问题现象
在HarmonyOS中,使用NavDestination实现页面跳转至其他页面后,下次进入如何保持跳转前页面的浏览位置?

背景知识
Navigation:Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(NavDestination的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
@ohos.arkui.observer(无感监听)提供UI组件行为变化的无感监听能力。可以监听Navigation的页面切换事件进行相应操作。
Scroll是一种可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
onDidScroll方法在Scroll滚动时触发,可用于在滑动过程中获取Scroll组件的偏移量yOffset。
scrollTo方法可用于让Scroll组件滑动到指定位置。
AppStorage是应用全局的UI状态存储,和应用的进程绑定,只能在UI主线程中使用,无法在子线程中使用、修改。
解决方案
方案一:使用路由模式保留页面实例。
在页面跳转时不要使用pop和clear等方法,否则NavDestination页面会被回收。可以采用单例模式MOVE_TO_TOP_SINGLETON跳转至指定的页面,该方式会使用栈内已存在的页面实例(即浏览位置不变)。

由于单例模式是从栈底到栈顶依次查找,当栈内存在多个同名页面实例时,会默认跳转最底层的同名页面实例,所以需确保栈内只存在一个同名实例,否则跳转的页面保留的滚动位置与上一次显示的页面会不一致(显示的是栈底同名实例保留的滚动位置)。

import { PageOneS1Builder } from './PageOneS1';
import { PageTwoS1Builder } from './PageTwoS1';

@Entry
@Component
struct Solution1 {
private pathStack: NavPathStack = new NavPathStack();

aboutToAppear(): void {
this.pathStack.pushPath({ name: 'PageOneS1' }); // 推送第一个子页作为首页
}

@Builder
pageMap(name: string) {
if (name === 'PageOneS1') {
PageOneS1Builder();
} else if (name === 'PageTwoS1') {
PageTwoS1Builder();
}
}

build() {
Navigation(this.pathStack) {
}
.navDestination(this.pageMap)
.width('100%')
.height('100%')
.hideNavBar(true);
}
}
@Builder
export function PageOneS1Builder() {
PageOneS1();
}

@Component
struct PageOneS1 {
private pathStack: NavPathStack = new NavPathStack();
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

build() {
NavDestination() {
Column({ space: 20 }) {
Row() {
Button('跳转页面')
.margin({ top: 20 })
.onClick(() => {
this.pathStack.pushPathByName('PageTwoS1', null, false);
});
};

    List({ space: 16 }) {  
      ForEach(this.arr, (item: number) => {  
        ListItem() {  
          Text(item.toString())  
            .width('100%')  
            .height(100)  
            .fontSize(16)  
            .textAlign(TextAlign.Center)  
            .borderRadius(16)  
            .backgroundColor('#F1F3F5');  
        }.width('100%');  
      }, (item: string) => item);  
    }.padding({ left: 12, right: 12 })  
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])  
    .alignListItem(ListItemAlign.Center)  
    .height('90%');  
  };  
}.width('100%').height('100%')  
.onReady((context: NavDestinationContext) => {  
  this.pathStack = context.pathStack;  
});  

}
}
@Builder
export function PageTwoS1Builder() {
PageTwoS1();
}

@Component
struct PageTwoS1 {
pathStack: NavPathStack = new NavPathStack();

build() {
NavDestination() {
Column({ space: 20 }) {
Button('单例跳转')
.width('30%')
.margin('20vp')
.onClick(() => {
// 或者使用单例模式跳转回其它页面
this.pathStack.pushPath({ name: 'PageOneS1' }, { launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON });
});
}.width('100%').height('100%');
}
.onReady((context: NavDestinationContext) => {
this.pathStack = context.pathStack;
});
}
}
https://pastebin.com/B0hqJAZx
https://pastebin.com/v4JTaWDt
https://pastebin.com/d5ge4288
https://pastebin.com/3shcMPv5
https://pastebin.com/70uKbDuw
https://pastebin.com/3LhjKXni
https://pastebin.com/5gVBhCGx
https://pastebin.com/dpMxkMXN
https://pastebin.com/fv8cG0b7
https://pastebin.com/JtuLjtFR
https://pastebin.com/yCfWpnxz
https://pastebin.com/Q2rrq3WB
https://pastebin.com/3bKAPcGk
https://pastebin.com/j7MfT7Dc
https://pastebin.com/U0p3Fvrc
https://pastebin.com/6sYfe5Lr
https://pastebin.com/jLNESEFx
https://pastebin.com/2KdkqCkw
https://pastebin.com/WAgQsmsV
https://pastebin.com/xmiRqKfd
https://pastebin.com/LXPu7Btx
https://pastebin.com/Qcg8dPbD
https://pastebin.com/EhtDxXMD
https://pastebin.com/yEwh5m4v
https://pastebin.com/tU0CueV4
https://pastebin.com/8JzMaNz7
https://pastebin.com/3jg8aspW
https://pastebin.com/YyHrmrJK
https://pastebin.com/ZgagcLAc
https://pastebin.com/ABpgUr5G
https://pastebin.com/cvPYk5AN
https://pastebin.com/XGZQUT1m
https://pastebin.com/qAd27GCF
https://pastebin.com/PiFNHkLd
https://pastebin.com/aiYX5L1G
https://pastebin.com/aqpnXQvz
https://pastebin.com/kB8XJ9n2
https://pastebin.com/sLfk0TR7
https://pastebin.com/nQ9nV4g8
https://pastebin.com/NAUQ9SA0
https://pastebin.com/GxvWFg6T
https://pastebin.com/TSNy8Cys
https://pastebin.com/fpN03727
https://pastebin.com/QAFi8vrv
https://pastebin.com/fGkfHRgA
https://pastebin.com/3uF2PZgW
https://pastebin.com/yrwWGir9
https://pastebin.com/DuJE5XWa
https://pastebin.com/AVFvUePM
https://pastebin.com/M238qSej
https://pastebin.com/0B4NeJVz
https://pastebin.com/QC10Yytt
https://pastebin.com/z9uFQLbx
https://pastebin.com/jnR6Ksj2
https://pastebin.com/PJRHZYLg
https://pastebin.com/fskAwwPB
https://pastebin.com/GZ06rdYf
https://pastebin.com/spckePTy
https://pastebin.com/k5bpeqiD
https://pastebin.com/FUU83kVA
https://pastebin.com/dM5D2uq9
https://pastebin.com/HDyrbkcH
https://pastebin.com/6wLvBQBZ
https://pastebin.com/mkzrQGUE
https://pastebin.com/w40S6h1g
https://pastebin.com/EC5Qsc1J
https://pastebin.com/YyecbF2B
https://pastebin.com/rzFVRVD1
https://pastebin.com/nfukdwW3
https://pastebin.com/U0TfAD8F
https://pastebin.com/cegRdmaa
https://pastebin.com/HP55mCGz
https://pastebin.com/tDXrav7c
https://pastebin.com/VVzmD76k
https://pastebin.com/BHNwWAgu
https://pastebin.com/eR9LLY9Q
https://pastebin.com/0VYxXiXy
https://pastebin.com/XnBpR3QN
https://pastebin.com/tBtYnBVG
https://pastebin.com/8u9mvEPB
https://pastebin.com/2U7ttpz2
https://pastebin.com/Gagnm4jU
https://pastebin.com/43arJtBe
https://pastebin.com/XZ5ysaad
https://pastebin.com/JH3cJ0tN
https://pastebin.com/WfYeNrRa
https://pastebin.com/qDUK54Zy
https://pastebin.com/5LK03T2X
https://pastebin.com/d9GP4N9f
https://pastebin.com/AegGQDh5
https://pastebin.com/Msh1eGGs
https://pastebin.com/pW3QVH8H
https://pastebin.com/YQvV6CCA
https://pastebin.com/BekJgqXm
https://pastebin.com/24wFN8fj
https://pastebin.com/PcJRC4W5
https://pastebin.com/cjM2pYBz
https://pastebin.com/vEqh5L7f
https://pastebin.com/KZBzS7Re
https://pastebin.com/M7KwpPmg

继续阅读 »

问题现象
在HarmonyOS中,使用NavDestination实现页面跳转至其他页面后,下次进入如何保持跳转前页面的浏览位置?

背景知识
Navigation:Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(NavDestination的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
@ohos.arkui.observer(无感监听)提供UI组件行为变化的无感监听能力。可以监听Navigation的页面切换事件进行相应操作。
Scroll是一种可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
onDidScroll方法在Scroll滚动时触发,可用于在滑动过程中获取Scroll组件的偏移量yOffset。
scrollTo方法可用于让Scroll组件滑动到指定位置。
AppStorage是应用全局的UI状态存储,和应用的进程绑定,只能在UI主线程中使用,无法在子线程中使用、修改。
解决方案
方案一:使用路由模式保留页面实例。
在页面跳转时不要使用pop和clear等方法,否则NavDestination页面会被回收。可以采用单例模式MOVE_TO_TOP_SINGLETON跳转至指定的页面,该方式会使用栈内已存在的页面实例(即浏览位置不变)。

由于单例模式是从栈底到栈顶依次查找,当栈内存在多个同名页面实例时,会默认跳转最底层的同名页面实例,所以需确保栈内只存在一个同名实例,否则跳转的页面保留的滚动位置与上一次显示的页面会不一致(显示的是栈底同名实例保留的滚动位置)。

import { PageOneS1Builder } from './PageOneS1';
import { PageTwoS1Builder } from './PageTwoS1';

@Entry
@Component
struct Solution1 {
private pathStack: NavPathStack = new NavPathStack();

aboutToAppear(): void {
this.pathStack.pushPath({ name: 'PageOneS1' }); // 推送第一个子页作为首页
}

@Builder
pageMap(name: string) {
if (name === 'PageOneS1') {
PageOneS1Builder();
} else if (name === 'PageTwoS1') {
PageTwoS1Builder();
}
}

build() {
Navigation(this.pathStack) {
}
.navDestination(this.pageMap)
.width('100%')
.height('100%')
.hideNavBar(true);
}
}
@Builder
export function PageOneS1Builder() {
PageOneS1();
}

@Component
struct PageOneS1 {
private pathStack: NavPathStack = new NavPathStack();
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

build() {
NavDestination() {
Column({ space: 20 }) {
Row() {
Button('跳转页面')
.margin({ top: 20 })
.onClick(() => {
this.pathStack.pushPathByName('PageTwoS1', null, false);
});
};

    List({ space: 16 }) {  
      ForEach(this.arr, (item: number) => {  
        ListItem() {  
          Text(item.toString())  
            .width('100%')  
            .height(100)  
            .fontSize(16)  
            .textAlign(TextAlign.Center)  
            .borderRadius(16)  
            .backgroundColor('#F1F3F5');  
        }.width('100%');  
      }, (item: string) => item);  
    }.padding({ left: 12, right: 12 })  
    .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])  
    .alignListItem(ListItemAlign.Center)  
    .height('90%');  
  };  
}.width('100%').height('100%')  
.onReady((context: NavDestinationContext) => {  
  this.pathStack = context.pathStack;  
});  

}
}
@Builder
export function PageTwoS1Builder() {
PageTwoS1();
}

@Component
struct PageTwoS1 {
pathStack: NavPathStack = new NavPathStack();

build() {
NavDestination() {
Column({ space: 20 }) {
Button('单例跳转')
.width('30%')
.margin('20vp')
.onClick(() => {
// 或者使用单例模式跳转回其它页面
this.pathStack.pushPath({ name: 'PageOneS1' }, { launchMode: LaunchMode.MOVE_TO_TOP_SINGLETON });
});
}.width('100%').height('100%');
}
.onReady((context: NavDestinationContext) => {
this.pathStack = context.pathStack;
});
}
}
https://pastebin.com/B0hqJAZx
https://pastebin.com/v4JTaWDt
https://pastebin.com/d5ge4288
https://pastebin.com/3shcMPv5
https://pastebin.com/70uKbDuw
https://pastebin.com/3LhjKXni
https://pastebin.com/5gVBhCGx
https://pastebin.com/dpMxkMXN
https://pastebin.com/fv8cG0b7
https://pastebin.com/JtuLjtFR
https://pastebin.com/yCfWpnxz
https://pastebin.com/Q2rrq3WB
https://pastebin.com/3bKAPcGk
https://pastebin.com/j7MfT7Dc
https://pastebin.com/U0p3Fvrc
https://pastebin.com/6sYfe5Lr
https://pastebin.com/jLNESEFx
https://pastebin.com/2KdkqCkw
https://pastebin.com/WAgQsmsV
https://pastebin.com/xmiRqKfd
https://pastebin.com/LXPu7Btx
https://pastebin.com/Qcg8dPbD
https://pastebin.com/EhtDxXMD
https://pastebin.com/yEwh5m4v
https://pastebin.com/tU0CueV4
https://pastebin.com/8JzMaNz7
https://pastebin.com/3jg8aspW
https://pastebin.com/YyHrmrJK
https://pastebin.com/ZgagcLAc
https://pastebin.com/ABpgUr5G
https://pastebin.com/cvPYk5AN
https://pastebin.com/XGZQUT1m
https://pastebin.com/qAd27GCF
https://pastebin.com/PiFNHkLd
https://pastebin.com/aiYX5L1G
https://pastebin.com/aqpnXQvz
https://pastebin.com/kB8XJ9n2
https://pastebin.com/sLfk0TR7
https://pastebin.com/nQ9nV4g8
https://pastebin.com/NAUQ9SA0
https://pastebin.com/GxvWFg6T
https://pastebin.com/TSNy8Cys
https://pastebin.com/fpN03727
https://pastebin.com/QAFi8vrv
https://pastebin.com/fGkfHRgA
https://pastebin.com/3uF2PZgW
https://pastebin.com/yrwWGir9
https://pastebin.com/DuJE5XWa
https://pastebin.com/AVFvUePM
https://pastebin.com/M238qSej
https://pastebin.com/0B4NeJVz
https://pastebin.com/QC10Yytt
https://pastebin.com/z9uFQLbx
https://pastebin.com/jnR6Ksj2
https://pastebin.com/PJRHZYLg
https://pastebin.com/fskAwwPB
https://pastebin.com/GZ06rdYf
https://pastebin.com/spckePTy
https://pastebin.com/k5bpeqiD
https://pastebin.com/FUU83kVA
https://pastebin.com/dM5D2uq9
https://pastebin.com/HDyrbkcH
https://pastebin.com/6wLvBQBZ
https://pastebin.com/mkzrQGUE
https://pastebin.com/w40S6h1g
https://pastebin.com/EC5Qsc1J
https://pastebin.com/YyecbF2B
https://pastebin.com/rzFVRVD1
https://pastebin.com/nfukdwW3
https://pastebin.com/U0TfAD8F
https://pastebin.com/cegRdmaa
https://pastebin.com/HP55mCGz
https://pastebin.com/tDXrav7c
https://pastebin.com/VVzmD76k
https://pastebin.com/BHNwWAgu
https://pastebin.com/eR9LLY9Q
https://pastebin.com/0VYxXiXy
https://pastebin.com/XnBpR3QN
https://pastebin.com/tBtYnBVG
https://pastebin.com/8u9mvEPB
https://pastebin.com/2U7ttpz2
https://pastebin.com/Gagnm4jU
https://pastebin.com/43arJtBe
https://pastebin.com/XZ5ysaad
https://pastebin.com/JH3cJ0tN
https://pastebin.com/WfYeNrRa
https://pastebin.com/qDUK54Zy
https://pastebin.com/5LK03T2X
https://pastebin.com/d9GP4N9f
https://pastebin.com/AegGQDh5
https://pastebin.com/Msh1eGGs
https://pastebin.com/pW3QVH8H
https://pastebin.com/YQvV6CCA
https://pastebin.com/BekJgqXm
https://pastebin.com/24wFN8fj
https://pastebin.com/PcJRC4W5
https://pastebin.com/cjM2pYBz
https://pastebin.com/vEqh5L7f
https://pastebin.com/KZBzS7Re
https://pastebin.com/M7KwpPmg

收起阅读 »

iOS 混编提交苹果 Appstore 流程详解

iOS

iOS 混编提交苹果 Appstore 流程详解
前言
当下 iOS 项目主流分为三类混编场景:OC+Swift 原生混编、原生 OC/Swift+Flutter 混编、原生 + React Native/H5 混合开发。混编项目打包上架极易出现编译报错、SwiftSupport 缺失、二进制校验失败、4.3 同质化误审等问题,很多开发者卡在 Archive 打包、IPA 上传、后台构建版本环节反复踩坑。
本文完整覆盖混编工程前置配置→Release 打包归档→IPA 校验上传→App Store Connect 后台配置→提交审核→混编专属报错 & 4.3 拒审解决方案全流程,适配 2026 最新 Xcode 与苹果审核规则,原生、Flutter、RN 混编通用,新手可直接对照操作。
一、混编项目上架前置准备(必做,避免打包失败)

  1. 开发者账号与证书环境准备
    登录苹果开发者后台,创建对应 Bundle ID,开启对应能力(推送、内购、后台刷新等);
    生成iOS Distribution 发布证书与对应生产描述文件,Xcode 登录开发者账号自动下载;
    混编项目禁止共用测试证书打包上架,证书、描述文件一对一绑定 Bundle ID,多马甲混编包需独立证书隔离,规避 4.3 账号关联风控。

Xcode发布证书选择界面

  1. 原生 OC+Swift 混编工程配置
    项目新建 Swift 文件时自动生成xxx-Bridging-Header.h桥接文件;
    Build Settings 中确认Objective-C Bridging Header路径正确;
    开启Build Libraries for Distribution,解决 Swift 库符号导出报错;
    移除项目内冗余 dylib 动态库,统一替换为 Framework 静态库,防止上传报ITMS-90426 SwiftSupport缺失错误。
  2. Flutter/RN 跨平台混编前置编译
    Flutter 混编
    终端执行flutter clean清理缓存,flutter build ipa --release生成 Release 产物;
    打开ios/Runner.xcworkspace,不要打开 xcodeproj;
    Pod 执行pod install --repo-update,确保第三方库编译配置为 Release 模式。
    React Native 混编
    执行yarn ios --mode Release打包离线 JS 资源;
    Edit Scheme 将 Run、Archive 配置全部切换为 Release,关闭 Debug 调试菜单。

Scheme切换Release配置

  1. 工程通用清理(混编核心避坑)
    删除 Debug 测试代码、打印日志、测试页面、占位 Demo 资源;
    统一项目版本号、Build 号,每一次打包 Build 号必须递增;
    清理工程重复图片、同名资源、旧版打包残留文件,降低二进制相似度,减少 4.3 误判概率;
    Info.plist 完善隐私权限描述、应用名称、版权信息,补齐所有必填隐私字段。
    二、Xcode 混编项目 Archive 归档打包核心流程
    步骤 1:切换编译设备与打包模式
    Xcode 顶部设备栏选择 Any iOS Device (arm64),禁止选择模拟器;
    确认当前 Scheme 为 Release,Debug 模式无法生成上架归档包。

切换Any iOS Device设备
步骤 2:执行 Archive 归档
顶部菜单栏 Product → Archive,等待编译完成;
混编项目编译速度慢,若出现 Swift 桥接报错,检查桥接文件路径、头文件导入权限;
Flutter/RN 混编编译失败优先执行flutter clean、删除 Pods 文件夹重装依赖。

Xcode Archive打包入口
步骤 3:归档包校验 Validate(关键前置检测)
编译完成自动弹出 Organizer 归档列表,选中最新 Archive 包;
点击Validate App,登录开发者账号,自动校验包体、Swift 依赖、签名、权限、二进制合规性;
混编高频校验失败项:
Invalid Swift Support:项目内嵌第三方 dylib 动态库,替换为 Framework 静态库重打包;
签名不匹配:描述文件 Bundle ID 与项目不一致,重新下载发布描述文件;
冗余架构包含 i386 模拟器架构,在 Build Phase 剥离模拟器架构。

Archive包校验界面
步骤 4:Distribute App 上传 IPA 至 App Store Connect
校验无报错后点击Distribute App,分发渠道选择App Store Connect;
勾选所有上传选项(包含符号表 dSYM、SwiftSupport 依赖库);
选择对应发布签名证书,等待 IPA 上传完成;
备选上传方案:使用 Transporter 工具单独上传 IPA,适合无 Mac 云打包导出的混编包。

Distribute App分发上传界面
三、App Store Connect 后台完整配置流程
IPA 上传完成后约 10–30 分钟后台同步构建版本,再进行全套元数据配置:

  1. 应用基础信息填写
    进入「我的 App」,选择对应应用,创建新版本;
    填写版本描述、副标题、关键词,禁止关键词恶意堆叠;
    上传全套 iPhone、iPad 截图、预览视频,混编项目截图必须为真实 Release 包界面,禁止使用模拟器 Debug 截图;
    填写年龄分级、版权信息、技术支持网址、独立隐私政策链接(多混编马甲禁止共用隐私域名)。

App Store Connect版本后台界面

  1. 绑定构建版本
    侧边栏「构建版本」,选择刚刚上传成功的 IPA 包;
    混编项目若版本不显示,等待后台同步,或重新上传 Archive 包;
    若应用需要登录,提前填写审核专用测试账号,保证审核人员可完整体验全部混编功能。
  2. 隐私与合规配置
    「App 隐私」模块完整勾选收集的用户数据(定位、相册、相机、推送等);
    混编项目集成第三方 SDK(统计、支付、推送)需同步标注数据收集用途;
    虚拟付费功能必须配置苹果 IAP 内购,禁止混编 H5、Flutter 跳转外部支付。
  3. 提审备注填写(混编项目专用模板)
    提审备注区分普通混编、自研混编、跨平台混编,降低人工审核质疑,规避 4.3:
    plaintext
    中文备注:
    本应用为OC+Swift/Flutter混编自研产品,无套用通用模板、无同源马甲包。项目完整重构底层代码与页面交互逻辑,新增专属特色功能,二进制包体、商店素材、后端接口均做差异化处理,不存在重复垃圾应用行为,审核人员可通过测试账号完整体验全部混编功能。

English Note:
This app is independently developed with OC & Swift/Flutter mixed compilation, no open-source templates or duplicate spam apps. We have reconstructed code structure and UI logic, added exclusive differentiated functions. All binary, metadata and backend services are unique. Please test all hybrid functions with the provided test account.
四、提交审核与后续处理
全部必填项无红色警告后,点击「提交以供审核」;
常规审核 24–48 小时,混编复杂跨平台项目审核周期延长至 3–5 天;
审核状态通知:邮件 + App Store Connect 后台同步推送,分为通过、需修改、4.3 垃圾应用拒审、合规条款驳回四类。
五、混编项目专属高频报错解决方案

  1. ITMS-90426 Invalid Swift Support(最常见)
    原因:OC 混编项目内嵌 dylib 动态库,苹果识别为 Swift 依赖缺失;
    解决:将第三方 dylib 替换为 Framework 静态库,Clean 项目后重新 Archive 打包。
  2. 归档成功,后台无构建版本
    原因:上传中断、包体架构冗余、SwiftSupport 缺失;
    解决:Validate 校验无报错后重新上传,使用稳定网络,剥离模拟器架构。
  3. Flutter/RN 混编闪退、功能失效
    原因:Debug 资源未剥离、离线 JS 未打包、Pod 依赖编译异常;
    解决:执行flutter clean/ 清理 node_modules,切换 Release 模式重新编译。
  4. 混编项目被 4.3 Guideline 4.3 拒审
    核心诱因
    跨平台模板源码打包,仅修改图标配色,二进制代码指纹高度重合;
    多马甲混编包共用打包设备、IP、证书、隐私链接,环境关联风控;
    原生混编复用旧项目大量未重构代码,工程目录、资源文件相似度超标。
    分层整改方案
    轻度误判(自研混编,仅元数据相似)
    提交双语申诉,附上混编工程目录截图、独有功能演示截图,证明产品差异化。
    中度同质化(界面 / 代码结构相似)
    重构 30% 以上混编业务逻辑,调整 Flutter 页面路由、OC 模块拆分顺序,全套重做商店截图与描述。
    重度模板混编 / 多次 4.3 拒审
    重构底层混编交互代码,更换全新 Mac 打包设备、独立手机热点,更换 Bundle ID 与证书,新增 1–2 个独家功能稀释模板代码占比。
    六、混编上架长期避坑总结
    打包规范:混编项目必须 Release 模式归档,禁止 Debug 包提交,定期清理编译缓存;
    代码隔离:模板类跨平台混编项目,必须重构核心业务代码,仅表层换皮极易触发 4.3;
    环境隔离:多马甲混编包一机一号一网,不共用证书、隐私域名、打包脚本;
    前置校验:每次 Archive 必须执行 Validate,提前拦截 Swift、签名、架构报错;
    合规前置:混编集成第三方 SDK、H5 支付、隐私权限提前配置,避免合规类拒审拉长周期。
    整套流程从工程配置、打包上传、后台配置到拒审急救完整闭环,覆盖 OC+Swift、Flutter、RN 全类型混编项目,严格按照本文步骤操作可大幅降低打包报错与 4.3 审核驳回概率。
继续阅读 »

iOS 混编提交苹果 Appstore 流程详解
前言
当下 iOS 项目主流分为三类混编场景:OC+Swift 原生混编、原生 OC/Swift+Flutter 混编、原生 + React Native/H5 混合开发。混编项目打包上架极易出现编译报错、SwiftSupport 缺失、二进制校验失败、4.3 同质化误审等问题,很多开发者卡在 Archive 打包、IPA 上传、后台构建版本环节反复踩坑。
本文完整覆盖混编工程前置配置→Release 打包归档→IPA 校验上传→App Store Connect 后台配置→提交审核→混编专属报错 & 4.3 拒审解决方案全流程,适配 2026 最新 Xcode 与苹果审核规则,原生、Flutter、RN 混编通用,新手可直接对照操作。
一、混编项目上架前置准备(必做,避免打包失败)

  1. 开发者账号与证书环境准备
    登录苹果开发者后台,创建对应 Bundle ID,开启对应能力(推送、内购、后台刷新等);
    生成iOS Distribution 发布证书与对应生产描述文件,Xcode 登录开发者账号自动下载;
    混编项目禁止共用测试证书打包上架,证书、描述文件一对一绑定 Bundle ID,多马甲混编包需独立证书隔离,规避 4.3 账号关联风控。

Xcode发布证书选择界面

  1. 原生 OC+Swift 混编工程配置
    项目新建 Swift 文件时自动生成xxx-Bridging-Header.h桥接文件;
    Build Settings 中确认Objective-C Bridging Header路径正确;
    开启Build Libraries for Distribution,解决 Swift 库符号导出报错;
    移除项目内冗余 dylib 动态库,统一替换为 Framework 静态库,防止上传报ITMS-90426 SwiftSupport缺失错误。
  2. Flutter/RN 跨平台混编前置编译
    Flutter 混编
    终端执行flutter clean清理缓存,flutter build ipa --release生成 Release 产物;
    打开ios/Runner.xcworkspace,不要打开 xcodeproj;
    Pod 执行pod install --repo-update,确保第三方库编译配置为 Release 模式。
    React Native 混编
    执行yarn ios --mode Release打包离线 JS 资源;
    Edit Scheme 将 Run、Archive 配置全部切换为 Release,关闭 Debug 调试菜单。

Scheme切换Release配置

  1. 工程通用清理(混编核心避坑)
    删除 Debug 测试代码、打印日志、测试页面、占位 Demo 资源;
    统一项目版本号、Build 号,每一次打包 Build 号必须递增;
    清理工程重复图片、同名资源、旧版打包残留文件,降低二进制相似度,减少 4.3 误判概率;
    Info.plist 完善隐私权限描述、应用名称、版权信息,补齐所有必填隐私字段。
    二、Xcode 混编项目 Archive 归档打包核心流程
    步骤 1:切换编译设备与打包模式
    Xcode 顶部设备栏选择 Any iOS Device (arm64),禁止选择模拟器;
    确认当前 Scheme 为 Release,Debug 模式无法生成上架归档包。

切换Any iOS Device设备
步骤 2:执行 Archive 归档
顶部菜单栏 Product → Archive,等待编译完成;
混编项目编译速度慢,若出现 Swift 桥接报错,检查桥接文件路径、头文件导入权限;
Flutter/RN 混编编译失败优先执行flutter clean、删除 Pods 文件夹重装依赖。

Xcode Archive打包入口
步骤 3:归档包校验 Validate(关键前置检测)
编译完成自动弹出 Organizer 归档列表,选中最新 Archive 包;
点击Validate App,登录开发者账号,自动校验包体、Swift 依赖、签名、权限、二进制合规性;
混编高频校验失败项:
Invalid Swift Support:项目内嵌第三方 dylib 动态库,替换为 Framework 静态库重打包;
签名不匹配:描述文件 Bundle ID 与项目不一致,重新下载发布描述文件;
冗余架构包含 i386 模拟器架构,在 Build Phase 剥离模拟器架构。

Archive包校验界面
步骤 4:Distribute App 上传 IPA 至 App Store Connect
校验无报错后点击Distribute App,分发渠道选择App Store Connect;
勾选所有上传选项(包含符号表 dSYM、SwiftSupport 依赖库);
选择对应发布签名证书,等待 IPA 上传完成;
备选上传方案:使用 Transporter 工具单独上传 IPA,适合无 Mac 云打包导出的混编包。

Distribute App分发上传界面
三、App Store Connect 后台完整配置流程
IPA 上传完成后约 10–30 分钟后台同步构建版本,再进行全套元数据配置:

  1. 应用基础信息填写
    进入「我的 App」,选择对应应用,创建新版本;
    填写版本描述、副标题、关键词,禁止关键词恶意堆叠;
    上传全套 iPhone、iPad 截图、预览视频,混编项目截图必须为真实 Release 包界面,禁止使用模拟器 Debug 截图;
    填写年龄分级、版权信息、技术支持网址、独立隐私政策链接(多混编马甲禁止共用隐私域名)。

App Store Connect版本后台界面

  1. 绑定构建版本
    侧边栏「构建版本」,选择刚刚上传成功的 IPA 包;
    混编项目若版本不显示,等待后台同步,或重新上传 Archive 包;
    若应用需要登录,提前填写审核专用测试账号,保证审核人员可完整体验全部混编功能。
  2. 隐私与合规配置
    「App 隐私」模块完整勾选收集的用户数据(定位、相册、相机、推送等);
    混编项目集成第三方 SDK(统计、支付、推送)需同步标注数据收集用途;
    虚拟付费功能必须配置苹果 IAP 内购,禁止混编 H5、Flutter 跳转外部支付。
  3. 提审备注填写(混编项目专用模板)
    提审备注区分普通混编、自研混编、跨平台混编,降低人工审核质疑,规避 4.3:
    plaintext
    中文备注:
    本应用为OC+Swift/Flutter混编自研产品,无套用通用模板、无同源马甲包。项目完整重构底层代码与页面交互逻辑,新增专属特色功能,二进制包体、商店素材、后端接口均做差异化处理,不存在重复垃圾应用行为,审核人员可通过测试账号完整体验全部混编功能。

English Note:
This app is independently developed with OC & Swift/Flutter mixed compilation, no open-source templates or duplicate spam apps. We have reconstructed code structure and UI logic, added exclusive differentiated functions. All binary, metadata and backend services are unique. Please test all hybrid functions with the provided test account.
四、提交审核与后续处理
全部必填项无红色警告后,点击「提交以供审核」;
常规审核 24–48 小时,混编复杂跨平台项目审核周期延长至 3–5 天;
审核状态通知:邮件 + App Store Connect 后台同步推送,分为通过、需修改、4.3 垃圾应用拒审、合规条款驳回四类。
五、混编项目专属高频报错解决方案

  1. ITMS-90426 Invalid Swift Support(最常见)
    原因:OC 混编项目内嵌 dylib 动态库,苹果识别为 Swift 依赖缺失;
    解决:将第三方 dylib 替换为 Framework 静态库,Clean 项目后重新 Archive 打包。
  2. 归档成功,后台无构建版本
    原因:上传中断、包体架构冗余、SwiftSupport 缺失;
    解决:Validate 校验无报错后重新上传,使用稳定网络,剥离模拟器架构。
  3. Flutter/RN 混编闪退、功能失效
    原因:Debug 资源未剥离、离线 JS 未打包、Pod 依赖编译异常;
    解决:执行flutter clean/ 清理 node_modules,切换 Release 模式重新编译。
  4. 混编项目被 4.3 Guideline 4.3 拒审
    核心诱因
    跨平台模板源码打包,仅修改图标配色,二进制代码指纹高度重合;
    多马甲混编包共用打包设备、IP、证书、隐私链接,环境关联风控;
    原生混编复用旧项目大量未重构代码,工程目录、资源文件相似度超标。
    分层整改方案
    轻度误判(自研混编,仅元数据相似)
    提交双语申诉,附上混编工程目录截图、独有功能演示截图,证明产品差异化。
    中度同质化(界面 / 代码结构相似)
    重构 30% 以上混编业务逻辑,调整 Flutter 页面路由、OC 模块拆分顺序,全套重做商店截图与描述。
    重度模板混编 / 多次 4.3 拒审
    重构底层混编交互代码,更换全新 Mac 打包设备、独立手机热点,更换 Bundle ID 与证书,新增 1–2 个独家功能稀释模板代码占比。
    六、混编上架长期避坑总结
    打包规范:混编项目必须 Release 模式归档,禁止 Debug 包提交,定期清理编译缓存;
    代码隔离:模板类跨平台混编项目,必须重构核心业务代码,仅表层换皮极易触发 4.3;
    环境隔离:多马甲混编包一机一号一网,不共用证书、隐私域名、打包脚本;
    前置校验:每次 Archive 必须执行 Validate,提前拦截 Swift、签名、架构报错;
    合规前置:混编集成第三方 SDK、H5 支付、隐私权限提前配置,避免合规类拒审拉长周期。
    整套流程从工程配置、打包上传、后台配置到拒审急救完整闭环,覆盖 OC+Swift、Flutter、RN 全类型混编项目,严格按照本文步骤操作可大幅降低打包报错与 4.3 审核驳回概率。
收起阅读 »

-9001搞了3天,终于去掉了

uni-ad

广告原生接入时uniad -9001提示,终于去掉了

广告原生接入时uniad -9001提示,终于去掉了

如何解决NavDestination切换页面后浏览位置无法保存问题

问题现象
在HarmonyOS中,使用NavDestination实现页面跳转至其他页面后,下次进入如何保持跳转前页面的浏览位置?

背景知识
Navigation:Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(NavDestination的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
@ohos.arkui.observer(无感监听)提供UI组件行为变化的无感监听能力。可以监听Navigation的页面切换事件进行相应操作。
Scroll是一种可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
onDidScroll方法在Scroll滚动时触发,可用于在滑动过程中获取Scroll组件的偏移量yOffset。
scrollTo方法可用于让Scroll组件滑动到指定位置。
AppStorage是应用全局的UI状态存储,和应用的进程绑定,只能在UI主线程中使用,无法在子线程中使用、修改。
解决方案
方案一:使用路由模式保留页面实例。
在页面跳转时不要使用pop和clear等方法,否则NavDestination页面会被回收。可以采用单例模式MOVE_TO_TOP_SINGLETON跳转至指定的页面,该方式会使用栈内已存在的页面实例(即浏览位置不变)。

由于单例模式是从栈底到栈顶依次查找,当栈内存在多个同名页面实例时,会默认跳转最底层的同名页面实例,所以需确保栈内只存在一个同名实例,否则跳转的页面保留的滚动位置与上一次显示的页面会不一致(显示的是栈底同名实例保留的滚动位置)。
https://pastebin.com/Kvfw56Ui
https://pastebin.com/6Jk0iJHg
https://pastebin.com/aHSWm99J
https://pastebin.com/FgCAfbE3
https://pastebin.com/TdJAtZuS
https://pastebin.com/t5prk0xM
https://pastebin.com/9KBv8p6Z
https://pastebin.com/QzHRmSST
https://pastebin.com/EYerCiYE
https://pastebin.com/KQYtdiVR
https://pastebin.com/qPDGQpr7
https://pastebin.com/Ur2cbXAg
https://pastebin.com/niVM6VLk
https://pastebin.com/XpBnqUwS
https://pastebin.com/ndDMLQMC
https://pastebin.com/Fe0WC3pa
https://pastebin.com/RrnvPE1w
https://pastebin.com/bD5WPwRg
https://pastebin.com/YDh64vkT
https://pastebin.com/4LWHr9jc
https://pastebin.com/DCtRCCCk
https://pastebin.com/3p2Jzncu
https://pastebin.com/T3SJ62ar
https://pastebin.com/GKfL979H
https://pastebin.com/XMYGtPje
https://pastebin.com/rzXKvcuv
https://pastebin.com/JvR7cH5d
https://pastebin.com/3FDVEcuX
https://pastebin.com/h6cUiaBF
https://pastebin.com/ME4peSzL
https://pastebin.com/N5qAacXz
https://pastebin.com/JZZwHd6Z
https://pastebin.com/fGN6CmDR
https://pastebin.com/K3EVxehv
https://pastebin.com/PqCXWDDh
https://pastebin.com/fqusPVdu
https://pastebin.com/Dvt50mhL
https://pastebin.com/CtGAWTga
https://pastebin.com/XyuX26ci
https://pastebin.com/d9K2WJJt
https://pastebin.com/GwHXXvtC
https://pastebin.com/DDCwB3nj
https://pastebin.com/w0SKXPMz
https://pastebin.com/pN4H6zQh
https://pastebin.com/2MEDMTDa
https://pastebin.com/Km8YREQ6
https://pastebin.com/JCDkV4YW
https://pastebin.com/DVzuaCcx
https://pastebin.com/uc5iwWuj
https://pastebin.com/gNCWP8Qc
https://pastebin.com/Yu8Egw5s
https://pastebin.com/0LyQQjKP
https://pastebin.com/w5KFZYZd
https://pastebin.com/675wTRDu
https://pastebin.com/q3HydkUg
https://pastebin.com/zw5u9Qdi
https://pastebin.com/mzFWd75m
https://pastebin.com/xa0XPcNr
https://pastebin.com/YTTmLc1J
https://pastebin.com/81JwSJWW
https://pastebin.com/JZ5Yd8mP
https://pastebin.com/HYPHRp3p
https://pastebin.com/i7UKj8g6
https://pastebin.com/eS8TWDJF
https://pastebin.com/s17FvZ9R
https://pastebin.com/YG3qffNc
https://pastebin.com/Jm6jQ9Hr
https://pastebin.com/RyYPmYMa
https://pastebin.com/rtcK0Z53
https://pastebin.com/GX1W9zHA
https://pastebin.com/MydzWJwB
https://pastebin.com/sfxsFT66
https://pastebin.com/aayDqQsH
https://pastebin.com/GHia1M2L
https://pastebin.com/tHvSWiGS
https://pastebin.com/cJmt5rpy
https://pastebin.com/JYDkdGLs
https://pastebin.com/stRVBXTH
https://pastebin.com/G8gY33rM
https://pastebin.com/yWTE4s8z
https://pastebin.com/bF237U4E
https://pastebin.com/A2XjbJFL
https://pastebin.com/CMPsmXHW
https://pastebin.com/XBnbf5yR
https://pastebin.com/2WTSxuZH
https://pastebin.com/x9TYHnnR
https://pastebin.com/yr442rZ9
https://pastebin.com/kTQXdYBq
https://pastebin.com/sXG2mktr
https://pastebin.com/sHKZkR2S
https://pastebin.com/VgaMNyjP
https://pastebin.com/saBuBbfx
https://pastebin.com/Akn339vN
https://pastebin.com/LxJpgWdH
https://pastebin.com/gCUJtG1r
https://pastebin.com/bNS4mhKg
https://pastebin.com/PKcfHFsC
https://pastebin.com/3cMHb88V
https://pastebin.com/3HyqCceQ
https://pastebin.com/NpPEKWNc
https://pastebin.com/Mxr4rfx3
https://pastebin.com/1ND8zgqs
https://pastebin.com/Bk8zT2RD
https://pastebin.com/PivBT23m
https://pastebin.com/PhBTFTus
https://pastebin.com/iRW432jR
https://pastebin.com/W4Euyfpd
https://pastebin.com/E9JLP4M1
https://pastebin.com/2G53rfER
https://pastebin.com/GCiDaiZh
https://pastebin.com/jd9TTX9d
https://pastebin.com/Ah3LCi7e
https://pastebin.com/mNF9WeS7
https://pastebin.com/aKzY3GUc
https://pastebin.com/n7cevaYk
https://pastebin.com/GDDDzUuy
https://pastebin.com/tyx4arNi
https://pastebin.com/j54FMwvB
https://pastebin.com/2cRztMQY
https://pastebin.com/G6WWzmMF
https://pastebin.com/eVszwUfs
https://pastebin.com/D4rYGpE6
https://pastebin.com/6Jya9VEL
https://pastebin.com/vyFWsBCr
https://pastebin.com/pv7BP9vr
https://pastebin.com/RhR9FeUP
https://pastebin.com/vWxFY2YW
https://pastebin.com/Lairj5Ld
https://pastebin.com/jwQKSavR
https://pastebin.com/8GvaRTz1
https://pastebin.com/3YHX2qmE
https://pastebin.com/kssYcnr7
https://pastebin.com/NtnKhtYY
https://pastebin.com/Fz6cc5Le
https://pastebin.com/icc6WRsj
https://pastebin.com/wWk9nFRp
https://pastebin.com/eXQgBJMX
https://pastebin.com/z0xrXUZ3
https://pastebin.com/spSBiP8J
https://pastebin.com/AaUJmpHM
https://pastebin.com/3x1w4uHd
https://pastebin.com/pKZvNg7m
https://pastebin.com/Qb6vxDTQ
https://pastebin.com/P0S6wfBk
https://pastebin.com/444CJvwY
https://pastebin.com/7MkiVbks
https://pastebin.com/45wrx7jX
https://pastebin.com/J6M4Hh9S
https://pastebin.com/T5gQ6kJV
https://pastebin.com/h4K76YnL
https://pastebin.com/Kmx8rkB5
https://pastebin.com/42F7A6X9
https://pastebin.com/qnTdJLyj
https://pastebin.com/LTBywbqr
https://pastebin.com/2sQhNdXp
https://pastebin.com/mhSnZhNt
https://pastebin.com/wEfqig2G
https://pastebin.com/HbyYyFs0
https://pastebin.com/vUXzYbcc
https://pastebin.com/nDJnT1yM
https://pastebin.com/DKM75CX4
https://pastebin.com/hB0980pZ
https://pastebin.com/Nk6s4uGj
https://pastebin.com/PJf3D7tg
https://pastebin.com/5Sr8y30c
https://pastebin.com/huf9nsJ4
https://pastebin.com/xtBzF05M
https://pastebin.com/JFmF4u1f
https://pastebin.com/4zmGeM48
https://pastebin.com/UB9TNyxW
https://pastebin.com/cXSRyukE
https://pastebin.com/XdhcwfBp
https://pastebin.com/UYMVPFgN
https://pastebin.com/c62H8NxQ
https://pastebin.com/84DXZjfQ
https://pastebin.com/fFepWW4H
https://pastebin.com/3Sq1TF6k
https://pastebin.com/SQPTntKg
https://pastebin.com/khc1nD0w
https://pastebin.com/p8beJJva
https://pastebin.com/9LfnVJAJ
https://pastebin.com/M6QchRZ9
https://pastebin.com/Egxy8RxR
https://pastebin.com/D9v72rK6
https://pastebin.com/82dq2ZHB
https://pastebin.com/WtWcMEAa
https://pastebin.com/FhzkMMw1
https://pastebin.com/s5kf22wS
https://pastebin.com/kxXm99HH
https://pastebin.com/ZeUdrbC7
https://pastebin.com/Uyd0wkV5
https://pastebin.com/Gj32PSKS
https://pastebin.com/QWZZkFKR
https://pastebin.com/Hd2BgPS5
https://pastebin.com/hdiUJFS0
https://pastebin.com/u2Gt9cfq
https://pastebin.com/0vHYKc8F
https://pastebin.com/TZVHGvLR
https://pastebin.com/VFxecajq
https://pastebin.com/nWj4HsBJ
https://pastebin.com/G8GUM8fz
https://pastebin.com/LReXd1m0
https://pastebin.com/fpQnrYTL
https://pastebin.com/RyDHm8nK
https://pastebin.com/4gAzEceK
https://pastebin.com/AgGD7Sw8
https://pastebin.com/Zh7srRfN
https://pastebin.com/2y9BHBvR
https://pastebin.com/cZ9yHWab
https://pastebin.com/NRHZcAUe
https://pastebin.com/qfC6uqGY
https://pastebin.com/pzbatnT2
https://pastebin.com/pytQrM3n
https://pastebin.com/zv1bEjfh
https://pastebin.com/Z7CHKjjW
https://pastebin.com/73NZB1fg
https://pastebin.com/zb96CYYT
https://pastebin.com/TVSbCuk0
https://pastebin.com/PQH1YKrR
https://pastebin.com/bv5qqT8j
https://pastebin.com/WpenkS9J
https://pastebin.com/jkgzXhCX
https://pastebin.com/pT7xkBGP
https://pastebin.com/ppyQuy1c
https://pastebin.com/LdT3rmMu
https://pastebin.com/EVTt0G5t
https://pastebin.com/Lv4a1muV
https://pastebin.com/zmTAWL2U
https://pastebin.com/QdxecLbK
https://pastebin.com/3kZ5NwrU
https://pastebin.com/TPJsBatd
https://pastebin.com/WfhnNpFV
https://pastebin.com/SAmdt79t
https://pastebin.com/JZ4KvEWL
https://pastebin.com/uGcyWALB
https://pastebin.com/MEq4JbqR
https://pastebin.com/3ucqcbc6
https://pastebin.com/3cDtaAwF
https://pastebin.com/yzn2GGYf
https://pastebin.com/RTjPyJNX
https://pastebin.com/SQDC9M1E
https://pastebin.com/xcasG7xf
https://pastebin.com/zZfPyQY3
https://pastebin.com/RNzWpA4q
https://pastebin.com/8pufepjf
https://pastebin.com/vxDSuXem
https://pastebin.com/HP4y0h1f
https://pastebin.com/46jYNt7j
https://pastebin.com/YUvcKeAw
https://pastebin.com/wGfKDBZe
https://pastebin.com/bccZqgn7
https://pastebin.com/cBisnNN3
https://pastebin.com/4WFqkrmi
https://pastebin.com/fc7jp78E
https://pastebin.com/yjptCxY9
https://pastebin.com/2D6R3N5s
https://pastebin.com/KvR4cDki
https://pastebin.com/Vk1Rk7uj
https://pastebin.com/JEiNNYpi
https://pastebin.com/PyzV38G0
https://pastebin.com/KbzwD20r
https://pastebin.com/ViKS1JgQ
https://pastebin.com/5YcYwqDE
https://pastebin.com/ZFMU4ndk
https://pastebin.com/0Ex2wTma
https://pastebin.com/pQ7MD6DZ
https://pastebin.com/UCTHHnqH
https://pastebin.com/sDEyLgsy
https://pastebin.com/Z7Wrv3qq
https://pastebin.com/qb5YncFh
https://pastebin.com/uibzH23E
https://pastebin.com/4ykQaXqk
https://pastebin.com/K5mKVf1G
https://pastebin.com/xYEugHiP
https://pastebin.com/z8JzmxYY
https://pastebin.com/0UXR57Di
https://pastebin.com/0hmA61Hd
https://pastebin.com/tPkKjDC1
https://pastebin.com/v0ra9Mya
https://pastebin.com/puHjxuHP
https://pastebin.com/fYS5Dnw5
https://pastebin.com/xDwmcBVp
https://pastebin.com/vYi6rTmN

继续阅读 »

问题现象
在HarmonyOS中,使用NavDestination实现页面跳转至其他页面后,下次进入如何保持跳转前页面的浏览位置?

背景知识
Navigation:Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(NavDestination的子组件)或非首页显示(NavDestination的子组件),首页和非首页通过路由进行切换。
@ohos.arkui.observer(无感监听)提供UI组件行为变化的无感监听能力。可以监听Navigation的页面切换事件进行相应操作。
Scroll是一种可滚动的容器组件,当子组件的布局尺寸超过父组件的尺寸时,内容可以滚动。
onDidScroll方法在Scroll滚动时触发,可用于在滑动过程中获取Scroll组件的偏移量yOffset。
scrollTo方法可用于让Scroll组件滑动到指定位置。
AppStorage是应用全局的UI状态存储,和应用的进程绑定,只能在UI主线程中使用,无法在子线程中使用、修改。
解决方案
方案一:使用路由模式保留页面实例。
在页面跳转时不要使用pop和clear等方法,否则NavDestination页面会被回收。可以采用单例模式MOVE_TO_TOP_SINGLETON跳转至指定的页面,该方式会使用栈内已存在的页面实例(即浏览位置不变)。

由于单例模式是从栈底到栈顶依次查找,当栈内存在多个同名页面实例时,会默认跳转最底层的同名页面实例,所以需确保栈内只存在一个同名实例,否则跳转的页面保留的滚动位置与上一次显示的页面会不一致(显示的是栈底同名实例保留的滚动位置)。
https://pastebin.com/Kvfw56Ui
https://pastebin.com/6Jk0iJHg
https://pastebin.com/aHSWm99J
https://pastebin.com/FgCAfbE3
https://pastebin.com/TdJAtZuS
https://pastebin.com/t5prk0xM
https://pastebin.com/9KBv8p6Z
https://pastebin.com/QzHRmSST
https://pastebin.com/EYerCiYE
https://pastebin.com/KQYtdiVR
https://pastebin.com/qPDGQpr7
https://pastebin.com/Ur2cbXAg
https://pastebin.com/niVM6VLk
https://pastebin.com/XpBnqUwS
https://pastebin.com/ndDMLQMC
https://pastebin.com/Fe0WC3pa
https://pastebin.com/RrnvPE1w
https://pastebin.com/bD5WPwRg
https://pastebin.com/YDh64vkT
https://pastebin.com/4LWHr9jc
https://pastebin.com/DCtRCCCk
https://pastebin.com/3p2Jzncu
https://pastebin.com/T3SJ62ar
https://pastebin.com/GKfL979H
https://pastebin.com/XMYGtPje
https://pastebin.com/rzXKvcuv
https://pastebin.com/JvR7cH5d
https://pastebin.com/3FDVEcuX
https://pastebin.com/h6cUiaBF
https://pastebin.com/ME4peSzL
https://pastebin.com/N5qAacXz
https://pastebin.com/JZZwHd6Z
https://pastebin.com/fGN6CmDR
https://pastebin.com/K3EVxehv
https://pastebin.com/PqCXWDDh
https://pastebin.com/fqusPVdu
https://pastebin.com/Dvt50mhL
https://pastebin.com/CtGAWTga
https://pastebin.com/XyuX26ci
https://pastebin.com/d9K2WJJt
https://pastebin.com/GwHXXvtC
https://pastebin.com/DDCwB3nj
https://pastebin.com/w0SKXPMz
https://pastebin.com/pN4H6zQh
https://pastebin.com/2MEDMTDa
https://pastebin.com/Km8YREQ6
https://pastebin.com/JCDkV4YW
https://pastebin.com/DVzuaCcx
https://pastebin.com/uc5iwWuj
https://pastebin.com/gNCWP8Qc
https://pastebin.com/Yu8Egw5s
https://pastebin.com/0LyQQjKP
https://pastebin.com/w5KFZYZd
https://pastebin.com/675wTRDu
https://pastebin.com/q3HydkUg
https://pastebin.com/zw5u9Qdi
https://pastebin.com/mzFWd75m
https://pastebin.com/xa0XPcNr
https://pastebin.com/YTTmLc1J
https://pastebin.com/81JwSJWW
https://pastebin.com/JZ5Yd8mP
https://pastebin.com/HYPHRp3p
https://pastebin.com/i7UKj8g6
https://pastebin.com/eS8TWDJF
https://pastebin.com/s17FvZ9R
https://pastebin.com/YG3qffNc
https://pastebin.com/Jm6jQ9Hr
https://pastebin.com/RyYPmYMa
https://pastebin.com/rtcK0Z53
https://pastebin.com/GX1W9zHA
https://pastebin.com/MydzWJwB
https://pastebin.com/sfxsFT66
https://pastebin.com/aayDqQsH
https://pastebin.com/GHia1M2L
https://pastebin.com/tHvSWiGS
https://pastebin.com/cJmt5rpy
https://pastebin.com/JYDkdGLs
https://pastebin.com/stRVBXTH
https://pastebin.com/G8gY33rM
https://pastebin.com/yWTE4s8z
https://pastebin.com/bF237U4E
https://pastebin.com/A2XjbJFL
https://pastebin.com/CMPsmXHW
https://pastebin.com/XBnbf5yR
https://pastebin.com/2WTSxuZH
https://pastebin.com/x9TYHnnR
https://pastebin.com/yr442rZ9
https://pastebin.com/kTQXdYBq
https://pastebin.com/sXG2mktr
https://pastebin.com/sHKZkR2S
https://pastebin.com/VgaMNyjP
https://pastebin.com/saBuBbfx
https://pastebin.com/Akn339vN
https://pastebin.com/LxJpgWdH
https://pastebin.com/gCUJtG1r
https://pastebin.com/bNS4mhKg
https://pastebin.com/PKcfHFsC
https://pastebin.com/3cMHb88V
https://pastebin.com/3HyqCceQ
https://pastebin.com/NpPEKWNc
https://pastebin.com/Mxr4rfx3
https://pastebin.com/1ND8zgqs
https://pastebin.com/Bk8zT2RD
https://pastebin.com/PivBT23m
https://pastebin.com/PhBTFTus
https://pastebin.com/iRW432jR
https://pastebin.com/W4Euyfpd
https://pastebin.com/E9JLP4M1
https://pastebin.com/2G53rfER
https://pastebin.com/GCiDaiZh
https://pastebin.com/jd9TTX9d
https://pastebin.com/Ah3LCi7e
https://pastebin.com/mNF9WeS7
https://pastebin.com/aKzY3GUc
https://pastebin.com/n7cevaYk
https://pastebin.com/GDDDzUuy
https://pastebin.com/tyx4arNi
https://pastebin.com/j54FMwvB
https://pastebin.com/2cRztMQY
https://pastebin.com/G6WWzmMF
https://pastebin.com/eVszwUfs
https://pastebin.com/D4rYGpE6
https://pastebin.com/6Jya9VEL
https://pastebin.com/vyFWsBCr
https://pastebin.com/pv7BP9vr
https://pastebin.com/RhR9FeUP
https://pastebin.com/vWxFY2YW
https://pastebin.com/Lairj5Ld
https://pastebin.com/jwQKSavR
https://pastebin.com/8GvaRTz1
https://pastebin.com/3YHX2qmE
https://pastebin.com/kssYcnr7
https://pastebin.com/NtnKhtYY
https://pastebin.com/Fz6cc5Le
https://pastebin.com/icc6WRsj
https://pastebin.com/wWk9nFRp
https://pastebin.com/eXQgBJMX
https://pastebin.com/z0xrXUZ3
https://pastebin.com/spSBiP8J
https://pastebin.com/AaUJmpHM
https://pastebin.com/3x1w4uHd
https://pastebin.com/pKZvNg7m
https://pastebin.com/Qb6vxDTQ
https://pastebin.com/P0S6wfBk
https://pastebin.com/444CJvwY
https://pastebin.com/7MkiVbks
https://pastebin.com/45wrx7jX
https://pastebin.com/J6M4Hh9S
https://pastebin.com/T5gQ6kJV
https://pastebin.com/h4K76YnL
https://pastebin.com/Kmx8rkB5
https://pastebin.com/42F7A6X9
https://pastebin.com/qnTdJLyj
https://pastebin.com/LTBywbqr
https://pastebin.com/2sQhNdXp
https://pastebin.com/mhSnZhNt
https://pastebin.com/wEfqig2G
https://pastebin.com/HbyYyFs0
https://pastebin.com/vUXzYbcc
https://pastebin.com/nDJnT1yM
https://pastebin.com/DKM75CX4
https://pastebin.com/hB0980pZ
https://pastebin.com/Nk6s4uGj
https://pastebin.com/PJf3D7tg
https://pastebin.com/5Sr8y30c
https://pastebin.com/huf9nsJ4
https://pastebin.com/xtBzF05M
https://pastebin.com/JFmF4u1f
https://pastebin.com/4zmGeM48
https://pastebin.com/UB9TNyxW
https://pastebin.com/cXSRyukE
https://pastebin.com/XdhcwfBp
https://pastebin.com/UYMVPFgN
https://pastebin.com/c62H8NxQ
https://pastebin.com/84DXZjfQ
https://pastebin.com/fFepWW4H
https://pastebin.com/3Sq1TF6k
https://pastebin.com/SQPTntKg
https://pastebin.com/khc1nD0w
https://pastebin.com/p8beJJva
https://pastebin.com/9LfnVJAJ
https://pastebin.com/M6QchRZ9
https://pastebin.com/Egxy8RxR
https://pastebin.com/D9v72rK6
https://pastebin.com/82dq2ZHB
https://pastebin.com/WtWcMEAa
https://pastebin.com/FhzkMMw1
https://pastebin.com/s5kf22wS
https://pastebin.com/kxXm99HH
https://pastebin.com/ZeUdrbC7
https://pastebin.com/Uyd0wkV5
https://pastebin.com/Gj32PSKS
https://pastebin.com/QWZZkFKR
https://pastebin.com/Hd2BgPS5
https://pastebin.com/hdiUJFS0
https://pastebin.com/u2Gt9cfq
https://pastebin.com/0vHYKc8F
https://pastebin.com/TZVHGvLR
https://pastebin.com/VFxecajq
https://pastebin.com/nWj4HsBJ
https://pastebin.com/G8GUM8fz
https://pastebin.com/LReXd1m0
https://pastebin.com/fpQnrYTL
https://pastebin.com/RyDHm8nK
https://pastebin.com/4gAzEceK
https://pastebin.com/AgGD7Sw8
https://pastebin.com/Zh7srRfN
https://pastebin.com/2y9BHBvR
https://pastebin.com/cZ9yHWab
https://pastebin.com/NRHZcAUe
https://pastebin.com/qfC6uqGY
https://pastebin.com/pzbatnT2
https://pastebin.com/pytQrM3n
https://pastebin.com/zv1bEjfh
https://pastebin.com/Z7CHKjjW
https://pastebin.com/73NZB1fg
https://pastebin.com/zb96CYYT
https://pastebin.com/TVSbCuk0
https://pastebin.com/PQH1YKrR
https://pastebin.com/bv5qqT8j
https://pastebin.com/WpenkS9J
https://pastebin.com/jkgzXhCX
https://pastebin.com/pT7xkBGP
https://pastebin.com/ppyQuy1c
https://pastebin.com/LdT3rmMu
https://pastebin.com/EVTt0G5t
https://pastebin.com/Lv4a1muV
https://pastebin.com/zmTAWL2U
https://pastebin.com/QdxecLbK
https://pastebin.com/3kZ5NwrU
https://pastebin.com/TPJsBatd
https://pastebin.com/WfhnNpFV
https://pastebin.com/SAmdt79t
https://pastebin.com/JZ4KvEWL
https://pastebin.com/uGcyWALB
https://pastebin.com/MEq4JbqR
https://pastebin.com/3ucqcbc6
https://pastebin.com/3cDtaAwF
https://pastebin.com/yzn2GGYf
https://pastebin.com/RTjPyJNX
https://pastebin.com/SQDC9M1E
https://pastebin.com/xcasG7xf
https://pastebin.com/zZfPyQY3
https://pastebin.com/RNzWpA4q
https://pastebin.com/8pufepjf
https://pastebin.com/vxDSuXem
https://pastebin.com/HP4y0h1f
https://pastebin.com/46jYNt7j
https://pastebin.com/YUvcKeAw
https://pastebin.com/wGfKDBZe
https://pastebin.com/bccZqgn7
https://pastebin.com/cBisnNN3
https://pastebin.com/4WFqkrmi
https://pastebin.com/fc7jp78E
https://pastebin.com/yjptCxY9
https://pastebin.com/2D6R3N5s
https://pastebin.com/KvR4cDki
https://pastebin.com/Vk1Rk7uj
https://pastebin.com/JEiNNYpi
https://pastebin.com/PyzV38G0
https://pastebin.com/KbzwD20r
https://pastebin.com/ViKS1JgQ
https://pastebin.com/5YcYwqDE
https://pastebin.com/ZFMU4ndk
https://pastebin.com/0Ex2wTma
https://pastebin.com/pQ7MD6DZ
https://pastebin.com/UCTHHnqH
https://pastebin.com/sDEyLgsy
https://pastebin.com/Z7Wrv3qq
https://pastebin.com/qb5YncFh
https://pastebin.com/uibzH23E
https://pastebin.com/4ykQaXqk
https://pastebin.com/K5mKVf1G
https://pastebin.com/xYEugHiP
https://pastebin.com/z8JzmxYY
https://pastebin.com/0UXR57Di
https://pastebin.com/0hmA61Hd
https://pastebin.com/tPkKjDC1
https://pastebin.com/v0ra9Mya
https://pastebin.com/puHjxuHP
https://pastebin.com/fYS5Dnw5
https://pastebin.com/xDwmcBVp
https://pastebin.com/vYi6rTmN

收起阅读 »

如何设置APP内全局字体大小

问题现象
在文本量多而杂的场景下,单独给每个Text文本设置字体大小效率不高,有什么方法能够设置APP内的全局字体大小?以便统一设置字体大小,提高效率。

背景知识
动态属性是动态设置组件的属性,支持开发者在属性设置时使用if/else语法,且根据需要使用多态样式设置属性。其属性方法AttributeModifier支持在当前组件上动态设置属性方法。
Text文本组件中的fontSize属性可以设置字体大小,fontFamily属性可以设置字体列表。
接口ApplicationContext.setFontSizeScale设置应用字体大小缩放比例。仅支持主线程调用。当应用字体设置为跟随系统时,通过配置configuration标签就可以设置应用字体大小跟随系统变化的比例。
解决方案
方案一:通过preferences调节应用内全局字体大小。
自定义PreferencesUtil类,通过其提供的创建、保存和查询的数据,将读取到的数据保存到页面带有@State的变量中,通过状态变量对文本字体大小进行设置。具体应用可以参考官网使用preferences实现应用内字体大小调节功能。

方案二:通过动态属性设置全局字体大小。
使用动态属性,自定义class实现AttributeModifier接口,设定好Text需要的fontSize后在页面调用,实现字体大小统一修改。

class MyTextModifier implements AttributeModifier<TextAttribute> {
public isDark: boolean = false;

applyNormalAttribute(instance: TextAttribute): void {
if (this.isDark) {
instance.fontSize(100);
} else {
instance.fontSize(50);
}
}
}

@Entry
@Component
struct Index {
private message: string = 'test';
@State modifier: MyTextModifier = new MyTextModifier();

build() {
Column() {
Text(this.message)
.attributeModifier(this.modifier)
.onClick(() => {
this.modifier.isDark = !this.modifier.isDark;
});
Blank();
Text(this.message)
.attributeModifier(this.modifier)
.onClick(() => {
this.modifier.isDark = !this.modifier.isDark;
});
}
.padding(24)
.width('100%')
.height('100%');
}
}
https://pastebin.com/zv1bEjfh
https://pastebin.com/Z7CHKjjW
https://pastebin.com/73NZB1fg
https://pastebin.com/zb96CYYT
https://pastebin.com/TVSbCuk0
https://pastebin.com/PQH1YKrR
https://pastebin.com/bv5qqT8j
https://pastebin.com/WpenkS9J
https://pastebin.com/jkgzXhCX
https://pastebin.com/pT7xkBGP
https://pastebin.com/ppyQuy1c
https://pastebin.com/LdT3rmMu
https://pastebin.com/EVTt0G5t
https://pastebin.com/Lv4a1muV
https://pastebin.com/zmTAWL2U
https://pastebin.com/QdxecLbK
https://pastebin.com/3kZ5NwrU
https://pastebin.com/TPJsBatd
https://pastebin.com/WfhnNpFV
https://pastebin.com/SAmdt79t
https://pastebin.com/JZ4KvEWL
https://pastebin.com/uGcyWALB
https://pastebin.com/MEq4JbqR
https://pastebin.com/3ucqcbc6
https://pastebin.com/3cDtaAwF
https://pastebin.com/yzn2GGYf
https://pastebin.com/RTjPyJNX
https://pastebin.com/SQDC9M1E
https://pastebin.com/xcasG7xf
https://pastebin.com/zZfPyQY3
https://pastebin.com/RNzWpA4q
https://pastebin.com/8pufepjf
https://pastebin.com/vxDSuXem
https://pastebin.com/HP4y0h1f
https://pastebin.com/46jYNt7j
https://pastebin.com/YUvcKeAw
https://pastebin.com/wGfKDBZe
https://pastebin.com/bccZqgn7
https://pastebin.com/cBisnNN3
https://pastebin.com/4WFqkrmi
https://pastebin.com/fc7jp78E
https://pastebin.com/yjptCxY9
https://pastebin.com/2D6R3N5s
https://pastebin.com/KvR4cDki
https://pastebin.com/Vk1Rk7uj
https://pastebin.com/JEiNNYpi
https://pastebin.com/PyzV38G0
https://pastebin.com/KbzwD20r
https://pastebin.com/ViKS1JgQ
https://pastebin.com/5YcYwqDE
https://pastebin.com/ZFMU4ndk
https://pastebin.com/0Ex2wTma
https://pastebin.com/pQ7MD6DZ
https://pastebin.com/UCTHHnqH
https://pastebin.com/sDEyLgsy
https://pastebin.com/Z7Wrv3qq
https://pastebin.com/qb5YncFh
https://pastebin.com/uibzH23E
https://pastebin.com/4ykQaXqk
https://pastebin.com/K5mKVf1G
https://pastebin.com/xYEugHiP
https://pastebin.com/z8JzmxYY
https://pastebin.com/0UXR57Di
https://pastebin.com/0hmA61Hd
https://pastebin.com/tPkKjDC1
https://pastebin.com/v0ra9Mya
https://pastebin.com/puHjxuHP
https://pastebin.com/fYS5Dnw5
https://pastebin.com/xDwmcBVp
https://pastebin.com/vYi6rTmN
https://pastebin.com/yx39A9W3
https://pastebin.com/YjGpgumr
https://pastebin.com/Yr3NDGsw
https://pastebin.com/mHQDdmYW
https://pastebin.com/zQj53Zez
https://pastebin.com/BPjewhxX
https://pastebin.com/zQ0vrSFY
https://pastebin.com/1w62VYp5
https://pastebin.com/h4KEm2mW
https://pastebin.com/fTskMDFx
https://pastebin.com/FmNtGTnb
https://pastebin.com/16dZdmr6
https://pastebin.com/GDKtKnBU
https://pastebin.com/s1CTn9wk
https://pastebin.com/HWayJh7D
https://pastebin.com/sbNvhpjd
https://pastebin.com/8QS7hR6z
https://pastebin.com/BNmr0siT
https://pastebin.com/wSeQ93jQ
https://pastebin.com/mWDHpM97
https://pastebin.com/n95D4DU9
https://pastebin.com/WwyN4MSy
https://pastebin.com/Yy5piny4
https://pastebin.com/M5eG7d97
https://pastebin.com/tecUdChP
https://pastebin.com/YizPCgVe
https://pastebin.com/k2QgxpVx
https://pastebin.com/L874Auw2
https://pastebin.com/i7xaQUHV
https://pastebin.com/6RYNSaMD
https://pastebin.com/EHGryvUF
https://pastebin.com/mBy1dH2W
https://pastebin.com/4Rv7wPLE
https://pastebin.com/
https://pastebin.com/sc89ynXn
https://pastebin.com/BAmNnWPG
https://pastebin.com/KgFLHfXf
https://pastebin.com/LT7WpAkz
https://pastebin.com/F7bhcEZn
https://pastebin.com/Vt71iUie
https://pastebin.com/b6aTG0vH
https://pastebin.com/YkTNEfNW
https://pastebin.com/xZYNrFV9
https://pastebin.com/URiZmFBE
https://pastebin.com/31PwZST4
https://pastebin.com/9zzUgrh1
https://pastebin.com/t5GZ46L5
https://pastebin.com/jnqax73J
https://pastebin.com/s8ancsQ8
https://pastebin.com/RupTptFa
https://pastebin.com/iqVL98RE
https://pastebin.com/m540xPh3
https://pastebin.com/SGt4MpRD
https://pastebin.com/d4CT63kJ
https://pastebin.com/hhPTDEMT
https://pastebin.com/RHTCf9E2
https://pastebin.com/0T6WBFQs
https://pastebin.com/i1UChYJG
https://pastebin.com/m5EmezEN
https://pastebin.com/7da2hn5E
https://pastebin.com/RCSThm9K
https://pastebin.com/HMwehjXj
https://pastebin.com/5rYR3q2t
https://pastebin.com/2hBwYzin
https://pastebin.com/p7QyQegF
https://pastebin.com/9YchUWAp
https://pastebin.com/9QkWjZS8
https://pastebin.com/dKJcBeWU
https://pastebin.com/y2hUEn5k
https://pastebin.com/PjRCfHQV
https://pastebin.com/Zwvh6Gj6
https://pastebin.com/QQYxQzn7
https://pastebin.com/9TPRM0EL
https://pastebin.com/mAX55z1X
https://pastebin.com/NSCC7keU
https://pastebin.com/zxpEz8CT
https://pastebin.com/N4qU4GBi
https://pastebin.com/fMsMLean
https://pastebin.com/Xgq14P8Z
https://pastebin.com/zD7r5kSj
https://pastebin.com/MA8wHsQp
https://pastebin.com/Ww5Sedpx
https://pastebin.com/MH5DNyY1
https://pastebin.com/A8ZR80ix
https://pastebin.com/An6A0kcB
https://pastebin.com/xfZyEP3r
https://pastebin.com/mCRJJG5k
https://pastebin.com/i8pDjjTr
https://pastebin.com/x5EFGiqg
https://pastebin.com/hdGJGHDa
https://pastebin.com/XvLmLTda
https://pastebin.com/URSmHfMQ
https://pastebin.com/AfL6JvxE
https://pastebin.com/2XwNG2Gv
https://pastebin.com/yCggCwQs
https://pastebin.com/vtfpaBVx
https://pastebin.com/e5QbtBdu
https://pastebin.com/xBW2j2u7
https://pastebin.com/EM9mfHFE
https://pastebin.com/YdSsZfrd
https://pastebin.com/29t7hwPk
https://pastebin.com/AzL6dAAr
https://pastebin.com/9DjHEwu4
https://pastebin.com/zsG1FAQ5
https://pastebin.com/n3u3F4FS
https://pastebin.com/hGb4579u
https://pastebin.com/4iVXD2bm
https://pastebin.com/asamK1S5
https://pastebin.com/7bjibNp4
https://pastebin.com/KJaFD1nA
https://pastebin.com/CcD19MmF
https://pastebin.com/rFBHrupt
https://pastebin.com/Kf4zzEZ1
https://pastebin.com/p07Rr3Dg
https://pastebin.com/TzBYBTKd
https://pastebin.com/3mSdSwZc
https://pastebin.com/vD58SSEh
https://pastebin.com/yL5bYn4f
https://pastebin.com/NfsJ1BJa
https://pastebin.com/Dmf05JZi
https://pastebin.com/ZNAR7d19
https://pastebin.com/ni3NfQvW
https://pastebin.com/G7gt0EP1
https://pastebin.com/wej3w4Vi
https://pastebin.com/d602uf7W
https://pastebin.com/Y43ufxnM
https://pastebin.com/iCT3zSXx
https://pastebin.com/T3jA1SUw
https://pastebin.com/n4U1b4jm

继续阅读 »

问题现象
在文本量多而杂的场景下,单独给每个Text文本设置字体大小效率不高,有什么方法能够设置APP内的全局字体大小?以便统一设置字体大小,提高效率。

背景知识
动态属性是动态设置组件的属性,支持开发者在属性设置时使用if/else语法,且根据需要使用多态样式设置属性。其属性方法AttributeModifier支持在当前组件上动态设置属性方法。
Text文本组件中的fontSize属性可以设置字体大小,fontFamily属性可以设置字体列表。
接口ApplicationContext.setFontSizeScale设置应用字体大小缩放比例。仅支持主线程调用。当应用字体设置为跟随系统时,通过配置configuration标签就可以设置应用字体大小跟随系统变化的比例。
解决方案
方案一:通过preferences调节应用内全局字体大小。
自定义PreferencesUtil类,通过其提供的创建、保存和查询的数据,将读取到的数据保存到页面带有@State的变量中,通过状态变量对文本字体大小进行设置。具体应用可以参考官网使用preferences实现应用内字体大小调节功能。

方案二:通过动态属性设置全局字体大小。
使用动态属性,自定义class实现AttributeModifier接口,设定好Text需要的fontSize后在页面调用,实现字体大小统一修改。

class MyTextModifier implements AttributeModifier<TextAttribute> {
public isDark: boolean = false;

applyNormalAttribute(instance: TextAttribute): void {
if (this.isDark) {
instance.fontSize(100);
} else {
instance.fontSize(50);
}
}
}

@Entry
@Component
struct Index {
private message: string = 'test';
@State modifier: MyTextModifier = new MyTextModifier();

build() {
Column() {
Text(this.message)
.attributeModifier(this.modifier)
.onClick(() => {
this.modifier.isDark = !this.modifier.isDark;
});
Blank();
Text(this.message)
.attributeModifier(this.modifier)
.onClick(() => {
this.modifier.isDark = !this.modifier.isDark;
});
}
.padding(24)
.width('100%')
.height('100%');
}
}
https://pastebin.com/zv1bEjfh
https://pastebin.com/Z7CHKjjW
https://pastebin.com/73NZB1fg
https://pastebin.com/zb96CYYT
https://pastebin.com/TVSbCuk0
https://pastebin.com/PQH1YKrR
https://pastebin.com/bv5qqT8j
https://pastebin.com/WpenkS9J
https://pastebin.com/jkgzXhCX
https://pastebin.com/pT7xkBGP
https://pastebin.com/ppyQuy1c
https://pastebin.com/LdT3rmMu
https://pastebin.com/EVTt0G5t
https://pastebin.com/Lv4a1muV
https://pastebin.com/zmTAWL2U
https://pastebin.com/QdxecLbK
https://pastebin.com/3kZ5NwrU
https://pastebin.com/TPJsBatd
https://pastebin.com/WfhnNpFV
https://pastebin.com/SAmdt79t
https://pastebin.com/JZ4KvEWL
https://pastebin.com/uGcyWALB
https://pastebin.com/MEq4JbqR
https://pastebin.com/3ucqcbc6
https://pastebin.com/3cDtaAwF
https://pastebin.com/yzn2GGYf
https://pastebin.com/RTjPyJNX
https://pastebin.com/SQDC9M1E
https://pastebin.com/xcasG7xf
https://pastebin.com/zZfPyQY3
https://pastebin.com/RNzWpA4q
https://pastebin.com/8pufepjf
https://pastebin.com/vxDSuXem
https://pastebin.com/HP4y0h1f
https://pastebin.com/46jYNt7j
https://pastebin.com/YUvcKeAw
https://pastebin.com/wGfKDBZe
https://pastebin.com/bccZqgn7
https://pastebin.com/cBisnNN3
https://pastebin.com/4WFqkrmi
https://pastebin.com/fc7jp78E
https://pastebin.com/yjptCxY9
https://pastebin.com/2D6R3N5s
https://pastebin.com/KvR4cDki
https://pastebin.com/Vk1Rk7uj
https://pastebin.com/JEiNNYpi
https://pastebin.com/PyzV38G0
https://pastebin.com/KbzwD20r
https://pastebin.com/ViKS1JgQ
https://pastebin.com/5YcYwqDE
https://pastebin.com/ZFMU4ndk
https://pastebin.com/0Ex2wTma
https://pastebin.com/pQ7MD6DZ
https://pastebin.com/UCTHHnqH
https://pastebin.com/sDEyLgsy
https://pastebin.com/Z7Wrv3qq
https://pastebin.com/qb5YncFh
https://pastebin.com/uibzH23E
https://pastebin.com/4ykQaXqk
https://pastebin.com/K5mKVf1G
https://pastebin.com/xYEugHiP
https://pastebin.com/z8JzmxYY
https://pastebin.com/0UXR57Di
https://pastebin.com/0hmA61Hd
https://pastebin.com/tPkKjDC1
https://pastebin.com/v0ra9Mya
https://pastebin.com/puHjxuHP
https://pastebin.com/fYS5Dnw5
https://pastebin.com/xDwmcBVp
https://pastebin.com/vYi6rTmN
https://pastebin.com/yx39A9W3
https://pastebin.com/YjGpgumr
https://pastebin.com/Yr3NDGsw
https://pastebin.com/mHQDdmYW
https://pastebin.com/zQj53Zez
https://pastebin.com/BPjewhxX
https://pastebin.com/zQ0vrSFY
https://pastebin.com/1w62VYp5
https://pastebin.com/h4KEm2mW
https://pastebin.com/fTskMDFx
https://pastebin.com/FmNtGTnb
https://pastebin.com/16dZdmr6
https://pastebin.com/GDKtKnBU
https://pastebin.com/s1CTn9wk
https://pastebin.com/HWayJh7D
https://pastebin.com/sbNvhpjd
https://pastebin.com/8QS7hR6z
https://pastebin.com/BNmr0siT
https://pastebin.com/wSeQ93jQ
https://pastebin.com/mWDHpM97
https://pastebin.com/n95D4DU9
https://pastebin.com/WwyN4MSy
https://pastebin.com/Yy5piny4
https://pastebin.com/M5eG7d97
https://pastebin.com/tecUdChP
https://pastebin.com/YizPCgVe
https://pastebin.com/k2QgxpVx
https://pastebin.com/L874Auw2
https://pastebin.com/i7xaQUHV
https://pastebin.com/6RYNSaMD
https://pastebin.com/EHGryvUF
https://pastebin.com/mBy1dH2W
https://pastebin.com/4Rv7wPLE
https://pastebin.com/
https://pastebin.com/sc89ynXn
https://pastebin.com/BAmNnWPG
https://pastebin.com/KgFLHfXf
https://pastebin.com/LT7WpAkz
https://pastebin.com/F7bhcEZn
https://pastebin.com/Vt71iUie
https://pastebin.com/b6aTG0vH
https://pastebin.com/YkTNEfNW
https://pastebin.com/xZYNrFV9
https://pastebin.com/URiZmFBE
https://pastebin.com/31PwZST4
https://pastebin.com/9zzUgrh1
https://pastebin.com/t5GZ46L5
https://pastebin.com/jnqax73J
https://pastebin.com/s8ancsQ8
https://pastebin.com/RupTptFa
https://pastebin.com/iqVL98RE
https://pastebin.com/m540xPh3
https://pastebin.com/SGt4MpRD
https://pastebin.com/d4CT63kJ
https://pastebin.com/hhPTDEMT
https://pastebin.com/RHTCf9E2
https://pastebin.com/0T6WBFQs
https://pastebin.com/i1UChYJG
https://pastebin.com/m5EmezEN
https://pastebin.com/7da2hn5E
https://pastebin.com/RCSThm9K
https://pastebin.com/HMwehjXj
https://pastebin.com/5rYR3q2t
https://pastebin.com/2hBwYzin
https://pastebin.com/p7QyQegF
https://pastebin.com/9YchUWAp
https://pastebin.com/9QkWjZS8
https://pastebin.com/dKJcBeWU
https://pastebin.com/y2hUEn5k
https://pastebin.com/PjRCfHQV
https://pastebin.com/Zwvh6Gj6
https://pastebin.com/QQYxQzn7
https://pastebin.com/9TPRM0EL
https://pastebin.com/mAX55z1X
https://pastebin.com/NSCC7keU
https://pastebin.com/zxpEz8CT
https://pastebin.com/N4qU4GBi
https://pastebin.com/fMsMLean
https://pastebin.com/Xgq14P8Z
https://pastebin.com/zD7r5kSj
https://pastebin.com/MA8wHsQp
https://pastebin.com/Ww5Sedpx
https://pastebin.com/MH5DNyY1
https://pastebin.com/A8ZR80ix
https://pastebin.com/An6A0kcB
https://pastebin.com/xfZyEP3r
https://pastebin.com/mCRJJG5k
https://pastebin.com/i8pDjjTr
https://pastebin.com/x5EFGiqg
https://pastebin.com/hdGJGHDa
https://pastebin.com/XvLmLTda
https://pastebin.com/URSmHfMQ
https://pastebin.com/AfL6JvxE
https://pastebin.com/2XwNG2Gv
https://pastebin.com/yCggCwQs
https://pastebin.com/vtfpaBVx
https://pastebin.com/e5QbtBdu
https://pastebin.com/xBW2j2u7
https://pastebin.com/EM9mfHFE
https://pastebin.com/YdSsZfrd
https://pastebin.com/29t7hwPk
https://pastebin.com/AzL6dAAr
https://pastebin.com/9DjHEwu4
https://pastebin.com/zsG1FAQ5
https://pastebin.com/n3u3F4FS
https://pastebin.com/hGb4579u
https://pastebin.com/4iVXD2bm
https://pastebin.com/asamK1S5
https://pastebin.com/7bjibNp4
https://pastebin.com/KJaFD1nA
https://pastebin.com/CcD19MmF
https://pastebin.com/rFBHrupt
https://pastebin.com/Kf4zzEZ1
https://pastebin.com/p07Rr3Dg
https://pastebin.com/TzBYBTKd
https://pastebin.com/3mSdSwZc
https://pastebin.com/vD58SSEh
https://pastebin.com/yL5bYn4f
https://pastebin.com/NfsJ1BJa
https://pastebin.com/Dmf05JZi
https://pastebin.com/ZNAR7d19
https://pastebin.com/ni3NfQvW
https://pastebin.com/G7gt0EP1
https://pastebin.com/wej3w4Vi
https://pastebin.com/d602uf7W
https://pastebin.com/Y43ufxnM
https://pastebin.com/iCT3zSXx
https://pastebin.com/T3jA1SUw
https://pastebin.com/n4U1b4jm

收起阅读 »

如何混用Navigation和router实现路由导航

问题现象
如何实现Navigation和router的混用?

背景知识
router:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、同应用内的某个页面替换当前页面、返回上一页面或指定的页面等。
Navigation:用于实现Navigation页面(NavDestination)间的跳转,支持在不同Navigation页面间传递参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器。
解决方案
对于router跳转到的页面需要使用Navigation作为根容器,才能在这个页面跳转到下个NavDestination页面。这是因为router跳转的是page页面,而NavDestination是Navigation的子组件,二者层次不同。以下为Navigation和router混用的三种常见场景。

场景一
Navigation页面与router页面间的跳转,如:入口页面->NavPageOne->RouterPageOne->NavPageTwo。该混用场景常见于“全局导航 局部导航”的页面设计,例如首页到隐私模块页面等。

使用router跳转到RouterPageOne,RouterPageOne使用Navigation作为根容器跳转到NavPageTwo,这里RouterPageOne的Navigation和第一个Navigation相互独立,都有各自的路由栈,互不影响。开发者需参考系统路由表配置Navigation路由,配置说明附在本文末尾。

入口页面代码如下:需在resources/base/profile/main_pages.json配置,参考pages标签。

https://pastebin.com/T0qjEdhR
https://pastebin.com/9j2xhYmA
https://pastebin.com/y3qDY8zJ
https://pastebin.com/ACGMG4Ja
https://pastebin.com/hMkaAgnr
https://pastebin.com/DKCau8pY
https://pastebin.com/KMR7ahzA
https://pastebin.com/tJvRKc4N
https://pastebin.com/NVEwG9uZ
https://pastebin.com/EPxLpA6i
https://pastebin.com/FK8MaSeV
https://pastebin.com/CytN6Qcs
https://pastebin.com/q7ugna3X
https://pastebin.com/EjiwDGkT
https://pastebin.com/nsPUWMri
https://pastebin.com/SbiDFTm9
https://pastebin.com/mNrgbF0F
https://pastebin.com/x6eZ1ygU
https://pastebin.com/PBL5tVYf
https://pastebin.com/jX1mX3T0
https://pastebin.com/WXYZUzhC
https://pastebin.com/UDyfqTN0
https://pastebin.com/wXk3dYJG
https://pastebin.com/dSzW4S5n
https://pastebin.com/iud6XZSS
https://pastebin.com/scHYNFMf
https://pastebin.com/AeHxaU7w
https://pastebin.com/H7Au1Apz
https://pastebin.com/DRCNjV3v
https://pastebin.com/7gv7ubWE
https://pastebin.com/SZdUViky
https://pastebin.com/cp63TTTg
https://pastebin.com/fzCVAvCF
https://pastebin.com/jJ4Tgfcm
https://pastebin.com/gKUBHbAx
https://pastebin.com/SHxpbQus
https://pastebin.com/PUgXw4SZ
https://pastebin.com/kQudDe6v
https://pastebin.com/Q8kzX5QG
https://pastebin.com/gJTuU53X
https://pastebin.com/tgUM3kmm
https://pastebin.com/XSzcmndG
https://pastebin.com/STYGr8HQ
https://pastebin.com/Cke4tPN7
https://pastebin.com/G9vGA4VD
https://pastebin.com/9Qdn0wFX
https://pastebin.com/fNK8TZBi
https://pastebin.com/BaX3LH8U
https://pastebin.com/ZZQcNB1N
https://pastebin.com/X9RbKjBw
https://pastebin.com/KAJYpJte
https://pastebin.com/vnKJfsX4
https://pastebin.com/Kd1Xm439
https://pastebin.com/VEBbiMGW
https://pastebin.com/asWsvVUg
https://pastebin.com/bADNrv39
https://pastebin.com/dbE231R1
https://pastebin.com/urCZ7b7n
https://pastebin.com/rJUkQLTy
https://pastebin.com/0WJW2iZm
https://pastebin.com/MYR6YbuM
https://pastebin.com/FvqPxU7T
https://pastebin.com/RHgL2GWD
https://pastebin.com/zfUdLzmn
https://pastebin.com/3RiMytue
https://pastebin.com/8Q0gji6p
https://pastebin.com/bURMaJ6s
https://pastebin.com/vSEEbx6q
https://pastebin.com/sxF2ewtt
https://pastebin.com/qS8u7xGj
https://pastebin.com/Pi4zhEac
https://pastebin.com/3BWfDUkr
https://pastebin.com/Mfvfq5a1
https://pastebin.com/8GucH56m
https://pastebin.com/3g8rK644
https://pastebin.com/86tms6GZ
https://pastebin.com/6PeE5NJ9
https://pastebin.com/zQZMR3uQ
https://pastebin.com/ZzKRebtY
https://pastebin.com/RXSvMK0S
https://pastebin.com/EJkW2AzU
https://pastebin.com/HV1WwkJr
https://pastebin.com/3bj7RrVR
https://pastebin.com/5CgX4SEE
https://pastebin.com/z8MPVtnX
https://pastebin.com/UX0Am16Z
https://pastebin.com/SNgYcfe9
https://pastebin.com/5qiLcbAd
https://pastebin.com/XZcpNxKU
https://pastebin.com/g1eR9CPP
https://pastebin.com/uJeVWMAd
https://pastebin.com/gRjHa4ex
https://pastebin.com/EBarihNi
https://pastebin.com/sMg2cGSe
https://pastebin.com/Z8MPPgLr
https://pastebin.com/LyUNjkvn
https://pastebin.com/S3eeuU8M
https://pastebin.com/e1bYnW5j
https://pastebin.com/QYdf4Mv9
https://pastebin.com/mQJQHVzW
https://pastebin.com/andd0da6
https://pastebin.com/PeTHqrxq
https://pastebin.com/P6gk0Tj9
https://pastebin.com/QQ2dxGdL
https://pastebin.com/E2ibKkNu
https://pastebin.com/YC0sK7jB
https://pastebin.com/1EYYscyi
https://pastebin.com/FRXXxWwg
https://pastebin.com/ZXXi9xM1
https://pastebin.com/0izhXiFJ
https://pastebin.com/3sPJWA9h
https://pastebin.com/C9s6zMRc
https://pastebin.com/92djJXhJ
https://pastebin.com/rxLq7fK7
https://pastebin.com/1jjxq2y7
https://pastebin.com/RQuravmU
https://pastebin.com/0HC8tnCM
https://pastebin.com/qV828LM2
https://pastebin.com/KsTnZQKK
https://pastebin.com/0DGQvkf5
https://pastebin.com/ZpSpZ1ad
https://pastebin.com/RyCxRXXc
https://pastebin.com/FNT47tiG
https://pastebin.com/M9kRCjFZ
https://pastebin.com/5FYBqVba
https://pastebin.com/tc3AxKPP
https://pastebin.com/cmEzD2cm
https://pastebin.com/G8epzgNn
https://pastebin.com/DvkkCE48
https://pastebin.com/qQn5nr1T
https://pastebin.com/LdRyg3fJ
https://pastebin.com/bhMmk2QE
https://pastebin.com/Ezp4M2mU
https://pastebin.com/pgc1FurG
https://pastebin.com/Ct29GCzi
https://pastebin.com/X2SibK2k
https://pastebin.com/cPyP1sGv
https://pastebin.com/BpRi9nQ3
https://pastebin.com/PuEQk2D5
https://pastebin.com/LqQtd4xC
https://pastebin.com/0m9SGErQ
https://pastebin.com/2TjekbUJ
https://pastebin.com/LCfheMsR
https://pastebin.com/KBGaUPqA
https://pastebin.com/adQ498ic
https://pastebin.com/0wuucsZ0
https://pastebin.com/5p9vtftU
https://pastebin.com/NBdsXhQi
https://pastebin.com/N1rgsNYD
https://pastebin.com/pNyDCENQ
https://pastebin.com/9cDP15GL
https://pastebin.com/F2a621ab
https://pastebin.com/aJ9PzUyf
https://pastebin.com/P5UjJuY1
https://pastebin.com/Sn9J5rLr
https://pastebin.com/3rQRmumG
https://pastebin.com/QNSSbDRg
https://pastebin.com/csLrWKhY
https://pastebin.com/Ceg1c07i
https://pastebin.com/hwKtUzVf
https://pastebin.com/WzAyiC5N
https://pastebin.com/qDteic1q
https://pastebin.com/tfYq4WsV
https://pastebin.com/bRqVufy3
https://pastebin.com/93ex9FyT
https://pastebin.com/stpFZB0f
https://pastebin.com/GAm5Qri7
https://pastebin.com/a5xG0wd1
https://pastebin.com/2J1Hiqvm
https://pastebin.com/gh7CZTcv
https://pastebin.com/XLdTknfz
https://pastebin.com/CUjaXXKR
https://pastebin.com/RHVccDjS
https://pastebin.com/Fyc2a9PC
https://pastebin.com/Y7QzDaEQ
https://pastebin.com/30AHcs66
https://pastebin.com/76dUwnrz
https://pastebin.com/Eefce3y4
https://pastebin.com/rgUGwQR4
https://pastebin.com/b1wjhncJ
https://pastebin.com/ReNE2D36
https://pastebin.com/vyJXbMcD
https://pastebin.com/vYKvCKch
https://pastebin.com/XfHEyEgJ
https://pastebin.com/v8zRpCdK
https://pastebin.com/fFVAe7NL
https://pastebin.com/USryqJTr
https://pastebin.com/yAc9niyy
https://pastebin.com/nkJB8XRC
https://pastebin.com/PSqZGpwq
https://pastebin.com/ZD0VWb9t
https://pastebin.com/5YsLCMSB
https://pastebin.com/yXkvdiH1
https://pastebin.com/4YzAMWHC
https://pastebin.com/QaVh0Srp
https://pastebin.com/d9Yjsr9D
https://pastebin.com/4rKTisyH
https://pastebin.com/jGe97xbT
https://pastebin.com/KCFPzysq
https://pastebin.com/JXVdBeaz

继续阅读 »

问题现象
如何实现Navigation和router的混用?

背景知识
router:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、同应用内的某个页面替换当前页面、返回上一页面或指定的页面等。
Navigation:用于实现Navigation页面(NavDestination)间的跳转,支持在不同Navigation页面间传递参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。Navigation是路由导航的根视图容器,一般作为页面(@Entry)的根容器。
解决方案
对于router跳转到的页面需要使用Navigation作为根容器,才能在这个页面跳转到下个NavDestination页面。这是因为router跳转的是page页面,而NavDestination是Navigation的子组件,二者层次不同。以下为Navigation和router混用的三种常见场景。

场景一
Navigation页面与router页面间的跳转,如:入口页面->NavPageOne->RouterPageOne->NavPageTwo。该混用场景常见于“全局导航 局部导航”的页面设计,例如首页到隐私模块页面等。

使用router跳转到RouterPageOne,RouterPageOne使用Navigation作为根容器跳转到NavPageTwo,这里RouterPageOne的Navigation和第一个Navigation相互独立,都有各自的路由栈,互不影响。开发者需参考系统路由表配置Navigation路由,配置说明附在本文末尾。

入口页面代码如下:需在resources/base/profile/main_pages.json配置,参考pages标签。

https://pastebin.com/T0qjEdhR
https://pastebin.com/9j2xhYmA
https://pastebin.com/y3qDY8zJ
https://pastebin.com/ACGMG4Ja
https://pastebin.com/hMkaAgnr
https://pastebin.com/DKCau8pY
https://pastebin.com/KMR7ahzA
https://pastebin.com/tJvRKc4N
https://pastebin.com/NVEwG9uZ
https://pastebin.com/EPxLpA6i
https://pastebin.com/FK8MaSeV
https://pastebin.com/CytN6Qcs
https://pastebin.com/q7ugna3X
https://pastebin.com/EjiwDGkT
https://pastebin.com/nsPUWMri
https://pastebin.com/SbiDFTm9
https://pastebin.com/mNrgbF0F
https://pastebin.com/x6eZ1ygU
https://pastebin.com/PBL5tVYf
https://pastebin.com/jX1mX3T0
https://pastebin.com/WXYZUzhC
https://pastebin.com/UDyfqTN0
https://pastebin.com/wXk3dYJG
https://pastebin.com/dSzW4S5n
https://pastebin.com/iud6XZSS
https://pastebin.com/scHYNFMf
https://pastebin.com/AeHxaU7w
https://pastebin.com/H7Au1Apz
https://pastebin.com/DRCNjV3v
https://pastebin.com/7gv7ubWE
https://pastebin.com/SZdUViky
https://pastebin.com/cp63TTTg
https://pastebin.com/fzCVAvCF
https://pastebin.com/jJ4Tgfcm
https://pastebin.com/gKUBHbAx
https://pastebin.com/SHxpbQus
https://pastebin.com/PUgXw4SZ
https://pastebin.com/kQudDe6v
https://pastebin.com/Q8kzX5QG
https://pastebin.com/gJTuU53X
https://pastebin.com/tgUM3kmm
https://pastebin.com/XSzcmndG
https://pastebin.com/STYGr8HQ
https://pastebin.com/Cke4tPN7
https://pastebin.com/G9vGA4VD
https://pastebin.com/9Qdn0wFX
https://pastebin.com/fNK8TZBi
https://pastebin.com/BaX3LH8U
https://pastebin.com/ZZQcNB1N
https://pastebin.com/X9RbKjBw
https://pastebin.com/KAJYpJte
https://pastebin.com/vnKJfsX4
https://pastebin.com/Kd1Xm439
https://pastebin.com/VEBbiMGW
https://pastebin.com/asWsvVUg
https://pastebin.com/bADNrv39
https://pastebin.com/dbE231R1
https://pastebin.com/urCZ7b7n
https://pastebin.com/rJUkQLTy
https://pastebin.com/0WJW2iZm
https://pastebin.com/MYR6YbuM
https://pastebin.com/FvqPxU7T
https://pastebin.com/RHgL2GWD
https://pastebin.com/zfUdLzmn
https://pastebin.com/3RiMytue
https://pastebin.com/8Q0gji6p
https://pastebin.com/bURMaJ6s
https://pastebin.com/vSEEbx6q
https://pastebin.com/sxF2ewtt
https://pastebin.com/qS8u7xGj
https://pastebin.com/Pi4zhEac
https://pastebin.com/3BWfDUkr
https://pastebin.com/Mfvfq5a1
https://pastebin.com/8GucH56m
https://pastebin.com/3g8rK644
https://pastebin.com/86tms6GZ
https://pastebin.com/6PeE5NJ9
https://pastebin.com/zQZMR3uQ
https://pastebin.com/ZzKRebtY
https://pastebin.com/RXSvMK0S
https://pastebin.com/EJkW2AzU
https://pastebin.com/HV1WwkJr
https://pastebin.com/3bj7RrVR
https://pastebin.com/5CgX4SEE
https://pastebin.com/z8MPVtnX
https://pastebin.com/UX0Am16Z
https://pastebin.com/SNgYcfe9
https://pastebin.com/5qiLcbAd
https://pastebin.com/XZcpNxKU
https://pastebin.com/g1eR9CPP
https://pastebin.com/uJeVWMAd
https://pastebin.com/gRjHa4ex
https://pastebin.com/EBarihNi
https://pastebin.com/sMg2cGSe
https://pastebin.com/Z8MPPgLr
https://pastebin.com/LyUNjkvn
https://pastebin.com/S3eeuU8M
https://pastebin.com/e1bYnW5j
https://pastebin.com/QYdf4Mv9
https://pastebin.com/mQJQHVzW
https://pastebin.com/andd0da6
https://pastebin.com/PeTHqrxq
https://pastebin.com/P6gk0Tj9
https://pastebin.com/QQ2dxGdL
https://pastebin.com/E2ibKkNu
https://pastebin.com/YC0sK7jB
https://pastebin.com/1EYYscyi
https://pastebin.com/FRXXxWwg
https://pastebin.com/ZXXi9xM1
https://pastebin.com/0izhXiFJ
https://pastebin.com/3sPJWA9h
https://pastebin.com/C9s6zMRc
https://pastebin.com/92djJXhJ
https://pastebin.com/rxLq7fK7
https://pastebin.com/1jjxq2y7
https://pastebin.com/RQuravmU
https://pastebin.com/0HC8tnCM
https://pastebin.com/qV828LM2
https://pastebin.com/KsTnZQKK
https://pastebin.com/0DGQvkf5
https://pastebin.com/ZpSpZ1ad
https://pastebin.com/RyCxRXXc
https://pastebin.com/FNT47tiG
https://pastebin.com/M9kRCjFZ
https://pastebin.com/5FYBqVba
https://pastebin.com/tc3AxKPP
https://pastebin.com/cmEzD2cm
https://pastebin.com/G8epzgNn
https://pastebin.com/DvkkCE48
https://pastebin.com/qQn5nr1T
https://pastebin.com/LdRyg3fJ
https://pastebin.com/bhMmk2QE
https://pastebin.com/Ezp4M2mU
https://pastebin.com/pgc1FurG
https://pastebin.com/Ct29GCzi
https://pastebin.com/X2SibK2k
https://pastebin.com/cPyP1sGv
https://pastebin.com/BpRi9nQ3
https://pastebin.com/PuEQk2D5
https://pastebin.com/LqQtd4xC
https://pastebin.com/0m9SGErQ
https://pastebin.com/2TjekbUJ
https://pastebin.com/LCfheMsR
https://pastebin.com/KBGaUPqA
https://pastebin.com/adQ498ic
https://pastebin.com/0wuucsZ0
https://pastebin.com/5p9vtftU
https://pastebin.com/NBdsXhQi
https://pastebin.com/N1rgsNYD
https://pastebin.com/pNyDCENQ
https://pastebin.com/9cDP15GL
https://pastebin.com/F2a621ab
https://pastebin.com/aJ9PzUyf
https://pastebin.com/P5UjJuY1
https://pastebin.com/Sn9J5rLr
https://pastebin.com/3rQRmumG
https://pastebin.com/QNSSbDRg
https://pastebin.com/csLrWKhY
https://pastebin.com/Ceg1c07i
https://pastebin.com/hwKtUzVf
https://pastebin.com/WzAyiC5N
https://pastebin.com/qDteic1q
https://pastebin.com/tfYq4WsV
https://pastebin.com/bRqVufy3
https://pastebin.com/93ex9FyT
https://pastebin.com/stpFZB0f
https://pastebin.com/GAm5Qri7
https://pastebin.com/a5xG0wd1
https://pastebin.com/2J1Hiqvm
https://pastebin.com/gh7CZTcv
https://pastebin.com/XLdTknfz
https://pastebin.com/CUjaXXKR
https://pastebin.com/RHVccDjS
https://pastebin.com/Fyc2a9PC
https://pastebin.com/Y7QzDaEQ
https://pastebin.com/30AHcs66
https://pastebin.com/76dUwnrz
https://pastebin.com/Eefce3y4
https://pastebin.com/rgUGwQR4
https://pastebin.com/b1wjhncJ
https://pastebin.com/ReNE2D36
https://pastebin.com/vyJXbMcD
https://pastebin.com/vYKvCKch
https://pastebin.com/XfHEyEgJ
https://pastebin.com/v8zRpCdK
https://pastebin.com/fFVAe7NL
https://pastebin.com/USryqJTr
https://pastebin.com/yAc9niyy
https://pastebin.com/nkJB8XRC
https://pastebin.com/PSqZGpwq
https://pastebin.com/ZD0VWb9t
https://pastebin.com/5YsLCMSB
https://pastebin.com/yXkvdiH1
https://pastebin.com/4YzAMWHC
https://pastebin.com/QaVh0Srp
https://pastebin.com/d9Yjsr9D
https://pastebin.com/4rKTisyH
https://pastebin.com/jGe97xbT
https://pastebin.com/KCFPzysq
https://pastebin.com/JXVdBeaz

收起阅读 »

云打包次数限制,除了账号次数限制,还有电脑限制 吃相也太难看了

云端打包发布常见问题

吃相也太难看了!
账号次数限制 ok 我承认我今天打包次数很多 但是 测试插件兼容性就是有问题要一直测啊
特意注册了一个新账号测试插件功能
结果又说本电脑打包太多次了,那就一开始就提示本电脑打包太多次了啊
测试插件有问题就是要调试很多次啊
我也不是恶意的浪费资源
真的很生气 操作半天还是不行
就是让花钱打包 一开始就说清楚啊

继续阅读 »

吃相也太难看了!
账号次数限制 ok 我承认我今天打包次数很多 但是 测试插件兼容性就是有问题要一直测啊
特意注册了一个新账号测试插件功能
结果又说本电脑打包太多次了,那就一开始就提示本电脑打包太多次了啊
测试插件有问题就是要调试很多次啊
我也不是恶意的浪费资源
真的很生气 操作半天还是不行
就是让花钱打包 一开始就说清楚啊

收起阅读 »

Uni-App iOS 上架全流程|Windows(Win7/10/11)免 Mac 制作 P12 证书 + 描述文件 + IPA 上传完整教程

ipa Appstore上传 iOS打包 Apple证书 iOS证书

前言
做 Uni-App 开发的团队大多以 Windows 电脑为主,传统 iOS 上架必须依赖 Mac 电脑,通过钥匙串生成 CSR、制作 P12 发布证书、创建 mobileprovision 描述文件,再用 Xcode/Transporter 上传 IPA,硬件成本高、多账号极易触发苹果 3.2 (f) 关联风控批量封号。
很多中小团队没有 Mac 设备,虚拟机隔离又存在底层设备指纹泄露、卡顿超时、隐性账号关联等致命缺陷;而iOSUploader完美解决痛点,全 Windows 兼容(Win7/8/10/11),仅 45.2MB 轻量化工具,
无需 Mac、无需虚拟机,一站式完成 Bundle ID 创建、P12 证书生成、描述文件制作、HBuilderX 云打包 IPA 分片上传、App Store 后台元数据管理,同时内置独立隔离环境,规避苹果多账号关联封号风险。

官网地址:https://iosuploader.xinxishehui.com/

核心优势:
全 Windows 兼容,最低支持 Win7 老旧办公电脑;
纯软件隔离,斩断设备 / 网络指纹,规避 3.2 (f) 批量封号;
全程不用 Apple ID 密码,仅 P8 密钥 API 授权,杜绝账号泄露;
一站式证书、Bundle ID、设备 UDID、描述文件管理;
直接上传 IPA 至 App Store Connect,替代 Xcode、Transporter;
批量管理多开发者账号,适配 UniApp、Flutter 跨平台项目。

**一、前期准备工作

  1. 基础环境**
    Windows 系统:Win7/Win8/Win10/Win11 32/64 位均可;
    下载 iOSUploader v2.1.3,大小 45.2MB,解压直接运行无需安装;
    有效苹果开发者付费账号(个人 / 企业账号,免费账号无法上架 App Store);
    Uni-App 项目(HBuilderX 开发完成,manifest.json 提前规划 Bundle ID);
    提前获取 App Store Connect API 三要素:Issuer ID、Key ID、P8 密钥文件(全程免账号密码登录)。
  2. 提前获取 P8 密钥(关键,免 Apple ID 登录)
    登录 App Store Connect → 用户和访问 → API 密钥;
    点击「+」新建密钥,命名自定义,权限选 App 管理员;
    生成后仅一次下载 AuthKey_xxx.p8 文件,妥善保存;
    复制页面上方 Issuer ID、列表内 Key ID,填入 iOSUploader 设置面板;
    优势:不用输入 Apple ID 与登录密码,多人协作不会泄露账号,大幅降低 3.2 (f) 违规关联风险。

二、Windows 端用 iOSUploader 创建 Bundle ID(应用唯一包名)
Bundle ID 是 UniApp iOS 应用唯一标识,证书、描述文件、打包必须保持完全一致,传统操作需登录苹果开发者网页,iOSUploader 内置可视化创建面板:
打开 iOSUploader,左侧菜单栏切换「Bundle ID 管理」;
点击「创建 Bundle」,填写名称、自定义包名(格式:com. 公司名。项目名,例:com.xxx.uniappshop);
按需勾选 App 权限服务:推送通知、Apple 登录、iCloud、支付、NFC、Game Center 等 UniApp 所需能力;
确认创建,工具自动同步至苹果开发者后台,列表可查看、管理所有 Bundle ID;
复制 Bundle ID,保存至 HBuilderX,后续打包统一填写。

三、Windows 无 Mac 生成 P12 发布证书(打包必备签名文件)
传统 Mac 流程:钥匙串生成 CSR 证书签名请求→开发者后台创建证书→导出 P12,Windows 无钥匙串无法操作,iOSUploader 内置证书生成引擎,一步导出.p12 文件:
步骤 1:进入证书管理面板
左侧菜单「证书管理」→「创建证书」,选择证书类型:
iOS App Development:真机测试、TestFlight 内测;
iOS Distribution(App Store):正式上架打包,本文上架选此项。
步骤 2:生成并导出 P12 文件
填写证书名称,设置 P12 加密密码(打包时必须填写,牢记);
工具自动生成 CSR 并提交苹果服务器,无需手动操作;
创建成功后,本地导出.p12证书文件,单独存放;
工具列表可加载、查看所有证书过期时间,支持批量管理多账号证书;
注意:单个开发者账号最多 3 个发布证书,旧证书无用可直接在工具内删除释放名额。

四、Windows 制作.mobileprovision 描述文件
描述文件绑定 Bundle ID+P12 证书,是 UniApp 云打包签名核心文件,分开发 / 发布两类:
iOSUploader 左侧「描述文件管理」→「创建描述文件」;
类型选择:App Store(发布上架);
选择上一步创建的 Bundle ID,勾选刚生成的 Distribution 发布证书;
自定义描述文件名称,确认生成;
下载.mobileprovision描述文件保存本地;
开发测试版额外勾选设备 UDID,可在工具「设备管理」批量录入测试机 UDID。

五、HBuilderX Uni-App 云打包 IPA(Windows 全程操作)

无需 Mac 本地编译,DCloud 云打包直接产出 IPA 安装包:
HBuilderX 打开 UniApp 项目,顶部菜单:发行 → 原生 App - 云打包 → iOS;
打包参数配置:
应用包名(Bundle ID):与 iOSUploader 创建的包名完全一致;
版本号、build 内部版本号按需填写;
证书选择「自有证书」,上传 Windows 导出的.p12文件,输入 P12 加密密码;
上传对应.mobileprovision描述文件;
勾选应用图标、启动图,确认打包;
等待云端编译完成,下载生成的.ipa安装包到 Windows 本地。

六、iOSUploader Windows 上传 IPA 至 App Store Connect(免 Mac 上传)
摒弃 Xcode、Transporter 仅 Mac 可用限制,单台 Win7 电脑即可分片上传 IPA,自带防关联隔离通道:
打开 iOSUploader「上传管理」,顶部设置填入提前准备的 Issuer ID、Key ID、P8 证书路径,保存 API 授权;
点击「选择 IPA」,选中 HBuilderX 下载的 ipa 文件;
工具自动分片上传(超大文件分块传输,断点续传),实时显示上传日志;
上传完成自动创建 App Store 构建版本,无需登录网页后台;
配套功能:
截图管理:批量上传各尺寸 iPhone/iPad 截图,支持多语言;
应用元数据编辑:简介、关键词、销售地区、价格、年龄分级;
审核消息中心:查看苹果官方留言、回复审核问题、管理附件;
批量管理多应用、多账号切换,每个窗口独立隔离环境,杜绝账号关联。

七、关键:规避苹果 3.2 (f) 多账号关联封号(iOSUploader 核心价值)
大量 UniApp 多项目团队踩坑:同一台电脑、同一网络操作多个苹果开发者账号,被苹果风控判定环境关联,触发 3.2 (f) 条款连锁封号,所有账号应用下架、收益冻结、申诉成功率极低。
传统方案短板对比
表格
方案 成本 风控风险 Windows 适配
多台 Mac 物理隔离 极高,设备折旧运维贵 共用网络仍存在关联风险 不支持
Windows 虚拟机 高,占用大量内存硬盘 底层设备标识泄露,批量封号频发 卡顿、上传超时
iOSUploader 纯软件隔离 极低,单台电脑管理上百账号 独立隔离环境,无硬件指纹交叉 Win7 全兼容
工具防关联机制
独立隔离上传通道,不携带本机硬件、网卡、系统缓存信息;
多开工具窗口,每个账号独立运行环境,数据完全隔离;
API P8 密钥授权,全程不登录 Apple ID,消除账号登录轨迹关联;
上传、证书、Bundle ID 操作无统一设备指纹留痕,规避风控追溯链路。

九、常见报错排查(Windows 免 Mac 流程高频问题)
云打包签名失败:P12 密码错误、Bundle ID 与描述文件不匹配、证书过期;
IPA 上传失败:P8 密钥失效(重新生成下载)、网络波动(工具支持分片续传);
账号关联标记:停止共用虚拟机 / 旧上传工具,切换 iOSUploader 独立隔离窗口操作;
Win7 运行异常:关闭系统防火墙兼容拦截,解压工具至纯英文路径。

结语
对于全部使用 Windows 开发 UniApp 的团队,iOSUploader 彻底打破「iOS 上架必须买 Mac」的行业固有认知,从证书制作、描述文件生成、云打包到 IPA 上传、应用后台管理实现全流程 Windows 闭环,最低老旧 Win7 电脑即可运行。同时依托软件级账号隔离能力,从根源规避苹果 3.2 (f) 关联封号风险,大幅降低硬件采购与账号资产损失成本,是 UniApp、Flutter 跨平台开发者无 Mac 上架 iOS 的刚需工具。
工具官网:https://iosuploader.xinxishehui.com/

继续阅读 »

前言
做 Uni-App 开发的团队大多以 Windows 电脑为主,传统 iOS 上架必须依赖 Mac 电脑,通过钥匙串生成 CSR、制作 P12 发布证书、创建 mobileprovision 描述文件,再用 Xcode/Transporter 上传 IPA,硬件成本高、多账号极易触发苹果 3.2 (f) 关联风控批量封号。
很多中小团队没有 Mac 设备,虚拟机隔离又存在底层设备指纹泄露、卡顿超时、隐性账号关联等致命缺陷;而iOSUploader完美解决痛点,全 Windows 兼容(Win7/8/10/11),仅 45.2MB 轻量化工具,
无需 Mac、无需虚拟机,一站式完成 Bundle ID 创建、P12 证书生成、描述文件制作、HBuilderX 云打包 IPA 分片上传、App Store 后台元数据管理,同时内置独立隔离环境,规避苹果多账号关联封号风险。

官网地址:https://iosuploader.xinxishehui.com/

核心优势:
全 Windows 兼容,最低支持 Win7 老旧办公电脑;
纯软件隔离,斩断设备 / 网络指纹,规避 3.2 (f) 批量封号;
全程不用 Apple ID 密码,仅 P8 密钥 API 授权,杜绝账号泄露;
一站式证书、Bundle ID、设备 UDID、描述文件管理;
直接上传 IPA 至 App Store Connect,替代 Xcode、Transporter;
批量管理多开发者账号,适配 UniApp、Flutter 跨平台项目。

**一、前期准备工作

  1. 基础环境**
    Windows 系统:Win7/Win8/Win10/Win11 32/64 位均可;
    下载 iOSUploader v2.1.3,大小 45.2MB,解压直接运行无需安装;
    有效苹果开发者付费账号(个人 / 企业账号,免费账号无法上架 App Store);
    Uni-App 项目(HBuilderX 开发完成,manifest.json 提前规划 Bundle ID);
    提前获取 App Store Connect API 三要素:Issuer ID、Key ID、P8 密钥文件(全程免账号密码登录)。
  2. 提前获取 P8 密钥(关键,免 Apple ID 登录)
    登录 App Store Connect → 用户和访问 → API 密钥;
    点击「+」新建密钥,命名自定义,权限选 App 管理员;
    生成后仅一次下载 AuthKey_xxx.p8 文件,妥善保存;
    复制页面上方 Issuer ID、列表内 Key ID,填入 iOSUploader 设置面板;
    优势:不用输入 Apple ID 与登录密码,多人协作不会泄露账号,大幅降低 3.2 (f) 违规关联风险。

二、Windows 端用 iOSUploader 创建 Bundle ID(应用唯一包名)
Bundle ID 是 UniApp iOS 应用唯一标识,证书、描述文件、打包必须保持完全一致,传统操作需登录苹果开发者网页,iOSUploader 内置可视化创建面板:
打开 iOSUploader,左侧菜单栏切换「Bundle ID 管理」;
点击「创建 Bundle」,填写名称、自定义包名(格式:com. 公司名。项目名,例:com.xxx.uniappshop);
按需勾选 App 权限服务:推送通知、Apple 登录、iCloud、支付、NFC、Game Center 等 UniApp 所需能力;
确认创建,工具自动同步至苹果开发者后台,列表可查看、管理所有 Bundle ID;
复制 Bundle ID,保存至 HBuilderX,后续打包统一填写。

三、Windows 无 Mac 生成 P12 发布证书(打包必备签名文件)
传统 Mac 流程:钥匙串生成 CSR 证书签名请求→开发者后台创建证书→导出 P12,Windows 无钥匙串无法操作,iOSUploader 内置证书生成引擎,一步导出.p12 文件:
步骤 1:进入证书管理面板
左侧菜单「证书管理」→「创建证书」,选择证书类型:
iOS App Development:真机测试、TestFlight 内测;
iOS Distribution(App Store):正式上架打包,本文上架选此项。
步骤 2:生成并导出 P12 文件
填写证书名称,设置 P12 加密密码(打包时必须填写,牢记);
工具自动生成 CSR 并提交苹果服务器,无需手动操作;
创建成功后,本地导出.p12证书文件,单独存放;
工具列表可加载、查看所有证书过期时间,支持批量管理多账号证书;
注意:单个开发者账号最多 3 个发布证书,旧证书无用可直接在工具内删除释放名额。

四、Windows 制作.mobileprovision 描述文件
描述文件绑定 Bundle ID+P12 证书,是 UniApp 云打包签名核心文件,分开发 / 发布两类:
iOSUploader 左侧「描述文件管理」→「创建描述文件」;
类型选择:App Store(发布上架);
选择上一步创建的 Bundle ID,勾选刚生成的 Distribution 发布证书;
自定义描述文件名称,确认生成;
下载.mobileprovision描述文件保存本地;
开发测试版额外勾选设备 UDID,可在工具「设备管理」批量录入测试机 UDID。

五、HBuilderX Uni-App 云打包 IPA(Windows 全程操作)

无需 Mac 本地编译,DCloud 云打包直接产出 IPA 安装包:
HBuilderX 打开 UniApp 项目,顶部菜单:发行 → 原生 App - 云打包 → iOS;
打包参数配置:
应用包名(Bundle ID):与 iOSUploader 创建的包名完全一致;
版本号、build 内部版本号按需填写;
证书选择「自有证书」,上传 Windows 导出的.p12文件,输入 P12 加密密码;
上传对应.mobileprovision描述文件;
勾选应用图标、启动图,确认打包;
等待云端编译完成,下载生成的.ipa安装包到 Windows 本地。

六、iOSUploader Windows 上传 IPA 至 App Store Connect(免 Mac 上传)
摒弃 Xcode、Transporter 仅 Mac 可用限制,单台 Win7 电脑即可分片上传 IPA,自带防关联隔离通道:
打开 iOSUploader「上传管理」,顶部设置填入提前准备的 Issuer ID、Key ID、P8 证书路径,保存 API 授权;
点击「选择 IPA」,选中 HBuilderX 下载的 ipa 文件;
工具自动分片上传(超大文件分块传输,断点续传),实时显示上传日志;
上传完成自动创建 App Store 构建版本,无需登录网页后台;
配套功能:
截图管理:批量上传各尺寸 iPhone/iPad 截图,支持多语言;
应用元数据编辑:简介、关键词、销售地区、价格、年龄分级;
审核消息中心:查看苹果官方留言、回复审核问题、管理附件;
批量管理多应用、多账号切换,每个窗口独立隔离环境,杜绝账号关联。

七、关键:规避苹果 3.2 (f) 多账号关联封号(iOSUploader 核心价值)
大量 UniApp 多项目团队踩坑:同一台电脑、同一网络操作多个苹果开发者账号,被苹果风控判定环境关联,触发 3.2 (f) 条款连锁封号,所有账号应用下架、收益冻结、申诉成功率极低。
传统方案短板对比
表格
方案 成本 风控风险 Windows 适配
多台 Mac 物理隔离 极高,设备折旧运维贵 共用网络仍存在关联风险 不支持
Windows 虚拟机 高,占用大量内存硬盘 底层设备标识泄露,批量封号频发 卡顿、上传超时
iOSUploader 纯软件隔离 极低,单台电脑管理上百账号 独立隔离环境,无硬件指纹交叉 Win7 全兼容
工具防关联机制
独立隔离上传通道,不携带本机硬件、网卡、系统缓存信息;
多开工具窗口,每个账号独立运行环境,数据完全隔离;
API P8 密钥授权,全程不登录 Apple ID,消除账号登录轨迹关联;
上传、证书、Bundle ID 操作无统一设备指纹留痕,规避风控追溯链路。

九、常见报错排查(Windows 免 Mac 流程高频问题)
云打包签名失败:P12 密码错误、Bundle ID 与描述文件不匹配、证书过期;
IPA 上传失败:P8 密钥失效(重新生成下载)、网络波动(工具支持分片续传);
账号关联标记:停止共用虚拟机 / 旧上传工具,切换 iOSUploader 独立隔离窗口操作;
Win7 运行异常:关闭系统防火墙兼容拦截,解压工具至纯英文路径。

结语
对于全部使用 Windows 开发 UniApp 的团队,iOSUploader 彻底打破「iOS 上架必须买 Mac」的行业固有认知,从证书制作、描述文件生成、云打包到 IPA 上传、应用后台管理实现全流程 Windows 闭环,最低老旧 Win7 电脑即可运行。同时依托软件级账号隔离能力,从根源规避苹果 3.2 (f) 关联封号风险,大幅降低硬件采购与账号资产损失成本,是 UniApp、Flutter 跨平台开发者无 Mac 上架 iOS 的刚需工具。
工具官网:https://iosuploader.xinxishehui.com/

收起阅读 »

1

1