HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

搭建三角洲陪玩护航小程序服务号平台需要什么?一站式打包部署支持微信小程序+h5+app

电竞陪玩、游戏代练和俱乐部陪练正在告别零散的‘人工接单时代’,一套功能齐全、支持独立部署的源码系统,是迈向‘系统化运营时代’的关键一步。

废话不多说,直接上干货!

一、需要资质

1.营业执照:个体户和企业执照都行,主要用于各种认证、小程序服务号及域名的备案等

2.法人信息:认证信息需要

3.对公账户:企业执照需要对公账户,个体户可用法人的银行卡;申请微信商户号用于平台收款

4.邮箱、手机号:申请各个平台的账号并登录

二、需要第三方产品

1.服务器:安装并承载系统的运行

2.域名:需备案,用于访问系统

3.服务号、小程序:都需要认证,且小程序要备案

三、源码系统

后端源码:Thinkphp6

前端源码:UNI-APP vue2.0(支持一键式发布 H5、微信小程序、安卓/iOS 苹果 app)

宝塔 HTTP://BT.CN: 安装后台、管理网站

下载护航陪玩系统源码

www.51duoke.cn/games/?id=1

✨ 核心功能模块

非租用版,源码交付、永久域名授权使用;独立部署、自主运营,不抽流水无年费,功能齐全可二开。电竞陪玩、游戏代练、三角洲行动护航、俱乐部陪练和工作室派单,正在从“人工接单时代”进入“系统化运营时代”。真正能长期跑起来的电竞护航系统,不只是做一个下单页面,也不是简单堆几个聊天和支付功能,而是要把用户获客、大神展示、订单派发、客服验收、工作室管理、会员体系、内容风控、数据分析和持续迭代全部串成闭环。

用户端功能

游戏分类与选择
护航手选择/发布需求
订单状态跟踪
在线沟通(集成自建 IM)
微信支付托管
老板端:高效下单,灵活选服​ 老板可快速筛选热门游戏类目,按需选择服务模式 —— 支持指定心仪打手、等待打手抢单或由平台客服专业派单,无需繁琐操作,3 步即可完成下单,精准匹配游戏需求。

大神端

接单管理
上传截图/完成证明
保证金押金系统
收益提现
打手排行榜
打手端:便捷接单,打造个人 IP​ 打手接收订单实时提示,可自主抢单或响应派单;完成服务后上传截图即可申请结算,流程简洁高效。此外,支持发布游戏动态、管理个人游戏卡片(展示战绩、擅长英雄等),助力打造个人品牌,吸引更多订单。

客服端

派单调度
订单监管
审核进度
线下发单
客服端:全程管控,保障履约​ 作为订单枢纽,客户端支持与老板、打手实时沟通,同步订单进度;提供派单分配、线下报单录入功能,同时通过审核打手完成截图的方式,确保服务质量,最终实现安全结单

管理后台

仪表盘数据可视化(订单量、交易额、用户增长)
用户与护航手管理(增删改查、封禁/解封)
订单管理与纠纷处理
财务管理(对账、佣金设置、提现审核)
内容管理(Banner、公告、活动发布)
审核管理(护航手资料审核)
系统设置(参数配置、游戏库管理)

适用人群

该系统适用于:

代练公司/工作室 - 快速建立私域客户,实现变现
游戏主播 - 直播间引流客户,实现下单管理
中小型网络公司 - 无需打手即可开展业务
工会 - 管理和运营打手团队
下载护航陪玩系统源码

继续阅读 »

电竞陪玩、游戏代练和俱乐部陪练正在告别零散的‘人工接单时代’,一套功能齐全、支持独立部署的源码系统,是迈向‘系统化运营时代’的关键一步。

废话不多说,直接上干货!

一、需要资质

1.营业执照:个体户和企业执照都行,主要用于各种认证、小程序服务号及域名的备案等

2.法人信息:认证信息需要

3.对公账户:企业执照需要对公账户,个体户可用法人的银行卡;申请微信商户号用于平台收款

4.邮箱、手机号:申请各个平台的账号并登录

二、需要第三方产品

1.服务器:安装并承载系统的运行

2.域名:需备案,用于访问系统

3.服务号、小程序:都需要认证,且小程序要备案

三、源码系统

后端源码:Thinkphp6

前端源码:UNI-APP vue2.0(支持一键式发布 H5、微信小程序、安卓/iOS 苹果 app)

宝塔 HTTP://BT.CN: 安装后台、管理网站

下载护航陪玩系统源码

www.51duoke.cn/games/?id=1

✨ 核心功能模块

非租用版,源码交付、永久域名授权使用;独立部署、自主运营,不抽流水无年费,功能齐全可二开。电竞陪玩、游戏代练、三角洲行动护航、俱乐部陪练和工作室派单,正在从“人工接单时代”进入“系统化运营时代”。真正能长期跑起来的电竞护航系统,不只是做一个下单页面,也不是简单堆几个聊天和支付功能,而是要把用户获客、大神展示、订单派发、客服验收、工作室管理、会员体系、内容风控、数据分析和持续迭代全部串成闭环。

用户端功能

游戏分类与选择
护航手选择/发布需求
订单状态跟踪
在线沟通(集成自建 IM)
微信支付托管
老板端:高效下单,灵活选服​ 老板可快速筛选热门游戏类目,按需选择服务模式 —— 支持指定心仪打手、等待打手抢单或由平台客服专业派单,无需繁琐操作,3 步即可完成下单,精准匹配游戏需求。

大神端

接单管理
上传截图/完成证明
保证金押金系统
收益提现
打手排行榜
打手端:便捷接单,打造个人 IP​ 打手接收订单实时提示,可自主抢单或响应派单;完成服务后上传截图即可申请结算,流程简洁高效。此外,支持发布游戏动态、管理个人游戏卡片(展示战绩、擅长英雄等),助力打造个人品牌,吸引更多订单。

客服端

派单调度
订单监管
审核进度
线下发单
客服端:全程管控,保障履约​ 作为订单枢纽,客户端支持与老板、打手实时沟通,同步订单进度;提供派单分配、线下报单录入功能,同时通过审核打手完成截图的方式,确保服务质量,最终实现安全结单

管理后台

仪表盘数据可视化(订单量、交易额、用户增长)
用户与护航手管理(增删改查、封禁/解封)
订单管理与纠纷处理
财务管理(对账、佣金设置、提现审核)
内容管理(Banner、公告、活动发布)
审核管理(护航手资料审核)
系统设置(参数配置、游戏库管理)

适用人群

该系统适用于:

代练公司/工作室 - 快速建立私域客户,实现变现
游戏主播 - 直播间引流客户,实现下单管理
中小型网络公司 - 无需打手即可开展业务
工会 - 管理和运营打手团队
下载护航陪玩系统源码

收起阅读 »

我们公司找兼职开发,有没有会iOS开发的(跨平台最好),QQ752562065

iOS打包 iOS

我们公司找兼职开发,有没有会iOS开发的(跨平台最好),QQ752562065

我们公司找兼职开发,有没有会iOS开发的(跨平台最好),QQ752562065

苹果马甲包上架被拒 4.3 的原因有哪些?分享一次成功过审的处理经验

移动APP

苹果马甲包上架被拒 4.3 的原因有哪些?分享一次成功过审的处理经验

做过 iOS 上架的人都知道,马甲包最容易遇到的问题就是苹果审核 4.3。

很多开发者认为马甲包就是换个 Logo、改个名称、换套截图重新提交,但实际上现在的苹果审核机制早已经不是几年前的标准了。尤其是近两年,苹果对于相似应用、批量应用以及模板化应用的审核越来越严格,导致大量马甲包项目收到 4.3(a) 或 4.3(b) 的审核反馈。

最近我们处理了一个工具类马甲包项目,从第一次收到 4.3,到最终成功通过审核,整个过程经历了多轮分析和调整。今天结合这次实际案例,聊聊苹果马甲包为什么会收到 4.3,以及有哪些相对有效的处理思路。

什么是苹果审核 4.3?

4.3 属于苹果审核指南中的 Design - Spam 条款。

简单来说,苹果认为当前提交的应用与 App Store 中已有应用过于相似,缺乏独立价值,或者开发者正在批量提交同类型产品。

通常会出现两种情况:

4.3(a):应用本身相似度过高。

4.3(b):开发者批量提交多个类似应用。

而马甲包恰恰是最容易触发这两类审核的问题。

马甲包为什么容易收到 4.3?

产品结构过于相似

这是最常见的原因。

很多马甲包项目本质上就是同一套后台、同一套代码、同一套功能。

例如:

A应用是记账工具;

B应用是生活记账;

C应用是家庭记账。

名称不同,但功能完全一致。

首页布局、功能入口、用户操作路径几乎没有变化。

对于苹果来说,这些产品本质上属于同一个应用。

即使换了图标和启动页,也很容易被判定为相似应用。

UI修改不够彻底

很多开发者认为:

换 Logo;

换颜色;

换截图;

就属于全新产品。

实际上苹果审核团队更关注产品结构。

如果导航栏、首页布局、核心功能入口完全一致,仅修改视觉元素通常很难通过审核。

尤其是一些模板化项目,很容易被识别出相同特征。

代码特征高度重复

很多人认为苹果不会分析代码。

实际上从大量案例来看,苹果不仅看前端界面,还会结合项目资源结构、功能模块以及应用整体特征进行判断。

特别是大量使用同一套源码快速生成多个 App 的项目,更容易出现审核风险。

同账号存在多个同类产品

如果开发者账号下面已经存在:

  • 多个小说 App
  • 多个壁纸 App
  • 多个工具 App

即使新提交的应用进行了部分修改,也有可能触发 4.3(b)。

因为苹果会认为开发者正在利用多个应用覆盖同一业务场景。

我们遇到的案例

前段时间有客户提交一款工具类马甲包。

第一次审核收到 4.3(a)。

客户自行修改了 Logo 和截图后再次提交。

结果第二次审核直接升级为 4.3(b)。

后来我们接手分析后发现,问题并不在素材层面,而是整个产品逻辑与已上线版本几乎完全一致。

首页结构相同;

功能路径相同;

会员体系相同;

甚至帮助中心内容都基本一致。

从审核角度来看,这实际上还是同一个产品。

我们是如何处理的?

重新规划产品定位

首先重新梳理产品场景。

让新版本拥有独立的使用场景,而不是简单复制旧版本。

苹果更愿意接受不同业务方向的产品,而不是同一产品的多次包装。

调整首页和功能结构

重点不是换颜色,而是改变用户使用流程。

包括:

  • 首页模块重组
  • 功能入口调整
  • 用户路径优化
  • 新增独立功能模块

让审核人员打开 App 后能够明显感受到产品差异。

重做应用素材

包括:

  • App Icon
  • 启动页
  • 引导页
  • 预览图
  • 应用描述

避免与历史版本形成明显关联。

完善审核说明

很多开发者忽略审核备注。

实际上对于马甲包项目来说,一份清晰的审核说明非常重要。

需要明确说明:

  • 产品定位
  • 目标用户
  • 核心功能
  • 与历史版本的区别

帮助审核人员理解产品价值。

收到 4.3 后不要做什么?

根据我们的经验,以下几种操作最容易浪费时间。

第一种是收到反馈后直接重新提交。

如果问题没有解决,审核结果通常不会改变。

第二种是只修改 Logo 和名称。

对于现在的审核机制来说,这种调整已经很难解决根本问题。

第三种是连续提交多个版本碰碰运气。

苹果审核记录会长期保存,多次提交相同内容往往只会增加后续审核难度。

总结

苹果马甲包收到 4.3,本质上并不是名称或者 Logo 的问题,而是苹果认为应用缺乏独立价值。

过去通过简单换壳就能上架的时代已经结束,现在苹果更关注产品定位、用户价值、功能差异以及整体体验。

如果收到 4.3(a) 或 4.3(b),建议不要急着重新提交,而是先分析问题来源。重点检查产品结构、功能逻辑、应用场景以及与历史版本的差异程度。

从我们处理过的大量案例来看,真正能够解决 4.3 的项目,往往不是改得最多的,而是差异化做得最彻底的。

对于马甲包来说,审核通过的关键从来不是“换壳”,而是让苹果相信这是一款独立且有价值的新产品。

继续阅读 »

苹果马甲包上架被拒 4.3 的原因有哪些?分享一次成功过审的处理经验

做过 iOS 上架的人都知道,马甲包最容易遇到的问题就是苹果审核 4.3。

很多开发者认为马甲包就是换个 Logo、改个名称、换套截图重新提交,但实际上现在的苹果审核机制早已经不是几年前的标准了。尤其是近两年,苹果对于相似应用、批量应用以及模板化应用的审核越来越严格,导致大量马甲包项目收到 4.3(a) 或 4.3(b) 的审核反馈。

最近我们处理了一个工具类马甲包项目,从第一次收到 4.3,到最终成功通过审核,整个过程经历了多轮分析和调整。今天结合这次实际案例,聊聊苹果马甲包为什么会收到 4.3,以及有哪些相对有效的处理思路。

什么是苹果审核 4.3?

4.3 属于苹果审核指南中的 Design - Spam 条款。

简单来说,苹果认为当前提交的应用与 App Store 中已有应用过于相似,缺乏独立价值,或者开发者正在批量提交同类型产品。

通常会出现两种情况:

4.3(a):应用本身相似度过高。

4.3(b):开发者批量提交多个类似应用。

而马甲包恰恰是最容易触发这两类审核的问题。

马甲包为什么容易收到 4.3?

产品结构过于相似

这是最常见的原因。

很多马甲包项目本质上就是同一套后台、同一套代码、同一套功能。

例如:

A应用是记账工具;

B应用是生活记账;

C应用是家庭记账。

名称不同,但功能完全一致。

首页布局、功能入口、用户操作路径几乎没有变化。

对于苹果来说,这些产品本质上属于同一个应用。

即使换了图标和启动页,也很容易被判定为相似应用。

UI修改不够彻底

很多开发者认为:

换 Logo;

换颜色;

换截图;

就属于全新产品。

实际上苹果审核团队更关注产品结构。

如果导航栏、首页布局、核心功能入口完全一致,仅修改视觉元素通常很难通过审核。

尤其是一些模板化项目,很容易被识别出相同特征。

代码特征高度重复

很多人认为苹果不会分析代码。

实际上从大量案例来看,苹果不仅看前端界面,还会结合项目资源结构、功能模块以及应用整体特征进行判断。

特别是大量使用同一套源码快速生成多个 App 的项目,更容易出现审核风险。

同账号存在多个同类产品

如果开发者账号下面已经存在:

  • 多个小说 App
  • 多个壁纸 App
  • 多个工具 App

即使新提交的应用进行了部分修改,也有可能触发 4.3(b)。

因为苹果会认为开发者正在利用多个应用覆盖同一业务场景。

我们遇到的案例

前段时间有客户提交一款工具类马甲包。

第一次审核收到 4.3(a)。

客户自行修改了 Logo 和截图后再次提交。

结果第二次审核直接升级为 4.3(b)。

后来我们接手分析后发现,问题并不在素材层面,而是整个产品逻辑与已上线版本几乎完全一致。

首页结构相同;

功能路径相同;

会员体系相同;

甚至帮助中心内容都基本一致。

从审核角度来看,这实际上还是同一个产品。

我们是如何处理的?

重新规划产品定位

首先重新梳理产品场景。

让新版本拥有独立的使用场景,而不是简单复制旧版本。

苹果更愿意接受不同业务方向的产品,而不是同一产品的多次包装。

调整首页和功能结构

重点不是换颜色,而是改变用户使用流程。

包括:

  • 首页模块重组
  • 功能入口调整
  • 用户路径优化
  • 新增独立功能模块

让审核人员打开 App 后能够明显感受到产品差异。

重做应用素材

包括:

  • App Icon
  • 启动页
  • 引导页
  • 预览图
  • 应用描述

避免与历史版本形成明显关联。

完善审核说明

很多开发者忽略审核备注。

实际上对于马甲包项目来说,一份清晰的审核说明非常重要。

需要明确说明:

  • 产品定位
  • 目标用户
  • 核心功能
  • 与历史版本的区别

帮助审核人员理解产品价值。

收到 4.3 后不要做什么?

根据我们的经验,以下几种操作最容易浪费时间。

第一种是收到反馈后直接重新提交。

如果问题没有解决,审核结果通常不会改变。

第二种是只修改 Logo 和名称。

对于现在的审核机制来说,这种调整已经很难解决根本问题。

第三种是连续提交多个版本碰碰运气。

苹果审核记录会长期保存,多次提交相同内容往往只会增加后续审核难度。

总结

苹果马甲包收到 4.3,本质上并不是名称或者 Logo 的问题,而是苹果认为应用缺乏独立价值。

过去通过简单换壳就能上架的时代已经结束,现在苹果更关注产品定位、用户价值、功能差异以及整体体验。

如果收到 4.3(a) 或 4.3(b),建议不要急着重新提交,而是先分析问题来源。重点检查产品结构、功能逻辑、应用场景以及与历史版本的差异程度。

从我们处理过的大量案例来看,真正能够解决 4.3 的项目,往往不是改得最多的,而是差异化做得最彻底的。

对于马甲包来说,审核通过的关键从来不是“换壳”,而是让苹果相信这是一款独立且有价值的新产品。

收起阅读 »

uni-app中app(安卓端实测)中<editor>组件光标使用按钮插入特定符号(如【】)时定位到特定字符中间的可行方案

editor

uni-app app端(安卓实测)<editor>组件光标使用按钮插入特定符号(如【】)时定位到特定字符中间的可行方案

因为在做文本编辑器(符号快捷成对(如【】这种的)输入)需用到editor组件。
因为不能直接使用DOM,因网上搜不出解决方案,借助AI后实测出一种方案和一种待验证方案。
思路简单得离谱(主要还是对edtior这个组件不了解):

首先说一下editor

<editor> 组件底层是基于 Quill.js,所以不能使用原生输入框的 selectionStart/setSelectionRange。光标操作只能通过 Quill API 或标准 DOM API 实现。

方案一:Quill API(推荐这种)

获取 Quill 实例

const editor = document.getElementById('editor')  
const quill = editor.__quill || editor.querySelector('.ql-editor')?.__quill

核心示例:插入配对符号并定位光标

例如:一个按钮直接插入【】,你需要光标在【】的中间

const range = quill.getSelection()  
const pos = range ? range.index : 0  
const half = Math.ceil(pair.length / 2)  
quill.insertText(pos, pair)  
quill.setSelection(pos + half)

优缺点

优点

  • API 简洁高效
  • 与编辑器状态(Delta)完全同步
  • 不影响撤销/重做

缺点

  • 依赖 Quill 内部属性 __quill
  • 不同版本 uni-app 兼容性不确定
  • 需在 renderjs 中运行

方案二:原生 DOM API(降级方案:这个未验证,因为第一种方案基本解决,这是ai给的降级兜底方案)

核心思路

使用 document.createTreeWalker 遍历文本节点计算全局偏移,通过 Range + Selection API 操作光标。

获取光标全局偏移

function getCursorIndex(container) {  
    const sel = window.getSelection()  
    if (!sel?.rangeCount) return -1  
    const node = sel.anchorNode, off = sel.anchorOffset  
    if (!node || !container.contains(node)) return -1  
    const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT)  
    let count = 0  
    while (walker.nextNode()) {  
        if (walker.currentNode === node) return count + off  
        count += walker.currentNode.textContent.length  
    }  
    return count  
}

设置光标到指定位置

function setCursorIndex(container, index) {  
    const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT)  
    let count = 0  
    while (walker.nextNode()) {  
        const len = walker.currentNode.textContent.length  
        if (count + len >= index) {  
            const range = document.createRange()  
            range.setStart(walker.currentNode, index - count)  
            range.collapse(true)  
            const sel = window.getSelection()  
            sel.removeAllRanges()  
            sel.addRange(range)  
            return  
        }  
        count += len  
    }  
}

插入文本并设置光标

const text = foundNode.textContent  
foundNode.textContent = text.slice(0, offset) + pair + text.slice(offset)  
const range = document.createRange()  
range.setStart(foundNode, offset + half)  
range.collapse(true)  
window.getSelection().removeAllRanges()  
window.getSelection().addRange(range)

优缺点

优点

  • 纯标准 DOM API,兼容性最好
  • 不依赖任何框架内部属性

缺点

  • 代码较复杂
  • 直接改 textContent 可能破坏 Quill Delta 同步
  • 富文本元素(图片等)偏移计算需额外处理

两种方案对比

代码量

  • Quill API:3 行
  • DOM API:30+ 行
  • Delta 同步

  • Quill API:✅ 完全同步
  • DOM API:❌ 可能不同步

撤销/重做

  • Quill API:✅ 正常
  • DOM API:❌ 可能受影响

WebView 兼容性

  • Quill API:⭐⭐⭐(依赖 Quill 版本)
  • DOM API:⭐⭐⭐⭐⭐

uni-app App 端实践要点

  • 逻辑层无 DOM,所有 DOM 操作必须通过 renderjs 执行
  • renderjs 通过 change:prop 模板绑定接收逻辑层数据,通过 ownerVm.callMethod() 回传状态
  • 方法签名:methodName(newVal, oldVal, ownerVm, vm)
  • 推荐双方案:优先 Quill API → 失败则降级 DOM API
继续阅读 »

uni-app app端(安卓实测)<editor>组件光标使用按钮插入特定符号(如【】)时定位到特定字符中间的可行方案

因为在做文本编辑器(符号快捷成对(如【】这种的)输入)需用到editor组件。
因为不能直接使用DOM,因网上搜不出解决方案,借助AI后实测出一种方案和一种待验证方案。
思路简单得离谱(主要还是对edtior这个组件不了解):

首先说一下editor

<editor> 组件底层是基于 Quill.js,所以不能使用原生输入框的 selectionStart/setSelectionRange。光标操作只能通过 Quill API 或标准 DOM API 实现。

方案一:Quill API(推荐这种)

获取 Quill 实例

const editor = document.getElementById('editor')  
const quill = editor.__quill || editor.querySelector('.ql-editor')?.__quill

核心示例:插入配对符号并定位光标

例如:一个按钮直接插入【】,你需要光标在【】的中间

const range = quill.getSelection()  
const pos = range ? range.index : 0  
const half = Math.ceil(pair.length / 2)  
quill.insertText(pos, pair)  
quill.setSelection(pos + half)

优缺点

优点

  • API 简洁高效
  • 与编辑器状态(Delta)完全同步
  • 不影响撤销/重做

缺点

  • 依赖 Quill 内部属性 __quill
  • 不同版本 uni-app 兼容性不确定
  • 需在 renderjs 中运行

方案二:原生 DOM API(降级方案:这个未验证,因为第一种方案基本解决,这是ai给的降级兜底方案)

核心思路

使用 document.createTreeWalker 遍历文本节点计算全局偏移,通过 Range + Selection API 操作光标。

获取光标全局偏移

function getCursorIndex(container) {  
    const sel = window.getSelection()  
    if (!sel?.rangeCount) return -1  
    const node = sel.anchorNode, off = sel.anchorOffset  
    if (!node || !container.contains(node)) return -1  
    const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT)  
    let count = 0  
    while (walker.nextNode()) {  
        if (walker.currentNode === node) return count + off  
        count += walker.currentNode.textContent.length  
    }  
    return count  
}

设置光标到指定位置

function setCursorIndex(container, index) {  
    const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT)  
    let count = 0  
    while (walker.nextNode()) {  
        const len = walker.currentNode.textContent.length  
        if (count + len >= index) {  
            const range = document.createRange()  
            range.setStart(walker.currentNode, index - count)  
            range.collapse(true)  
            const sel = window.getSelection()  
            sel.removeAllRanges()  
            sel.addRange(range)  
            return  
        }  
        count += len  
    }  
}

插入文本并设置光标

const text = foundNode.textContent  
foundNode.textContent = text.slice(0, offset) + pair + text.slice(offset)  
const range = document.createRange()  
range.setStart(foundNode, offset + half)  
range.collapse(true)  
window.getSelection().removeAllRanges()  
window.getSelection().addRange(range)

优缺点

优点

  • 纯标准 DOM API,兼容性最好
  • 不依赖任何框架内部属性

缺点

  • 代码较复杂
  • 直接改 textContent 可能破坏 Quill Delta 同步
  • 富文本元素(图片等)偏移计算需额外处理

两种方案对比

代码量

  • Quill API:3 行
  • DOM API:30+ 行
  • Delta 同步

  • Quill API:✅ 完全同步
  • DOM API:❌ 可能不同步

撤销/重做

  • Quill API:✅ 正常
  • DOM API:❌ 可能受影响

WebView 兼容性

  • Quill API:⭐⭐⭐(依赖 Quill 版本)
  • DOM API:⭐⭐⭐⭐⭐

uni-app App 端实践要点

  • 逻辑层无 DOM,所有 DOM 操作必须通过 renderjs 执行
  • renderjs 通过 change:prop 模板绑定接收逻辑层数据,通过 ownerVm.callMethod() 回传状态
  • 方法签名:methodName(newVal, oldVal, ownerVm, vm)
  • 推荐双方案:优先 Quill API → 失败则降级 DOM API
收起阅读 »

苹果审核被拒 5.2.3 怎么办?分享一次真实项目成功过审经历

应用上架

最近在处理一个客户的 App Store 上架项目时,遇到了苹果审核反馈的 5.2.3 问题。很多开发者第一次收到 5.2.3 都会比较疑惑,因为应用功能正常、没有崩溃、也没有明显违规内容,但依然被苹果拒绝审核。  

实际上,5.2.3 主要涉及知识产权、品牌授权、内容来源以及相关资质证明问题。如果处理不当,不仅会导致应用长期无法上架,还可能增加开发者账号后续审核风险。  

今天结合这次真实项目的处理经历,分享一下我们是如何解决 5.2.3 并最终审核通过的。  

收到的审核反馈  

客户提交的是一款工具类应用,第一次提交审核后,很快收到了苹果的 5.2.3 反馈。  

审核内容大致意思是:  

苹果无法确认应用中涉及的部分内容、功能描述或者第三方相关资源是否获得合法授权,希望开发者提供对应的证明材料。  

收到反馈后,客户最开始认为只是普通审核问题,计划直接再次提交碰碰运气。  

但从我们多年的上架经验来看,这种处理方式风险非常高。  

因为苹果审核记录是长期保留的,同一个问题如果没有得到解决,仅仅修改版本号或者简单回复几句话再次提交,审核结果通常不会发生变化。  

我们是如何排查问题的  

收到反馈后,我们第一时间没有选择重新提交,而是对整个项目进行了全面检查。  

经过排查发现,应用介绍中涉及部分第三方品牌名称,同时后台内容来源也无法直接向苹果证明拥有合法授权关系。  

从开发者角度来看,这些内容可能没有实际侵权行为,但对于审核人员来说,如果无法确认内容来源是否合法,就有可能触发 5.2.3。  

因此问题的核心并不是应用能不能运行,而是开发者能否证明拥有合法使用权限。  

我们做了哪些调整  

确定问题方向后,我们主要进行了三个方面的处理。  

首先,重新整理了应用涉及的所有内容来源,并删除了部分容易引起审核误解的第三方描述内容。  

其次,补充了企业主体资料,包括官方网站、备案信息以及相关业务资质证明。  

最后,针对苹果提出的问题准备了一份完整的审核说明文件,详细解释应用功能来源、内容来源以及运营主体信息。  

同时在应用内部增加了版权声明、内容来源说明以及用户协议相关条款。  

完成以上调整后,我们再次提交审核。  

两天后,应用顺利通过审核。  

为什么很多开发者一直过不了 5.2.3  

在实际处理过程中,我们发现很多开发者收到 5.2.3 后都会犯一个共同错误。  

那就是没有解决问题就反复提交审核。  

例如:  

第一次被拒;  

修改一句审核备注;  

再次提交;  

继续被拒;  

然后换个审核说明继续提交。  

实际上,这种方式往往只会不断累积审核记录。  

苹果审核团队每天会看到应用的历史审核记录,如果多次提交的版本没有实质性变化,审核人员通常会认为开发者并没有解决问题。  

对于涉及知识产权、版权归属、品牌授权等问题的应用来说,反复提交并不会提高通过率。  

相反,可能会导致应用进入更严格的人工审核流程。  

没有资质证明,不建议继续提交  

这里也是很多开发者最容易忽略的一点。  

如果苹果明确要求提供:  

* 商标授权书  
* 内容授权协议  
* 品牌合作证明  
* 版权证明材料  
* 相关经营资质  

而开发者暂时无法提供这些材料,那么建议先暂停提交审核。  

因为苹果关注的重点不是开发者的解释,而是实际证明文件。  

如果无法提供对应资质,即使连续提交十次,审核团队也很难改变判断结果。  

根据我们的实际经验,有部分开发者在没有解决问题的情况下连续提交多个版本,最终导致账号审核周期明显变长,后续版本审核难度也不断增加。  

因此,收到 5.2.3 后最正确的处理方式并不是立即重新提交,而是先确认苹果需要什么材料,再准备对应证明文件。  

我们最终提交给苹果的说明  

在重新提交审核时,我们向苹果提供了完整说明,包括:  

应用运营主体信息;  

官方网站及备案信息;  

内容来源说明;  

版权声明;  

授权证明材料;  

相关业务资质文件。  

通过这些资料,审核团队能够明确确认应用内容来源合法,最终顺利通过审核。  

总结  

苹果审核 5.2.3 本质上属于知识产权和授权合规问题。  

很多开发者认为只要应用没有侵权就一定能够通过审核,但实际上苹果更关注的是开发者是否能够提供对应证明材料。  

如果收到 5.2.3,不建议盲目反复提交审核。尤其是在无法提供授权证明、版权证明或者相关资质文件的情况下,多次提交往往无法解决问题,反而可能增加后续审核风险。  

正确的做法应该是先定位问题来源,准备完整的授权材料和资质证明,待问题真正解决后再重新提交审核。这样不仅能够提高审核通过率,也有助于开发者账号长期稳定运营。  

从我们实际处理的案例来看,大部分 5.2.3 问题最终都能够解决,关键并不是提交次数,而是是否真正准备好了苹果需要看到的证明材料。   

继续阅读 »

最近在处理一个客户的 App Store 上架项目时,遇到了苹果审核反馈的 5.2.3 问题。很多开发者第一次收到 5.2.3 都会比较疑惑,因为应用功能正常、没有崩溃、也没有明显违规内容,但依然被苹果拒绝审核。  

实际上,5.2.3 主要涉及知识产权、品牌授权、内容来源以及相关资质证明问题。如果处理不当,不仅会导致应用长期无法上架,还可能增加开发者账号后续审核风险。  

今天结合这次真实项目的处理经历,分享一下我们是如何解决 5.2.3 并最终审核通过的。  

收到的审核反馈  

客户提交的是一款工具类应用,第一次提交审核后,很快收到了苹果的 5.2.3 反馈。  

审核内容大致意思是:  

苹果无法确认应用中涉及的部分内容、功能描述或者第三方相关资源是否获得合法授权,希望开发者提供对应的证明材料。  

收到反馈后,客户最开始认为只是普通审核问题,计划直接再次提交碰碰运气。  

但从我们多年的上架经验来看,这种处理方式风险非常高。  

因为苹果审核记录是长期保留的,同一个问题如果没有得到解决,仅仅修改版本号或者简单回复几句话再次提交,审核结果通常不会发生变化。  

我们是如何排查问题的  

收到反馈后,我们第一时间没有选择重新提交,而是对整个项目进行了全面检查。  

经过排查发现,应用介绍中涉及部分第三方品牌名称,同时后台内容来源也无法直接向苹果证明拥有合法授权关系。  

从开发者角度来看,这些内容可能没有实际侵权行为,但对于审核人员来说,如果无法确认内容来源是否合法,就有可能触发 5.2.3。  

因此问题的核心并不是应用能不能运行,而是开发者能否证明拥有合法使用权限。  

我们做了哪些调整  

确定问题方向后,我们主要进行了三个方面的处理。  

首先,重新整理了应用涉及的所有内容来源,并删除了部分容易引起审核误解的第三方描述内容。  

其次,补充了企业主体资料,包括官方网站、备案信息以及相关业务资质证明。  

最后,针对苹果提出的问题准备了一份完整的审核说明文件,详细解释应用功能来源、内容来源以及运营主体信息。  

同时在应用内部增加了版权声明、内容来源说明以及用户协议相关条款。  

完成以上调整后,我们再次提交审核。  

两天后,应用顺利通过审核。  

为什么很多开发者一直过不了 5.2.3  

在实际处理过程中,我们发现很多开发者收到 5.2.3 后都会犯一个共同错误。  

那就是没有解决问题就反复提交审核。  

例如:  

第一次被拒;  

修改一句审核备注;  

再次提交;  

继续被拒;  

然后换个审核说明继续提交。  

实际上,这种方式往往只会不断累积审核记录。  

苹果审核团队每天会看到应用的历史审核记录,如果多次提交的版本没有实质性变化,审核人员通常会认为开发者并没有解决问题。  

对于涉及知识产权、版权归属、品牌授权等问题的应用来说,反复提交并不会提高通过率。  

相反,可能会导致应用进入更严格的人工审核流程。  

没有资质证明,不建议继续提交  

这里也是很多开发者最容易忽略的一点。  

如果苹果明确要求提供:  

* 商标授权书  
* 内容授权协议  
* 品牌合作证明  
* 版权证明材料  
* 相关经营资质  

而开发者暂时无法提供这些材料,那么建议先暂停提交审核。  

因为苹果关注的重点不是开发者的解释,而是实际证明文件。  

如果无法提供对应资质,即使连续提交十次,审核团队也很难改变判断结果。  

根据我们的实际经验,有部分开发者在没有解决问题的情况下连续提交多个版本,最终导致账号审核周期明显变长,后续版本审核难度也不断增加。  

因此,收到 5.2.3 后最正确的处理方式并不是立即重新提交,而是先确认苹果需要什么材料,再准备对应证明文件。  

我们最终提交给苹果的说明  

在重新提交审核时,我们向苹果提供了完整说明,包括:  

应用运营主体信息;  

官方网站及备案信息;  

内容来源说明;  

版权声明;  

授权证明材料;  

相关业务资质文件。  

通过这些资料,审核团队能够明确确认应用内容来源合法,最终顺利通过审核。  

总结  

苹果审核 5.2.3 本质上属于知识产权和授权合规问题。  

很多开发者认为只要应用没有侵权就一定能够通过审核,但实际上苹果更关注的是开发者是否能够提供对应证明材料。  

如果收到 5.2.3,不建议盲目反复提交审核。尤其是在无法提供授权证明、版权证明或者相关资质文件的情况下,多次提交往往无法解决问题,反而可能增加后续审核风险。  

正确的做法应该是先定位问题来源,准备完整的授权材料和资质证明,待问题真正解决后再重新提交审核。这样不仅能够提高审核通过率,也有助于开发者账号长期稳定运营。  

从我们实际处理的案例来看,大部分 5.2.3 问题最终都能够解决,关键并不是提交次数,而是是否真正准备好了苹果需要看到的证明材料。   

收起阅读 »

苹果上架被拒 4.3(a)、4.3(b) 怎么办?分享一次成功过审的处理经验

uni-app 移动APP 苹果内购 苹果审核 应用上架

最近帮一个客户处理 App Store 上架问题时,连续遇到了苹果审核反馈的 4.3(a) 和 4.3(b)。最开始客户认为只是简单修改一下 Logo 和应用名称就能解决,但连续提交两次后依然被拒。经过一轮完整排查和调整后,最终顺利通过审核。今天就结合这次实际案例,聊聊苹果 4.3(a)、4.3(b) 的审核逻辑以及我们最终的处理思路,希望能给正在上架的开发者一些参考。  

## 苹果 4.3(a) 和 4.3(b) 到底是什么?  

很多开发者第一次看到 4.3 的时候都会比较懵,因为苹果给出的反馈内容通常比较笼统。但实际上,4.3(a) 和 4.3(b) 虽然同属于 Design - Spam 范畴,关注的重点却并不完全一样。  

4.3(a) 更多针对应用本身。苹果认为当前提交的 App 与 App Store 中已有应用存在较高相似度,缺乏独立产品价值。简单来说,就是审核团队觉得你的应用像是另一个应用的复制版本,即使更换了图标、名称或者启动页,也无法体现明显差异。  

而 4.3(b) 则更偏向于开发者维度。苹果会认为开发者正在批量提交多个功能类似的应用,从而试图占据更多搜索结果或榜单位置。这种情况经常出现在马甲包项目、矩阵项目或者同类型产品批量上架的场景中。  

## 本次项目遇到的问题  

这次客户提交的是一款工具类应用,功能本身没有违规内容,隐私协议和用户协议也已经配置完整。但提交审核后,很快收到了苹果反馈的 4.3(a)。  

最开始客户按照网上很多文章的做法,仅修改了应用图标、应用名称以及部分截图素材,然后再次提交审核。然而第二次审核结果并没有变化,依然被苹果拒绝。  

在进一步分析项目后,我们发现问题并不是出现在 Logo 或截图上,而是整个产品结构与市场上已有同类应用过于接近。从首页布局到导航方式,再到用户操作流程,都能够找到大量相似案例。  

后来苹果又补充反馈了 4.3(b),说明审核团队已经开始从开发者维度评估项目,而不仅仅是应用本身。  

## 我们是如何排查问题的?  

收到 4.3 之后,最忌讳的事情就是盲目重复提交。因为每一次提交都会留下审核记录,如果问题没有真正解决,多次拒审反而会增加后续审核难度。  

我们的第一步是先对项目进行相似度分析,而不是直接修改代码。通过对应用页面结构、资源文件以及整体业务流程进行检查后,发现应用存在几个明显问题。  

首先是首页布局与市场上同类产品高度接近。虽然颜色和图标不同,但整体模块排列方式基本一致。其次是功能入口设计过于模板化,用户打开 App 后看到的核心内容与多个竞品非常相似。最后是项目使用了一套较为常见的开发模板,代码结构和资源组织方式也存在明显的模板特征。  

这些问题单独来看可能并不严重,但叠加在一起后,就容易被苹果判定为缺乏独立性。  

## 最终做了哪些调整?  

确定问题方向后,我们并没有选择简单改几个页面,而是从产品层面重新梳理差异化方案。  

首先调整了首页架构。将原本传统的功能导航模式重新设计,增加了新的内容展示区域,并改变了用户进入核心功能的路径。这样做的目的并不是单纯修改界面,而是让整个产品体验与原有方案形成明显区别。  

其次针对部分核心功能进行了重新包装。很多开发者喜欢直接使用行业通用名称,但实际上苹果更关注产品价值。因此我们重新定义了部分功能模块的定位,并增加了一些辅助功能,使整体产品逻辑更加完整。  

资源文件方面也进行了全面优化,包括启动页、引导页、截图素材以及部分图标资源。虽然这些内容不是审核重点,但能够帮助审核人员更直观地感受到产品差异化。  

最后针对代码层面进行了整理和优化。对于一些模板化特征明显的项目结构进行了调整,同时优化了部分资源引用方式,降低项目整体重复特征。  

## 为什么很多项目改了 UI 还是过不了?  

这是很多开发者最容易踩的坑。  

不少文章会告诉你收到 4.3 后换个 Logo、改个颜色、换套截图就可以重新提交,但实际上现在的苹果审核已经远不止看界面这么简单。  

苹果会综合分析应用的产品定位、功能结构、页面逻辑、资源文件甚至历史提交记录。如果一个项目本质上还是原来的产品,只是换了一层外观,那么审核团队依然有可能认为这是同一类应用。  

尤其是近几年 AI 编程工具普及之后,大量项目使用类似框架和模板开发,导致整体结构越来越接近。这也是为什么很多开发者明明修改了界面,却依然收到 4.3 的原因。  

## 关于 4.3(b) 的一些经验  

如果收到的是 4.3(b),除了应用本身之外,还需要关注提交环境和账号关联问题。  

苹果会记录开发者账号、证书信息、提交设备以及历史审核记录。如果短时间内连续提交多个功能类似的应用,即使应用本身没有明显问题,也有可能被认定为批量提交相似产品。  

因此在规划产品矩阵时,不建议采用简单复制的方式进行上架。不同应用之间最好具备独立的业务定位、独立的功能价值以及相对独立的运营方向,而不是简单更换名称和图标。  

## 总结  

从这次项目的处理结果来看,苹果 4.3(a) 和 4.3(b) 并不是单纯的代码问题,也不是简单修改 UI 就能够彻底解决的问题。真正影响审核结果的,往往是产品本身是否具备独立价值,以及苹果是否认可这是一款全新的应用。  

如果收到 4.3 反馈,建议先分析问题来源,再针对产品结构、功能设计、资源素材和代码特征进行系统调整,而不是盲目重复提交。很多时候,方向找对了,一次调整就能顺利通过审核;方向错了,即使提交十次,结果也不会发生太大变化。  

希望这次真实项目的处理经验,能够帮助正在被 4.3 困扰的开发者少走一些弯路。  

###最后审核通过的截图  

继续阅读 »

最近帮一个客户处理 App Store 上架问题时,连续遇到了苹果审核反馈的 4.3(a) 和 4.3(b)。最开始客户认为只是简单修改一下 Logo 和应用名称就能解决,但连续提交两次后依然被拒。经过一轮完整排查和调整后,最终顺利通过审核。今天就结合这次实际案例,聊聊苹果 4.3(a)、4.3(b) 的审核逻辑以及我们最终的处理思路,希望能给正在上架的开发者一些参考。  

## 苹果 4.3(a) 和 4.3(b) 到底是什么?  

很多开发者第一次看到 4.3 的时候都会比较懵,因为苹果给出的反馈内容通常比较笼统。但实际上,4.3(a) 和 4.3(b) 虽然同属于 Design - Spam 范畴,关注的重点却并不完全一样。  

4.3(a) 更多针对应用本身。苹果认为当前提交的 App 与 App Store 中已有应用存在较高相似度,缺乏独立产品价值。简单来说,就是审核团队觉得你的应用像是另一个应用的复制版本,即使更换了图标、名称或者启动页,也无法体现明显差异。  

而 4.3(b) 则更偏向于开发者维度。苹果会认为开发者正在批量提交多个功能类似的应用,从而试图占据更多搜索结果或榜单位置。这种情况经常出现在马甲包项目、矩阵项目或者同类型产品批量上架的场景中。  

## 本次项目遇到的问题  

这次客户提交的是一款工具类应用,功能本身没有违规内容,隐私协议和用户协议也已经配置完整。但提交审核后,很快收到了苹果反馈的 4.3(a)。  

最开始客户按照网上很多文章的做法,仅修改了应用图标、应用名称以及部分截图素材,然后再次提交审核。然而第二次审核结果并没有变化,依然被苹果拒绝。  

在进一步分析项目后,我们发现问题并不是出现在 Logo 或截图上,而是整个产品结构与市场上已有同类应用过于接近。从首页布局到导航方式,再到用户操作流程,都能够找到大量相似案例。  

后来苹果又补充反馈了 4.3(b),说明审核团队已经开始从开发者维度评估项目,而不仅仅是应用本身。  

## 我们是如何排查问题的?  

收到 4.3 之后,最忌讳的事情就是盲目重复提交。因为每一次提交都会留下审核记录,如果问题没有真正解决,多次拒审反而会增加后续审核难度。  

我们的第一步是先对项目进行相似度分析,而不是直接修改代码。通过对应用页面结构、资源文件以及整体业务流程进行检查后,发现应用存在几个明显问题。  

首先是首页布局与市场上同类产品高度接近。虽然颜色和图标不同,但整体模块排列方式基本一致。其次是功能入口设计过于模板化,用户打开 App 后看到的核心内容与多个竞品非常相似。最后是项目使用了一套较为常见的开发模板,代码结构和资源组织方式也存在明显的模板特征。  

这些问题单独来看可能并不严重,但叠加在一起后,就容易被苹果判定为缺乏独立性。  

## 最终做了哪些调整?  

确定问题方向后,我们并没有选择简单改几个页面,而是从产品层面重新梳理差异化方案。  

首先调整了首页架构。将原本传统的功能导航模式重新设计,增加了新的内容展示区域,并改变了用户进入核心功能的路径。这样做的目的并不是单纯修改界面,而是让整个产品体验与原有方案形成明显区别。  

其次针对部分核心功能进行了重新包装。很多开发者喜欢直接使用行业通用名称,但实际上苹果更关注产品价值。因此我们重新定义了部分功能模块的定位,并增加了一些辅助功能,使整体产品逻辑更加完整。  

资源文件方面也进行了全面优化,包括启动页、引导页、截图素材以及部分图标资源。虽然这些内容不是审核重点,但能够帮助审核人员更直观地感受到产品差异化。  

最后针对代码层面进行了整理和优化。对于一些模板化特征明显的项目结构进行了调整,同时优化了部分资源引用方式,降低项目整体重复特征。  

## 为什么很多项目改了 UI 还是过不了?  

这是很多开发者最容易踩的坑。  

不少文章会告诉你收到 4.3 后换个 Logo、改个颜色、换套截图就可以重新提交,但实际上现在的苹果审核已经远不止看界面这么简单。  

苹果会综合分析应用的产品定位、功能结构、页面逻辑、资源文件甚至历史提交记录。如果一个项目本质上还是原来的产品,只是换了一层外观,那么审核团队依然有可能认为这是同一类应用。  

尤其是近几年 AI 编程工具普及之后,大量项目使用类似框架和模板开发,导致整体结构越来越接近。这也是为什么很多开发者明明修改了界面,却依然收到 4.3 的原因。  

## 关于 4.3(b) 的一些经验  

如果收到的是 4.3(b),除了应用本身之外,还需要关注提交环境和账号关联问题。  

苹果会记录开发者账号、证书信息、提交设备以及历史审核记录。如果短时间内连续提交多个功能类似的应用,即使应用本身没有明显问题,也有可能被认定为批量提交相似产品。  

因此在规划产品矩阵时,不建议采用简单复制的方式进行上架。不同应用之间最好具备独立的业务定位、独立的功能价值以及相对独立的运营方向,而不是简单更换名称和图标。  

## 总结  

从这次项目的处理结果来看,苹果 4.3(a) 和 4.3(b) 并不是单纯的代码问题,也不是简单修改 UI 就能够彻底解决的问题。真正影响审核结果的,往往是产品本身是否具备独立价值,以及苹果是否认可这是一款全新的应用。  

如果收到 4.3 反馈,建议先分析问题来源,再针对产品结构、功能设计、资源素材和代码特征进行系统调整,而不是盲目重复提交。很多时候,方向找对了,一次调整就能顺利通过审核;方向错了,即使提交十次,结果也不会发生太大变化。  

希望这次真实项目的处理经验,能够帮助正在被 4.3 困扰的开发者少走一些弯路。  

###最后审核通过的截图  

收起阅读 »

苹果4.3(a)被拒怎么办?码尚友科技分享IPA相似度检测经验

苹果内购 苹果审核

很多开发者认为,苹果反馈 4.3(a) 之后,只要换个图标、改个名称、调整几个页面就能重新提交。

但实际审核过程中,大量应用即使已经更换 UI,依然会再次收到 4.3(a) 拒绝。

根据码尚友科技近两年处理的上架案例统计,苹果对于应用相似性的判断,早已不仅限于界面层面,而是从代码结构、资源文件、业务逻辑、提交环境等多个维度进行综合分析。

苹果4.3(a)到底在检测什么?

苹果审核团队希望每个应用都具备独立价值,而不是简单复制已有产品。

从实际案例来看,相似性检测主要集中在以下几个维度:

检测维度

权重占比(经验数据)

常见问题

代码结构

35%

相同工程模板、相同类结构

资源文件

25%

图片、音频、字体高度重复

功能逻辑

20%

页面流程一致

账号关联

10%

开发者账号存在关联

提交环境

10%

IP、设备环境异常

根据码尚友上架系统统计,在近1000+个处理案例中,仅修改UI但未优化代码结构的项目,二次收到4.3(a)反馈的比例超过72%。

为什么改了界面还是会收到4.3(a)?
很多开发团队只修改:

Logo
App名称
首页配色
部分文案
但实际上:

Controller结构未变化
API调用逻辑未变化
资源目录未变化
工程架构未变化
苹果机审依然能够识别出较高相似度。

因此:

UI差异 ≠ 应用差异

码尚友检测系统发现的高风险项
在项目提交前,我们会通过内部IPA分析工具进行检测。

重点检查:

1、代码相似度分析
检测内容:

类名结构
方法调用链
Framework引用情况
工程目录结构
示例:

检测项

风险等级

类名重复率85%

高风险

页面结构重复率78%

高风险

Framework一致率92%

高风险

图上是2个不相关的APP,所以相似度特别低,事实证明,相似度检测的确可以检测出2个app是否有关联,是否会被4.3a被拒

2、资源包检测
系统会扫描:

图片Hash值
音频文件
视频资源
字体资源
部分项目虽然更换了图片名称,但实际文件内容未变,依然会被识别。

3、业务流程分析
重点分析:

页面跳转路径
功能触发逻辑
用户使用流程
例如:

A应用:

首页 → 会员 → AI生成 → 保存

B应用:

首页 → VIP → AI创作 → 导出

虽然名称不同,但业务路径完全一致,仍然存在较高相似风险。

码尚友科技的解决思路
针对4.3(a)问题,我们通常从四个层面进行优化:

第一层:代码层优化
工程结构重组
模块重新划分
方法逻辑重构
类结构调整
第二层:资源层优化
图片重新设计
资源目录重建
字体资源调整
启动页重构
第三层:业务层优化
增加独立功能模块
调整用户路径
增加业务价值点
第四层:提交层优化
提交环境隔离
审核资料检测
开发者账号评估
历史版本关联分析
数据统计
根据码尚友科技2025-2026年上架案例统计:

项目类型

初次通过率

仅修改UI

28%

UI+资源优化

47%

UI+资源+代码优化

76%

完整检测后提交

结语
苹果4.3(a)并不是简单的“换壳检测”。

从近年的审核趋势来看,苹果对于代码结构、资源内容、业务逻辑以及开发环境的综合分析越来越严格。

如果项目已经连续收到4.3(a)反馈,建议在重新提交前进行完整的IPA检测和风险评估,而不是仅修改图标或界面。

码尚友科技自主研发的IPA检测系统,可针对代码结构、资源文件、业务逻辑及提交环境进行多维度分析,帮助开发者提前发现高风险项,提高审核通过率。

继续阅读 »

很多开发者认为,苹果反馈 4.3(a) 之后,只要换个图标、改个名称、调整几个页面就能重新提交。

但实际审核过程中,大量应用即使已经更换 UI,依然会再次收到 4.3(a) 拒绝。

根据码尚友科技近两年处理的上架案例统计,苹果对于应用相似性的判断,早已不仅限于界面层面,而是从代码结构、资源文件、业务逻辑、提交环境等多个维度进行综合分析。

苹果4.3(a)到底在检测什么?

苹果审核团队希望每个应用都具备独立价值,而不是简单复制已有产品。

从实际案例来看,相似性检测主要集中在以下几个维度:

检测维度

权重占比(经验数据)

常见问题

代码结构

35%

相同工程模板、相同类结构

资源文件

25%

图片、音频、字体高度重复

功能逻辑

20%

页面流程一致

账号关联

10%

开发者账号存在关联

提交环境

10%

IP、设备环境异常

根据码尚友上架系统统计,在近1000+个处理案例中,仅修改UI但未优化代码结构的项目,二次收到4.3(a)反馈的比例超过72%。

为什么改了界面还是会收到4.3(a)?
很多开发团队只修改:

Logo
App名称
首页配色
部分文案
但实际上:

Controller结构未变化
API调用逻辑未变化
资源目录未变化
工程架构未变化
苹果机审依然能够识别出较高相似度。

因此:

UI差异 ≠ 应用差异

码尚友检测系统发现的高风险项
在项目提交前,我们会通过内部IPA分析工具进行检测。

重点检查:

1、代码相似度分析
检测内容:

类名结构
方法调用链
Framework引用情况
工程目录结构
示例:

检测项

风险等级

类名重复率85%

高风险

页面结构重复率78%

高风险

Framework一致率92%

高风险

图上是2个不相关的APP,所以相似度特别低,事实证明,相似度检测的确可以检测出2个app是否有关联,是否会被4.3a被拒

2、资源包检测
系统会扫描:

图片Hash值
音频文件
视频资源
字体资源
部分项目虽然更换了图片名称,但实际文件内容未变,依然会被识别。

3、业务流程分析
重点分析:

页面跳转路径
功能触发逻辑
用户使用流程
例如:

A应用:

首页 → 会员 → AI生成 → 保存

B应用:

首页 → VIP → AI创作 → 导出

虽然名称不同,但业务路径完全一致,仍然存在较高相似风险。

码尚友科技的解决思路
针对4.3(a)问题,我们通常从四个层面进行优化:

第一层:代码层优化
工程结构重组
模块重新划分
方法逻辑重构
类结构调整
第二层:资源层优化
图片重新设计
资源目录重建
字体资源调整
启动页重构
第三层:业务层优化
增加独立功能模块
调整用户路径
增加业务价值点
第四层:提交层优化
提交环境隔离
审核资料检测
开发者账号评估
历史版本关联分析
数据统计
根据码尚友科技2025-2026年上架案例统计:

项目类型

初次通过率

仅修改UI

28%

UI+资源优化

47%

UI+资源+代码优化

76%

完整检测后提交

结语
苹果4.3(a)并不是简单的“换壳检测”。

从近年的审核趋势来看,苹果对于代码结构、资源内容、业务逻辑以及开发环境的综合分析越来越严格。

如果项目已经连续收到4.3(a)反馈,建议在重新提交前进行完整的IPA检测和风险评估,而不是仅修改图标或界面。

码尚友科技自主研发的IPA检测系统,可针对代码结构、资源文件、业务逻辑及提交环境进行多维度分析,帮助开发者提前发现高风险项,提高审核通过率。

收起阅读 »

成品微信药店商城小程序,合规开具电子处方,处方水印,二级分销,开源代码

**元岳科技自2021年起,专注药店商城小程序的研发与技术服务。已经服务全国上百家实体药店均有真实案例,欢迎联系客服咨询。
我们给您搭建的线上商城,已经经历过众多客户的使用与验证,市场反应良好,客户运营稳定,我们熟悉从准备材料到上架成功的全流程。
根据客户的反馈,不断完善系统功能自我进化,我们始终深耕药店的技术开发领域,做到专精。
主要功能:1,线上商城,已对接互联网医院,合规开具电子处方,提供处方药服务。
2,主图水印,自动给产品主图打上水印,合规不显示药品的功能和用量等信息
3,药品标签,分类别展示不同的产品标签,区分处方药,甲类otc,乙类otc.
4,合规要求,处方药设置营销活动,自动阻断,甲类OTC参加部分营销活动自动阻断。
5,小票打印,电子面单打印,快递发货,物流轨迹同步。
6,可提供渠道办理《互联网药品信息服务备案凭证》,全程协助指导,包上架成功。
。。。。。更多功能。。。。
技术栈:前端使用uniapp开发,后端php,thinkphp框架,前后端分离,二开更便捷。提供全靠开源代码,可定制开发。
电话:18678829759,同V.

继续阅读 »

**元岳科技自2021年起,专注药店商城小程序的研发与技术服务。已经服务全国上百家实体药店均有真实案例,欢迎联系客服咨询。
我们给您搭建的线上商城,已经经历过众多客户的使用与验证,市场反应良好,客户运营稳定,我们熟悉从准备材料到上架成功的全流程。
根据客户的反馈,不断完善系统功能自我进化,我们始终深耕药店的技术开发领域,做到专精。
主要功能:1,线上商城,已对接互联网医院,合规开具电子处方,提供处方药服务。
2,主图水印,自动给产品主图打上水印,合规不显示药品的功能和用量等信息
3,药品标签,分类别展示不同的产品标签,区分处方药,甲类otc,乙类otc.
4,合规要求,处方药设置营销活动,自动阻断,甲类OTC参加部分营销活动自动阻断。
5,小票打印,电子面单打印,快递发货,物流轨迹同步。
6,可提供渠道办理《互联网药品信息服务备案凭证》,全程协助指导,包上架成功。
。。。。。更多功能。。。。
技术栈:前端使用uniapp开发,后端php,thinkphp框架,前后端分离,二开更便捷。提供全靠开源代码,可定制开发。
电话:18678829759,同V.

收起阅读 »

苹果审核 3.2 被拒?大多数情况都离不开这三个原因,最后终于解决了,亲测有用

苹果内购 苹果审核 App离线打包 应用上架
# 苹果审核 3.2 被拒,很多人其实从一开始就找错了方向  
做 App 上架这些年,我发现一个很有意思的现象。  

同样收到苹果 3.2 的反馈,有的人改一次就过了,有的人连续改了十几个版本还是过不了。  

为什么?  

因为大部分人收到 3.2 后,第一反应就是改代码。 实际上,3.2 往往不是代码问题,而是苹果在审核过程中对你的账号、业务、产品真实性产生了怀疑。 换句话说,苹果审核的不是某个按钮,也不是某个页面,而是在判断: “你这个 App,到底是不是你描述的那个 App。” 从这个角度去理解,3.2 的问题其实可以归纳成三个层面。 --- # 第一种:苹果不相信你的账号 很多开发者觉得账号只是一个提交工具。 但在苹果眼里,账号本身就是产品的一部分。 如果一个账号曾经出现过违规记录,或者账号背后的开发环境、设备环境、网络环境存在异常,苹果首先怀疑的不是 App,而是开发者。 这就像一家店铺。 顾客进门之前,先看的是招牌。 如果招牌本身就有问题,后面卖什么已经不重要了。 所以很多项目明明功能正常,却总是卡在审核阶段。 真正的问题不在产品,而在账号信誉。 --- # 第二种:苹果不相信你的业务 很多团队会认为: “这个业务别人能做,我为什么不能做?” 实际上苹果审核并不是参考别人。 苹果审核的是: 这个业务是否符合苹果对 App Store 的定位。 有些产品从运营角度没有问题,但从苹果的角度来看,可能存在诱导、营销过重、功能价值不明确或者商业模式风险较高的问题。 这时候开发者会不断修改界面、调整文案。 但审核结果依旧一样。 原因很简单。 苹果关注的不是你首页长什么样,而是你的业务本质是什么。 如果业务表达方式和产品定位出现偏差,再漂亮的 UI 也解决不了问题。 --- # 第三种:苹果不相信你提交的版本 这是近两年越来越常见的一种情况。 很多开发者认为审核是考试。 于是提交一个版本给审核,审核通过后再把真正的功能放出来。 但苹果认为审核不是考试。 审核是验货。 你送过去的是什么,用户下载到的就应该是什么。 如果审核版本和实际运营版本存在明显差异,无论通过后台配置、远程参数还是功能开关实现,本质上都会让苹果觉得: “你给我看的和你准备卖给用户的不是同一个东西。” 一旦形成这种判断,后面的问题就不再是功能问题,而是信任问题。 --- # 在我看来,3.2 本质上只有一个原因 很多文章都在分析苹果审核规则。 但这些年处理下来,我越来越觉得: 3.2 本质上只有一个核心逻辑。 那就是苹果没有建立起对产品的信任。 账号有风险,信任降低。 业务表达不清晰,信任降低。 功能前后不一致,信任降低。 最终都会汇聚到同一个审核结果。 所以与其研究苹果为什么拒绝你,不如先思考: 苹果为什么不相信你。 当这个问题想明白了,很多整改方向自然就清晰了。 --- # 为什么我们的处理思路和别人不一样 很多服务商接到 3.2 项目后,第一步是改代码。 而我们的第一步通常是判断: 这个问题到底属于账号、业务还是产品。 因为这三种问题对应的是三套完全不同的解决方案。 账号问题看环境。 业务问题看定位。 功能问题看逻辑。 方向判断错了,再多修改都是无效工作。 这些年我们内部陆续搭建了上架档案系统、审核记录系统、代码检测系统、相似度检测系统以及环境管理体系。 这些工具最大的作用不是帮客户修改代码,而是帮助我们快速找到问题真正出现在哪个环节。 因为在苹果审核里面,找到问题,往往比解决问题更重要。 很多团队卡审几个月,最后发现只是一开始判断错了方向。 而这,恰恰是 3.2 最容易被忽略的地方。
继续阅读 »
# 苹果审核 3.2 被拒,很多人其实从一开始就找错了方向  
做 App 上架这些年,我发现一个很有意思的现象。  

同样收到苹果 3.2 的反馈,有的人改一次就过了,有的人连续改了十几个版本还是过不了。  

为什么?  

因为大部分人收到 3.2 后,第一反应就是改代码。 实际上,3.2 往往不是代码问题,而是苹果在审核过程中对你的账号、业务、产品真实性产生了怀疑。 换句话说,苹果审核的不是某个按钮,也不是某个页面,而是在判断: “你这个 App,到底是不是你描述的那个 App。” 从这个角度去理解,3.2 的问题其实可以归纳成三个层面。 --- # 第一种:苹果不相信你的账号 很多开发者觉得账号只是一个提交工具。 但在苹果眼里,账号本身就是产品的一部分。 如果一个账号曾经出现过违规记录,或者账号背后的开发环境、设备环境、网络环境存在异常,苹果首先怀疑的不是 App,而是开发者。 这就像一家店铺。 顾客进门之前,先看的是招牌。 如果招牌本身就有问题,后面卖什么已经不重要了。 所以很多项目明明功能正常,却总是卡在审核阶段。 真正的问题不在产品,而在账号信誉。 --- # 第二种:苹果不相信你的业务 很多团队会认为: “这个业务别人能做,我为什么不能做?” 实际上苹果审核并不是参考别人。 苹果审核的是: 这个业务是否符合苹果对 App Store 的定位。 有些产品从运营角度没有问题,但从苹果的角度来看,可能存在诱导、营销过重、功能价值不明确或者商业模式风险较高的问题。 这时候开发者会不断修改界面、调整文案。 但审核结果依旧一样。 原因很简单。 苹果关注的不是你首页长什么样,而是你的业务本质是什么。 如果业务表达方式和产品定位出现偏差,再漂亮的 UI 也解决不了问题。 --- # 第三种:苹果不相信你提交的版本 这是近两年越来越常见的一种情况。 很多开发者认为审核是考试。 于是提交一个版本给审核,审核通过后再把真正的功能放出来。 但苹果认为审核不是考试。 审核是验货。 你送过去的是什么,用户下载到的就应该是什么。 如果审核版本和实际运营版本存在明显差异,无论通过后台配置、远程参数还是功能开关实现,本质上都会让苹果觉得: “你给我看的和你准备卖给用户的不是同一个东西。” 一旦形成这种判断,后面的问题就不再是功能问题,而是信任问题。 --- # 在我看来,3.2 本质上只有一个原因 很多文章都在分析苹果审核规则。 但这些年处理下来,我越来越觉得: 3.2 本质上只有一个核心逻辑。 那就是苹果没有建立起对产品的信任。 账号有风险,信任降低。 业务表达不清晰,信任降低。 功能前后不一致,信任降低。 最终都会汇聚到同一个审核结果。 所以与其研究苹果为什么拒绝你,不如先思考: 苹果为什么不相信你。 当这个问题想明白了,很多整改方向自然就清晰了。 --- # 为什么我们的处理思路和别人不一样 很多服务商接到 3.2 项目后,第一步是改代码。 而我们的第一步通常是判断: 这个问题到底属于账号、业务还是产品。 因为这三种问题对应的是三套完全不同的解决方案。 账号问题看环境。 业务问题看定位。 功能问题看逻辑。 方向判断错了,再多修改都是无效工作。 这些年我们内部陆续搭建了上架档案系统、审核记录系统、代码检测系统、相似度检测系统以及环境管理体系。 这些工具最大的作用不是帮客户修改代码,而是帮助我们快速找到问题真正出现在哪个环节。 因为在苹果审核里面,找到问题,往往比解决问题更重要。 很多团队卡审几个月,最后发现只是一开始判断错了方向。 而这,恰恰是 3.2 最容易被忽略的地方。
收起阅读 »

为什么很多 AI 写出来的代码,更容易收到苹果 4.3 拒绝?


最近接触了不少客户,发现一个比较明显的现象。  

很多客户使用 AI 工具开发 App 后,测试运行都没问题,但一提交 App Store,没几天就收到苹果 4.3 的拒绝邮件。  

不少人第一反应是:  

"是不是苹果针对 AI 开发的 App?"  

实际上并不是。  

从我们这些年处理苹果上架的经验来看,苹果并不会因为你用了 AI 开发就拒绝你的应用,它关注的始终是应用本身的质量、独立性和价值。  

但是,AI 生成代码确实更容易踩到 4.3 的一些风险点。  

## 4.3 到底在审核什么?  

很多开发者觉得 4.3 是代码问题。  

实际上并不完全是。  

苹果 4.3 更多是在判断:  

你的 App 是不是一个真正独立的产品。  

如果审核人员认为:  

- 功能和市场上大量应用差不多  
- 产品结构高度相似  
- 页面布局没有明显区别  
- 代码特征存在大量复用痕迹  

那么就有可能被归类到 4.3。  

简单理解就是:  

苹果不希望 App Store 里面出现大量"换个名字就重新提交"的应用。  

## 为什么 AI 开发更容易出现这种情况?  

因为目前大部分 AI 生成代码的逻辑都比较接近。  

比如让 AI 开发一个工具类 App。  

它给出的方案通常都是:  

首页  

功能页  

个人中心  

设置页  

再配上常见的网络请求封装、数据存储方案以及标准化目录结构。  

从开发角度来说没有问题。  

但从苹果审核角度来看,这种项目往往缺少自己的特点。  

我们实际处理过不少案例。  

客户觉得自己是重新开发的产品,但审核人员看到的却是:  

又一个差不多的工具 App。  

又一个差不多的资讯 App。  

又一个差不多的商城 App。  

产品价值没有体现出来,自然更容易进入人工深度审核。  

## 代码相似度其实也是审核重点之一  

很多人觉得只要界面改了就行。  

实际上这些年苹果对于代码层面的检测能力一直在提升。  

特别是一些批量生成的项目。  

经常会出现:  

- 相同的目录结构  
- 相同的类名命名习惯  
- 相同的资源组织方式  
- 相同的业务逻辑流程  

虽然不一定完全一样,但整体特征非常接近。  

尤其是现在很多 AI 工具生成出来的项目,本身就带有固定模板特征。  

如果再叠加多个账号、多次提交,就容易被系统识别出来。  

## 很多问题其实出在产品包装上  

这些年遇到的 4.3 案例里面,有相当一部分代码本身并没有问题。  

问题出在产品包装。 比如: 应用名称没有特色; 截图内容过于普通; 功能介绍写得模糊; 审核备注过于简单; 产品场景表达不清楚; 用户价值无法体现。 开发者知道自己的产品是做什么的。 但审核人员并不知道。 当审核人员无法快速理解产品价值的时候,4.3 的概率就会明显增加。 ## 为什么同样的项目,有的人能过,有的人过不了? 因为苹果审核从来不是只看代码。 它会综合判断: - 产品定位 - 功能完整度 - 用户价值 - 账号历史 - 提交资料 - 代码结构 - 应用差异化程度 很多开发者把精力都放在开发上。 但实际上,上架审核本身也是一个专业环节。 ## 我们这些年处理 4.3 的经验 这些年帮客户处理苹果审核的时候,我们发现真正有效的方法并不是单纯修改代码。 而是从多个维度一起优化: 首先检查代码结构是否存在明显模板化特征; 其次检查产品功能是否具备独立价值; 然后重新梳理应用定位和审核说明; 同时排查截图、元数据、隐私配置等细节问题; 最后再结合账号历史和提交环境进行整体评估。 很多客户反复提交十几次都过不了。 调整完这些内容之后,反而一次就通过了。 ## 总结 AI 可以提高开发效率,这是毋庸置疑的。 但苹果审核看的从来不是代码是谁写的,而是你的 App 是否像一个真正独立、有价值的产品。 如果只是利用 AI 快速拼出一个应用框架,再简单修改一下界面就提交审核,那么收到 4.3 的概率确实会更高。 而如果在开发完成后,能够做好代码优化、产品差异化设计、审核资料整理以及风险排查,那么 AI 开发出来的项目同样可以顺利通过审核。 从我们这些年的上架经验来看,很多 4.3 并不是技术问题,而是产品和审核思路的问题。
继续阅读 »

最近接触了不少客户,发现一个比较明显的现象。  

很多客户使用 AI 工具开发 App 后,测试运行都没问题,但一提交 App Store,没几天就收到苹果 4.3 的拒绝邮件。  

不少人第一反应是:  

"是不是苹果针对 AI 开发的 App?"  

实际上并不是。  

从我们这些年处理苹果上架的经验来看,苹果并不会因为你用了 AI 开发就拒绝你的应用,它关注的始终是应用本身的质量、独立性和价值。  

但是,AI 生成代码确实更容易踩到 4.3 的一些风险点。  

## 4.3 到底在审核什么?  

很多开发者觉得 4.3 是代码问题。  

实际上并不完全是。  

苹果 4.3 更多是在判断:  

你的 App 是不是一个真正独立的产品。  

如果审核人员认为:  

- 功能和市场上大量应用差不多  
- 产品结构高度相似  
- 页面布局没有明显区别  
- 代码特征存在大量复用痕迹  

那么就有可能被归类到 4.3。  

简单理解就是:  

苹果不希望 App Store 里面出现大量"换个名字就重新提交"的应用。  

## 为什么 AI 开发更容易出现这种情况?  

因为目前大部分 AI 生成代码的逻辑都比较接近。  

比如让 AI 开发一个工具类 App。  

它给出的方案通常都是:  

首页  

功能页  

个人中心  

设置页  

再配上常见的网络请求封装、数据存储方案以及标准化目录结构。  

从开发角度来说没有问题。  

但从苹果审核角度来看,这种项目往往缺少自己的特点。  

我们实际处理过不少案例。  

客户觉得自己是重新开发的产品,但审核人员看到的却是:  

又一个差不多的工具 App。  

又一个差不多的资讯 App。  

又一个差不多的商城 App。  

产品价值没有体现出来,自然更容易进入人工深度审核。  

## 代码相似度其实也是审核重点之一  

很多人觉得只要界面改了就行。  

实际上这些年苹果对于代码层面的检测能力一直在提升。  

特别是一些批量生成的项目。  

经常会出现:  

- 相同的目录结构  
- 相同的类名命名习惯  
- 相同的资源组织方式  
- 相同的业务逻辑流程  

虽然不一定完全一样,但整体特征非常接近。  

尤其是现在很多 AI 工具生成出来的项目,本身就带有固定模板特征。  

如果再叠加多个账号、多次提交,就容易被系统识别出来。  

## 很多问题其实出在产品包装上  

这些年遇到的 4.3 案例里面,有相当一部分代码本身并没有问题。  

问题出在产品包装。 比如: 应用名称没有特色; 截图内容过于普通; 功能介绍写得模糊; 审核备注过于简单; 产品场景表达不清楚; 用户价值无法体现。 开发者知道自己的产品是做什么的。 但审核人员并不知道。 当审核人员无法快速理解产品价值的时候,4.3 的概率就会明显增加。 ## 为什么同样的项目,有的人能过,有的人过不了? 因为苹果审核从来不是只看代码。 它会综合判断: - 产品定位 - 功能完整度 - 用户价值 - 账号历史 - 提交资料 - 代码结构 - 应用差异化程度 很多开发者把精力都放在开发上。 但实际上,上架审核本身也是一个专业环节。 ## 我们这些年处理 4.3 的经验 这些年帮客户处理苹果审核的时候,我们发现真正有效的方法并不是单纯修改代码。 而是从多个维度一起优化: 首先检查代码结构是否存在明显模板化特征; 其次检查产品功能是否具备独立价值; 然后重新梳理应用定位和审核说明; 同时排查截图、元数据、隐私配置等细节问题; 最后再结合账号历史和提交环境进行整体评估。 很多客户反复提交十几次都过不了。 调整完这些内容之后,反而一次就通过了。 ## 总结 AI 可以提高开发效率,这是毋庸置疑的。 但苹果审核看的从来不是代码是谁写的,而是你的 App 是否像一个真正独立、有价值的产品。 如果只是利用 AI 快速拼出一个应用框架,再简单修改一下界面就提交审核,那么收到 4.3 的概率确实会更高。 而如果在开发完成后,能够做好代码优化、产品差异化设计、审核资料整理以及风险排查,那么 AI 开发出来的项目同样可以顺利通过审核。 从我们这些年的上架经验来看,很多 4.3 并不是技术问题,而是产品和审核思路的问题。
收起阅读 »

uni-app路由管理神器:vue-router风格体验

路由守卫 路由

@meng-xi/uni-router

为 uni-app 提供类似 vue-router 风格的路由管理系统(uni_modules 版本)。


特性

  • vue-router 风格 API - 熟悉的 push / replace / back 导航方式,零学习成本
  • 路由守卫 - 全局前置守卫 beforeEach、解析守卫 beforeResolve、后置钩子 afterEach、路由独享守卫 beforeEnter
  • 守卫超时保护 - 守卫未调用 next() 时自动中止导航,超时时间可配置(guardTimeout
  • 命名路由 - 通过 name 进行导航,无需硬编码路径字符串
  • 路由元信息 - meta 字段支持页面标题、权限标记、TabBar 标识等自定义数据
  • uni API 拦截 - 拦截 uni.navigateTo 等原生导航 API,确保守卫始终生效(interceptUniApi
  • 路由状态同步 - syncRoute() 将路由状态与实际页面栈同步,处理物理返回键等非路由器导航
  • 路由变化监听 - onRouteChange() 订阅路由状态变化,包括导航完成和状态同步
  • RouterLink 组件 - 声明式导航组件,支持 push / replace 模式和 @error 事件
  • TypeScript 类型提示 - 通过模块增强为路由名称和路径提供自动补全和类型检查
  • 错误处理 - 完整的 RouterError / NavigationFailure 体系,支持 onError 全局捕获
  • 组合式 API - useRouter() / useRoute() 在组件中便捷访问路由器
  • uni_modules 集成 - 通过 uni_modules 方式安装,无需 npm,开箱即用

📖 完整文档:https://mengxi-studio.github.io/uni-router/

安装

uni_modules(推荐)

mxuni-router 目录复制到项目的 uni_modules 目录下:

src/  
  └── uni_modules/  
        └── mxuni-router/  
              ├── js_sdk/  
              │     ├── index.js  
              │     ├── index.cjs  
              │     ├── index.d.ts  
              │     └── index.d.cts  
              ├── components/  
              │     └── mxuni-router/  
              │           └── mxuni-router.vue  
              ├── package.json  
              └── readme.md

npm

pnpm add @meng-xi/uni-router

npm 方式需将导入路径改为 @meng-xi/uni-router

快速开始

1. 创建路由器

// main.ts  
import { createSSRApp } from 'vue'  
import { createRouter } from './uni_modules/mxuni-router/js_sdk/index.js'  
import App from './App.vue'  

const router = createRouter({  
    routes: [  
        { path: 'pages/index/index', name: 'home', meta: { title: '首页' } },  
        { path: 'pages/about/about', name: 'about', meta: { title: '关于', requireAuth: true } },  
        { path: 'pages/user/user', name: 'user', meta: { title: '我的', isTab: true } }  
    ],  
    strict: true  
})  

export function createApp() {  
    const app = createSSRApp(App)  
    app.use(router)  
    return { app }  
}

2. 路由导航

import { useRouter, useRoute } from './uni_modules/mxuni-router/js_sdk/index.js'  

// 在组件 setup 中使用  
const router = useRouter()  
const route = useRoute()  

// 路径导航  
await router.push('/pages/about/about')  
await router.push({ path: '/pages/about/about', query: { id: '1' } })  

// 命名导航  
await router.push({ name: 'about' })  

// 返回  
await router.back()  
await router.back(2) // 返回两级

3. 路由守卫

// 全局前置守卫 - 登录验证  
router.beforeEach((to, from, next) => {  
    if (to.meta.requireAuth && !isLoggedIn()) {  
        next({ name: 'login', query: { redirect: to.fullPath } })  
    } else {  
        next()  
    }  
})  

// 全局后置钩子  
router.afterEach((to, from) => {  
    console.log(`导航完成: ${from.path} → ${to.path}`)  
})

4. 自动生成路由配置(推荐)

配合 @meng-xi/vite-plugingenerateRouter 插件,可从 pages.json 自动生成路由配置和类型声明:

pnpm add @meng-xi/vite-plugin -D
// vite.config.ts  
import { defineConfig } from 'vite'  
import uni from '@dcloudio/vite-plugin-uni'  
import { generateRouter } from '@meng-xi/vite-plugin'  

export default defineConfig({  
    plugins: [  
        uni(),  
        generateRouter({  
            pagesJsonPath: 'src/pages.json',  
            outputPath: 'src/router.config.ts',  
            dts: true,  
            metaMapping: {  
                navigationBarTitleText: 'title',  
                requireAuth: 'requireAuth'  
            }  
        })  
    ]  
})

然后在 main.ts 中导入生成的路由配置:

import { createRouter } from './uni_modules/mxuni-router/js_sdk/index.js'  
import routes from './router.config'  

const router = createRouter({ routes })

API 概览

核心

API 说明
createRouter(options) 创建路由器实例
useRouter() 获取路由器实例(组合式 API)
useRoute() 获取当前路由位置(组合式 API)

Router 实例方法

方法 说明
router.push(location) 导航到新页面
router.replace(location) 替换当前页面
router.back(delta?) 返回上一页或多级页面
router.beforeEach(guard) 注册全局前置守卫
router.beforeResolve(guard) 注册全局解析守卫
router.afterEach(guard) 注册全局后置钩子
router.onError(handler) 注册错误处理回调
router.resolve(location) 解析路由位置(不导航)
router.getRoutes() 获取所有路由配置
router.hasRoute(name) 检查路由是否存在
router.isReady() 等待路由器初始化完成
router.onRouteChange(listener) 注册路由变化监听器
router.syncRoute() 同步路由状态与实际页面栈

错误码

错误码 说明
NAVIGATION_ABORTED 导航被守卫中止
NAVIGATION_CANCELLED 导航被取消(守卫异常或重定向超限)
NAVIGATION_DUPLICATED 重复导航到当前位置
ROUTE_NOT_FOUND 未找到匹配的路由
NAVIGATION_API_ERROR uni 导航 API 调用失败
SETUP_ERROR 路由器初始化或使用方式错误

RouterOptions 配置项

选项 类型 默认值 说明
routes RouteConfig[] - 路由配置列表,需与 pages.json 中的页面声明保持一致
strict boolean true 是否启用严格模式,启用后未匹配的命名路由将抛出异常
interceptUniApi boolean false 是否拦截 uni.navigateTo 等原生导航 API,启用后直接调用 uni API 将转由路由器处理,确保守卫生效
guardTimeout number 10000 守卫超时时间(毫秒),超时后自动中止导航并输出警告,设为 0 可禁用

RouterLink 组件

声明式导航组件,对应 uni-app 的 <navigator>,自动通过路由器执行导航。

<!-- 路径导航 -->  
<mxuni-router to="/pages/about/about">  
    <view>跳转到关于页</view>  
</mxuni-router>  

<!-- replace 模式 -->  
<mxuni-router to="/pages/about/about" replace>  
    <view>替换当前页</view>  
</mxuni-router>  

<!-- 捕获导航失败 -->  
<mxuni-router to="/pages/about/about" @error="onNavError">  
    <view>跳转</view>  
</mxuni-router>
属性 类型 默认值 说明
to RouteLocationRaw - 目标路由位置
replace boolean false 是否使用替换模式导航
hoverClass string 'navigator-hover' 按下时的样式类
hoverStopPropagation boolean false 是否阻止祖先节点的点击态
hoverStartTime number 50 按住后多久出现点击态(ms)
hoverStayTime number 600 手指松开后点击态保留时间(ms)
事件 参数 说明
error NavigationFailure 导航失败时触发

TypeScript 类型提示

启用 dts: true 后,generateRouter 插件自动生成类型声明文件,为路由导航提供类型安全:

// 路由名称自动补全  
router.push({ name: 'pagesIndexIndex' }) // ✅ 自动补全  
router.push({ name: 'invalidName' }) // ❌ 类型错误  

// 路径自动补全  
router.push({ path: '/pages/index/index' }) // ✅ 自动补全  
router.push({ path: '/invalid/path' }) // ❌ 类型错误

与 pages.json 的关系

Uni Router 不替代 pages.json,而是与之配合使用:

职责 pages.json Uni Router
页面注册 必须声明 不负责
路由导航 uni.navigateTo 等 push / replace / back
路由守卫 不支持 beforeEach 等
路由元信息 不支持 meta 字段
命名路由 不支持 name 字段

License

MIT

继续阅读 »

@meng-xi/uni-router

为 uni-app 提供类似 vue-router 风格的路由管理系统(uni_modules 版本)。


特性

  • vue-router 风格 API - 熟悉的 push / replace / back 导航方式,零学习成本
  • 路由守卫 - 全局前置守卫 beforeEach、解析守卫 beforeResolve、后置钩子 afterEach、路由独享守卫 beforeEnter
  • 守卫超时保护 - 守卫未调用 next() 时自动中止导航,超时时间可配置(guardTimeout
  • 命名路由 - 通过 name 进行导航,无需硬编码路径字符串
  • 路由元信息 - meta 字段支持页面标题、权限标记、TabBar 标识等自定义数据
  • uni API 拦截 - 拦截 uni.navigateTo 等原生导航 API,确保守卫始终生效(interceptUniApi
  • 路由状态同步 - syncRoute() 将路由状态与实际页面栈同步,处理物理返回键等非路由器导航
  • 路由变化监听 - onRouteChange() 订阅路由状态变化,包括导航完成和状态同步
  • RouterLink 组件 - 声明式导航组件,支持 push / replace 模式和 @error 事件
  • TypeScript 类型提示 - 通过模块增强为路由名称和路径提供自动补全和类型检查
  • 错误处理 - 完整的 RouterError / NavigationFailure 体系,支持 onError 全局捕获
  • 组合式 API - useRouter() / useRoute() 在组件中便捷访问路由器
  • uni_modules 集成 - 通过 uni_modules 方式安装,无需 npm,开箱即用

📖 完整文档:https://mengxi-studio.github.io/uni-router/

安装

uni_modules(推荐)

mxuni-router 目录复制到项目的 uni_modules 目录下:

src/  
  └── uni_modules/  
        └── mxuni-router/  
              ├── js_sdk/  
              │     ├── index.js  
              │     ├── index.cjs  
              │     ├── index.d.ts  
              │     └── index.d.cts  
              ├── components/  
              │     └── mxuni-router/  
              │           └── mxuni-router.vue  
              ├── package.json  
              └── readme.md

npm

pnpm add @meng-xi/uni-router

npm 方式需将导入路径改为 @meng-xi/uni-router

快速开始

1. 创建路由器

// main.ts  
import { createSSRApp } from 'vue'  
import { createRouter } from './uni_modules/mxuni-router/js_sdk/index.js'  
import App from './App.vue'  

const router = createRouter({  
    routes: [  
        { path: 'pages/index/index', name: 'home', meta: { title: '首页' } },  
        { path: 'pages/about/about', name: 'about', meta: { title: '关于', requireAuth: true } },  
        { path: 'pages/user/user', name: 'user', meta: { title: '我的', isTab: true } }  
    ],  
    strict: true  
})  

export function createApp() {  
    const app = createSSRApp(App)  
    app.use(router)  
    return { app }  
}

2. 路由导航

import { useRouter, useRoute } from './uni_modules/mxuni-router/js_sdk/index.js'  

// 在组件 setup 中使用  
const router = useRouter()  
const route = useRoute()  

// 路径导航  
await router.push('/pages/about/about')  
await router.push({ path: '/pages/about/about', query: { id: '1' } })  

// 命名导航  
await router.push({ name: 'about' })  

// 返回  
await router.back()  
await router.back(2) // 返回两级

3. 路由守卫

// 全局前置守卫 - 登录验证  
router.beforeEach((to, from, next) => {  
    if (to.meta.requireAuth && !isLoggedIn()) {  
        next({ name: 'login', query: { redirect: to.fullPath } })  
    } else {  
        next()  
    }  
})  

// 全局后置钩子  
router.afterEach((to, from) => {  
    console.log(`导航完成: ${from.path} → ${to.path}`)  
})

4. 自动生成路由配置(推荐)

配合 @meng-xi/vite-plugingenerateRouter 插件,可从 pages.json 自动生成路由配置和类型声明:

pnpm add @meng-xi/vite-plugin -D
// vite.config.ts  
import { defineConfig } from 'vite'  
import uni from '@dcloudio/vite-plugin-uni'  
import { generateRouter } from '@meng-xi/vite-plugin'  

export default defineConfig({  
    plugins: [  
        uni(),  
        generateRouter({  
            pagesJsonPath: 'src/pages.json',  
            outputPath: 'src/router.config.ts',  
            dts: true,  
            metaMapping: {  
                navigationBarTitleText: 'title',  
                requireAuth: 'requireAuth'  
            }  
        })  
    ]  
})

然后在 main.ts 中导入生成的路由配置:

import { createRouter } from './uni_modules/mxuni-router/js_sdk/index.js'  
import routes from './router.config'  

const router = createRouter({ routes })

API 概览

核心

API 说明
createRouter(options) 创建路由器实例
useRouter() 获取路由器实例(组合式 API)
useRoute() 获取当前路由位置(组合式 API)

Router 实例方法

方法 说明
router.push(location) 导航到新页面
router.replace(location) 替换当前页面
router.back(delta?) 返回上一页或多级页面
router.beforeEach(guard) 注册全局前置守卫
router.beforeResolve(guard) 注册全局解析守卫
router.afterEach(guard) 注册全局后置钩子
router.onError(handler) 注册错误处理回调
router.resolve(location) 解析路由位置(不导航)
router.getRoutes() 获取所有路由配置
router.hasRoute(name) 检查路由是否存在
router.isReady() 等待路由器初始化完成
router.onRouteChange(listener) 注册路由变化监听器
router.syncRoute() 同步路由状态与实际页面栈

错误码

错误码 说明
NAVIGATION_ABORTED 导航被守卫中止
NAVIGATION_CANCELLED 导航被取消(守卫异常或重定向超限)
NAVIGATION_DUPLICATED 重复导航到当前位置
ROUTE_NOT_FOUND 未找到匹配的路由
NAVIGATION_API_ERROR uni 导航 API 调用失败
SETUP_ERROR 路由器初始化或使用方式错误

RouterOptions 配置项

选项 类型 默认值 说明
routes RouteConfig[] - 路由配置列表,需与 pages.json 中的页面声明保持一致
strict boolean true 是否启用严格模式,启用后未匹配的命名路由将抛出异常
interceptUniApi boolean false 是否拦截 uni.navigateTo 等原生导航 API,启用后直接调用 uni API 将转由路由器处理,确保守卫生效
guardTimeout number 10000 守卫超时时间(毫秒),超时后自动中止导航并输出警告,设为 0 可禁用

RouterLink 组件

声明式导航组件,对应 uni-app 的 <navigator>,自动通过路由器执行导航。

<!-- 路径导航 -->  
<mxuni-router to="/pages/about/about">  
    <view>跳转到关于页</view>  
</mxuni-router>  

<!-- replace 模式 -->  
<mxuni-router to="/pages/about/about" replace>  
    <view>替换当前页</view>  
</mxuni-router>  

<!-- 捕获导航失败 -->  
<mxuni-router to="/pages/about/about" @error="onNavError">  
    <view>跳转</view>  
</mxuni-router>
属性 类型 默认值 说明
to RouteLocationRaw - 目标路由位置
replace boolean false 是否使用替换模式导航
hoverClass string 'navigator-hover' 按下时的样式类
hoverStopPropagation boolean false 是否阻止祖先节点的点击态
hoverStartTime number 50 按住后多久出现点击态(ms)
hoverStayTime number 600 手指松开后点击态保留时间(ms)
事件 参数 说明
error NavigationFailure 导航失败时触发

TypeScript 类型提示

启用 dts: true 后,generateRouter 插件自动生成类型声明文件,为路由导航提供类型安全:

// 路由名称自动补全  
router.push({ name: 'pagesIndexIndex' }) // ✅ 自动补全  
router.push({ name: 'invalidName' }) // ❌ 类型错误  

// 路径自动补全  
router.push({ path: '/pages/index/index' }) // ✅ 自动补全  
router.push({ path: '/invalid/path' }) // ❌ 类型错误

与 pages.json 的关系

Uni Router 不替代 pages.json,而是与之配合使用:

职责 pages.json Uni Router
页面注册 必须声明 不负责
路由导航 uni.navigateTo 等 push / replace / back
路由守卫 不支持 beforeEach 等
路由元信息 不支持 meta 字段
命名路由 不支持 name 字段

License

MIT

收起阅读 »