HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

通过自定义弹窗实现自定义样式的Toast

toast

问题现象
HarmonyOS的Toast接口,不支持设定圆角样式。如何实现类似其他平台的Toast样式?

效果预览
点击放大

背景知识
不依赖UI组件的全局自定义弹出框(openCustomDialog),适用于在相对应用复杂的场景来实现自定义弹出框,相较于CustomDialogController优势点在于页面解耦,支持动态刷新。
ArkUI提供轻量的UI元素复用机制@Builder,其内部UI结构固定,仅与使用方进行数据传递。可将重复使用的UI元素抽象成函数,在build函数中调用。
Text组件可以自定义展示文本框的UI样式,包括边框圆角、内边距等。
setTimeout接口支持设置一个定时器,该定时器在定时器到期后执行一个函数。
解决方案
如果需要实现类似其他平台的Toast样式,可借助自定义弹窗实现。

主要实现思路为,借助Text组件自定义类似其他平台Toast的UI样式,并封装为@Builder构建函数,将该函数传入ComponentContent创建弹窗对象,通过getUIContext开启该弹窗对象,开启后执行setTimeout,等待指定的时间后,执行关闭弹窗对象。详细步骤如下:

配置ToastContent组件属性并封装为@Builder构建函数。
@Component
struct ToastContent {
public text: string = '';
public clickText: string = '';
public clickListener = () => {
};
private textList: string[] = [];

aboutToAppear(): void {
if (this.clickText.length > 0) {
this.textList = this.text.split(this.clickText);
}
}

build() {
Column() {
if (this.clickText === '') {
Text(this.text).toastText();
} else {
Text() {
ForEach(this.textList, (item: string, num: number) => {
Span(item);
if (num < this.textList.length - 1) {
Span(this.clickText).fontColor(Color.Yellow);
}
});
}.onClick(this.clickListener).toastText();
}
}
.borderRadius(5)
.backgroundColor(Color.Black)
.padding(10)
.justifyContent(FlexAlign.SpaceBetween)
.margin({ left: '5%', right: '5%' });
}
}

// 封装Toast的@Builder方法
@Builder
function buildText(params: Params) {
ToastContent({ text: params.text, clickText: params.clickText, clickListener: params.clickListener });
}

// 封装公共样式
@Extend(Text)
function toastText() {
.fontSize(20)
.fontColor(Color.White);
}
创建Toast类,并创建构造方法与Toast实例方法。
/**

  • 封装全局蓝色浮动提示,支持点击
    */
    export class Toast {
    private toastParams: Params;

    constructor(text: string, time: number = 2000) {
    this.toastParams = new Params(text, time);
    }

    setClick(clickText: string, clickListener: () => void): Toast {
    this.toastParams.setClick(clickText, clickListener);
    return this;
    };

    async show() {
    let uiContext = AppStorage.get('currentUIContext') as UIContext;
    let click = this.toastParams.clickListener;
    let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), this.toastParams);
    uiContext.getPromptAction().openCustomDialog(contentNode, {
    showInSubWindow: this.toastParams.clickText === '' ? false : true,
    isModal: false,
    offset: { dx: 0, dy: '10%' }
    }).then(() => {
    setTimeout(() => {
    uiContext.getPromptAction().closeCustomDialog(contentNode);
    }, this.toastParams.time);
    });
    this.toastParams.clickListener = () => {
    click();
    uiContext.getPromptAction().closeCustomDialog(contentNode);
    };
    };
    }
    创建并弹出Toast,并且可以在Toast的setClick回调方法内实现点击Toast后的逻辑,如页面跳转。
    new Toast('点击Toast后屏幕将退出横屏,进入到竖屏状态', 3000).setClick('关闭自动添加', () => {
    this.windowClass.setPreferredOrientation(window.Orientation.PORTRAIT);
    this.pathStack.pushPathByName('DetailPage', null);
    }).show();
    完整示例参考如下:

Index.ets。
import { common } from '@kit.AbilityKit';
import { Toast } from './ToastContent';
import { window } from '@kit.ArkUI';

@Entry
@Component
struct Index {
pathStack: NavPathStack = new NavPathStack();
private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
private windowClass = (this.context as common.UIAbilityContext).windowStage.getMainWindowSync();

setOrientation(orientation: number) {
this.windowClass.setPreferredOrientation(orientation).then(() => {
}).catch(() => {
});
}

async aboutToAppear(): Promise<void> {
await this.windowClass.setPreferredOrientation(window.Orientation.LANDSCAPE);
AppStorage.setOrCreate('currentUIContext', this.getUIContext());
}

build() {
Navigation(this.pathStack) {
RelativeContainer() {
Column() {
Text('我的记录')
.fontSize(50)
.width('100%')
.textAlign(TextAlign.Center)
.fontWeight(FontWeight.Bold)
Button('保存')
.onClick(() => {
new Toast('点击Toast后屏幕将退出横屏,进入到竖屏状态', 3000).setClick('关闭自动添加', () => {
this.windowClass.setPreferredOrientation(window.Orientation.PORTRAIT);
this.pathStack.pushPathByName('DetailPage', null);
}).show();
})
.backgroundColor(Color.Blue)
.fontColor(Color.White)
}
.alignRules({
center: { anchor: 'container', align: VerticalAlign.Center },
middle: { anchor: 'container', align: HorizontalAlign.Center }
})
}
.width('100%')
}
.mode(NavigationMode.Stack)
.height('100%')
.width('100%')
.height('100%')
.hideTitleBar(true)
}
}
https://pastebin.com/nwKPmmLF
https://pastebin.com/DwxhFWzG
https://pastebin.com/Jtg4RcM0
https://pastebin.com/7BvUaREN
https://pastebin.com/LGejrMwK
https://pastebin.com/V0qPwT9h
https://pastebin.com/tQzSevWd
https://pastebin.com/qncxPzug
https://pastebin.com/QNF651jK
https://pastebin.com/t3ZuR3CR
https://pastebin.com/H2PDqsEW
https://pastebin.com/Z7Wc9nic
https://pastebin.com/ECKtGAaJ
https://pastebin.com/EwXrd6qT
https://pastebin.com/HgYXSSrk
https://pastebin.com/uK3jyvu5
https://pastebin.com/vHzZdj9J
https://pastebin.com/sAMfi1Pz
https://pastebin.com/kVhLAgHT
https://pastebin.com/nkBEKJz4
https://pastebin.com/GrAvgxVg
https://pastebin.com/Umn0eUXt
https://pastebin.com/ut2dn5iH
https://pastebin.com/NgPFqHpy
https://pastebin.com/7e62WCL1
https://pastebin.com/wDM3tM66
https://pastebin.com/pwUhGKDv
https://pastebin.com/YvwB4xBj
https://pastebin.com/mzAxKZES
https://pastebin.com/NpnmdKf1
https://pastebin.com/C1FBURkc
https://pastebin.com/y0KsuZgB
https://pastebin.com/g7nDScSb
https://pastebin.com/7mDcGwtR
https://pastebin.com/3xV61sHt
https://pastebin.com/iQakPefn
https://pastebin.com/0CWW1Xta
https://pastebin.com/90zmcK10
https://pastebin.com/6CH0bCbh
https://pastebin.com/b6zdrzYw
https://pastebin.com/414XDcCa
https://pastebin.com/Mf0rTkWN
https://pastebin.com/gT4iprCN
https://pastebin.com/qeDfQegQ
https://pastebin.com/1e4vRx0y
https://pastebin.com/kGZUceQg
https://pastebin.com/9ustBt9n
https://pastebin.com/N4kwVZns
https://pastebin.com/qkBjMdA7
https://pastebin.com/w6XX4ciC
https://pastebin.com/54cBU8ze
https://pastebin.com/1mnAuUDZ
https://pastebin.com/VsgcjvTE
https://pastebin.com/wP31PyVb
https://pastebin.com/XPBk0zv8
https://pastebin.com/QRE1qguw
https://pastebin.com/iQpMss7p
https://pastebin.com/kKCXTdF9
https://pastebin.com/EwBniqXp
https://pastebin.com/A7LEwGq8
https://pastebin.com/XtXPS80z
https://pastebin.com/ghHSfqUZ
https://pastebin.com/pEH2u4Mj
https://pastebin.com/GiE2VShc
https://pastebin.com/NmfaPSX3
https://pastebin.com/fBfZs9d9
https://pastebin.com/CcHrZqng
https://pastebin.com/DcALJUNr
https://pastebin.com/hvGqEU4c
https://pastebin.com/HSf8h6BJ
https://pastebin.com/SCNykcCB
https://pastebin.com/RAnMDpBN
https://pastebin.com/0bbYFAG1
https://pastebin.com/6LjMvDuD
https://pastebin.com/u8dUE6wL
https://pastebin.com/8jVE6YLs
https://pastebin.com/xv6kzZyF
https://pastebin.com/L5WMJb5t
https://pastebin.com/sbe7FFD4
https://pastebin.com/aU4YUWDr
https://pastebin.com/3Z1YFmFW
https://pastebin.com/XvqqwSxq
https://pastebin.com/mJX0WRsc
https://pastebin.com/SGkjCXRB
https://pastebin.com/zv8zAxMd
https://pastebin.com/4bRTkCkm
https://pastebin.com/5s9JtWfS
https://pastebin.com/4VVU6Cxg
https://pastebin.com/TewUpi9F
https://pastebin.com/LKZwmBSi
https://pastebin.com/mu27p7w7
https://pastebin.com/JtiF4S2E
https://pastebin.com/xpeq692Q
https://pastebin.com/ypMqWqLC
https://pastebin.com/NrF7S04d
https://pastebin.com/j3riqEAh
https://pastebin.com/6iWCgpuJ
https://pastebin.com/s6KVgTgr
https://pastebin.com/1760APmp
https://pastebin.com/T6LTqjHK
https://pastebin.com/ttGrUAd7
https://pastebin.com/0PQTrPXK
https://pastebin.com/ZtmvtT35
https://pastebin.com/8TjBbUcR
https://pastebin.com/bYCv91Zb
https://pastebin.com/fpZrFF5w
https://pastebin.com/nrXWRsTd
https://pastebin.com/p4UWmpHz
https://pastebin.com/FUkFJhvg
https://pastebin.com/iBPFDUJ3
https://pastebin.com/ET0iD33D
https://pastebin.com/iwPwXsca
https://pastebin.com/8mmzg8p6
https://pastebin.com/8342WqK5
https://pastebin.com/pwYYMgbq
https://pastebin.com/cRgWPHH1
https://pastebin.com/rzyEfV9J
https://pastebin.com/kkAZWims
https://pastebin.com/fQn41cHZ
https://pastebin.com/fJ8vJ8be
https://pastebin.com/SzcAwdbu
https://pastebin.com/pCWkDayj
https://pastebin.com/L9pkse7j
https://pastebin.com/FxKwn5ng
https://pastebin.com/vFCLDqaV
https://pastebin.com/NRnYdnNH
https://pastebin.com/2ER3wSYv
https://pastebin.com/Q3YCRgG6
https://pastebin.com/YFaNTgNN
https://pastebin.com/9n9shZLu
https://pastebin.com/PBbWWUgX
https://pastebin.com/2R5pKJLh
https://pastebin.com/k2yY9ULe
https://pastebin.com/CJph4hrD
https://pastebin.com/6EwGM5CL
https://pastebin.com/DELYFAem
https://pastebin.com/Ggv8dLaa
https://pastebin.com/vM0r7xLq
https://pastebin.com/nbPGG85J
https://pastebin.com/ZVvYnFre
https://pastebin.com/LjJ9AwB9
https://pastebin.com/6hq2KXML
https://pastebin.com/pugZBcNi
https://pastebin.com/pmPvrW9q
https://pastebin.com/fhueU8S6
https://pastebin.com/kQazy17K
https://pastebin.com/VfTbduXf
https://pastebin.com/pXjYSwfd
https://pastebin.com/hUUnksFb
https://pastebin.com/AGnzrkpi
https://pastebin.com/s9jXdQ2e
https://pastebin.com/tkNdPSWm
https://pastebin.com/buGSwi0Q
https://pastebin.com/iqyy4wdi
https://pastebin.com/RiGF4W7H
https://pastebin.com/pxNKyFmV
https://pastebin.com/WwXY1ryk
https://pastebin.com/dNHDcvEE
https://pastebin.com/dstyKVbw
https://pastebin.com/recG0Tg4
https://pastebin.com/Bu8wxzkr
https://pastebin.com/FuZgbtXf
https://pastebin.com/56Ze2VPk
https://pastebin.com/qYG0243R
https://pastebin.com/AZ8iKJWf
https://pastebin.com/hNwShQks
https://pastebin.com/P8iaLhZF
https://pastebin.com/Dm05MGfE
https://pastebin.com/zamDMZgY
https://pastebin.com/7iyftr84
https://pastebin.com/0NssQJ78
https://pastebin.com/kdxr8s0Z
https://pastebin.com/awjDqW6h
https://pastebin.com/GWgZwDB6
https://pastebin.com/riTJWSts
https://pastebin.com/6dmkXAhN
https://pastebin.com/XZLHY1iX
https://pastebin.com/my97aREv
https://pastebin.com/H09exPyA
https://pastebin.com/Jjw8R1hF
https://pastebin.com/hm4qKthR
https://pastebin.com/G9uVUmcV
https://pastebin.com/Z4ZGXCbg
https://pastebin.com/zttcE8aT
https://pastebin.com/ieWfnuEy
https://pastebin.com/EnmdLmjw
https://pastebin.com/q7Nj4JEA
https://pastebin.com/cCnrQ8ft
https://pastebin.com/zt89NyCc
https://pastebin.com/cV5KJRUN
https://pastebin.com/e4pzjDm2
https://pastebin.com/rGb2fsmp
https://pastebin.com/q8ikYfF0
https://pastebin.com/y9e0KRNW
https://pastebin.com/r3qCSEu5
https://pastebin.com/H37KdV5m
https://pastebin.com/SREPy9Lr
https://pastebin.com/25JSeDYG
https://pastebin.com/j2a0BJdf
https://pastebin.com/pGbzGr3L
https://pastebin.com/1WJkKeyt
https://pastebin.com/DPDXbJ9L
https://pastebin.com/4gGEvFSt
https://pastebin.com/L0HCPVB0
https://pastebin.com/0eQjwvaY
https://pastebin.com/rzSNBFS8
https://pastebin.com/NWi9hui6
https://pastebin.com/xPjT5mxu
https://pastebin.com/e5neTg7h
https://pastebin.com/TZnwGHx4
https://pastebin.com/Tb98uyxA
https://pastebin.com/DPcVtW6C
https://pastebin.com/zZ7bNVBg
https://pastebin.com/yVQXZ1T1

继续阅读 »

问题现象
HarmonyOS的Toast接口,不支持设定圆角样式。如何实现类似其他平台的Toast样式?

效果预览
点击放大

背景知识
不依赖UI组件的全局自定义弹出框(openCustomDialog),适用于在相对应用复杂的场景来实现自定义弹出框,相较于CustomDialogController优势点在于页面解耦,支持动态刷新。
ArkUI提供轻量的UI元素复用机制@Builder,其内部UI结构固定,仅与使用方进行数据传递。可将重复使用的UI元素抽象成函数,在build函数中调用。
Text组件可以自定义展示文本框的UI样式,包括边框圆角、内边距等。
setTimeout接口支持设置一个定时器,该定时器在定时器到期后执行一个函数。
解决方案
如果需要实现类似其他平台的Toast样式,可借助自定义弹窗实现。

主要实现思路为,借助Text组件自定义类似其他平台Toast的UI样式,并封装为@Builder构建函数,将该函数传入ComponentContent创建弹窗对象,通过getUIContext开启该弹窗对象,开启后执行setTimeout,等待指定的时间后,执行关闭弹窗对象。详细步骤如下:

配置ToastContent组件属性并封装为@Builder构建函数。
@Component
struct ToastContent {
public text: string = '';
public clickText: string = '';
public clickListener = () => {
};
private textList: string[] = [];

aboutToAppear(): void {
if (this.clickText.length > 0) {
this.textList = this.text.split(this.clickText);
}
}

build() {
Column() {
if (this.clickText === '') {
Text(this.text).toastText();
} else {
Text() {
ForEach(this.textList, (item: string, num: number) => {
Span(item);
if (num < this.textList.length - 1) {
Span(this.clickText).fontColor(Color.Yellow);
}
});
}.onClick(this.clickListener).toastText();
}
}
.borderRadius(5)
.backgroundColor(Color.Black)
.padding(10)
.justifyContent(FlexAlign.SpaceBetween)
.margin({ left: '5%', right: '5%' });
}
}

// 封装Toast的@Builder方法
@Builder
function buildText(params: Params) {
ToastContent({ text: params.text, clickText: params.clickText, clickListener: params.clickListener });
}

// 封装公共样式
@Extend(Text)
function toastText() {
.fontSize(20)
.fontColor(Color.White);
}
创建Toast类,并创建构造方法与Toast实例方法。
/**

  • 封装全局蓝色浮动提示,支持点击
    */
    export class Toast {
    private toastParams: Params;

    constructor(text: string, time: number = 2000) {
    this.toastParams = new Params(text, time);
    }

    setClick(clickText: string, clickListener: () => void): Toast {
    this.toastParams.setClick(clickText, clickListener);
    return this;
    };

    async show() {
    let uiContext = AppStorage.get('currentUIContext') as UIContext;
    let click = this.toastParams.clickListener;
    let contentNode = new ComponentContent(uiContext, wrapBuilder(buildText), this.toastParams);
    uiContext.getPromptAction().openCustomDialog(contentNode, {
    showInSubWindow: this.toastParams.clickText === '' ? false : true,
    isModal: false,
    offset: { dx: 0, dy: '10%' }
    }).then(() => {
    setTimeout(() => {
    uiContext.getPromptAction().closeCustomDialog(contentNode);
    }, this.toastParams.time);
    });
    this.toastParams.clickListener = () => {
    click();
    uiContext.getPromptAction().closeCustomDialog(contentNode);
    };
    };
    }
    创建并弹出Toast,并且可以在Toast的setClick回调方法内实现点击Toast后的逻辑,如页面跳转。
    new Toast('点击Toast后屏幕将退出横屏,进入到竖屏状态', 3000).setClick('关闭自动添加', () => {
    this.windowClass.setPreferredOrientation(window.Orientation.PORTRAIT);
    this.pathStack.pushPathByName('DetailPage', null);
    }).show();
    完整示例参考如下:

Index.ets。
import { common } from '@kit.AbilityKit';
import { Toast } from './ToastContent';
import { window } from '@kit.ArkUI';

@Entry
@Component
struct Index {
pathStack: NavPathStack = new NavPathStack();
private context = this.getUIContext().getHostContext() as common.UIAbilityContext;
private windowClass = (this.context as common.UIAbilityContext).windowStage.getMainWindowSync();

setOrientation(orientation: number) {
this.windowClass.setPreferredOrientation(orientation).then(() => {
}).catch(() => {
});
}

async aboutToAppear(): Promise<void> {
await this.windowClass.setPreferredOrientation(window.Orientation.LANDSCAPE);
AppStorage.setOrCreate('currentUIContext', this.getUIContext());
}

build() {
Navigation(this.pathStack) {
RelativeContainer() {
Column() {
Text('我的记录')
.fontSize(50)
.width('100%')
.textAlign(TextAlign.Center)
.fontWeight(FontWeight.Bold)
Button('保存')
.onClick(() => {
new Toast('点击Toast后屏幕将退出横屏,进入到竖屏状态', 3000).setClick('关闭自动添加', () => {
this.windowClass.setPreferredOrientation(window.Orientation.PORTRAIT);
this.pathStack.pushPathByName('DetailPage', null);
}).show();
})
.backgroundColor(Color.Blue)
.fontColor(Color.White)
}
.alignRules({
center: { anchor: 'container', align: VerticalAlign.Center },
middle: { anchor: 'container', align: HorizontalAlign.Center }
})
}
.width('100%')
}
.mode(NavigationMode.Stack)
.height('100%')
.width('100%')
.height('100%')
.hideTitleBar(true)
}
}
https://pastebin.com/nwKPmmLF
https://pastebin.com/DwxhFWzG
https://pastebin.com/Jtg4RcM0
https://pastebin.com/7BvUaREN
https://pastebin.com/LGejrMwK
https://pastebin.com/V0qPwT9h
https://pastebin.com/tQzSevWd
https://pastebin.com/qncxPzug
https://pastebin.com/QNF651jK
https://pastebin.com/t3ZuR3CR
https://pastebin.com/H2PDqsEW
https://pastebin.com/Z7Wc9nic
https://pastebin.com/ECKtGAaJ
https://pastebin.com/EwXrd6qT
https://pastebin.com/HgYXSSrk
https://pastebin.com/uK3jyvu5
https://pastebin.com/vHzZdj9J
https://pastebin.com/sAMfi1Pz
https://pastebin.com/kVhLAgHT
https://pastebin.com/nkBEKJz4
https://pastebin.com/GrAvgxVg
https://pastebin.com/Umn0eUXt
https://pastebin.com/ut2dn5iH
https://pastebin.com/NgPFqHpy
https://pastebin.com/7e62WCL1
https://pastebin.com/wDM3tM66
https://pastebin.com/pwUhGKDv
https://pastebin.com/YvwB4xBj
https://pastebin.com/mzAxKZES
https://pastebin.com/NpnmdKf1
https://pastebin.com/C1FBURkc
https://pastebin.com/y0KsuZgB
https://pastebin.com/g7nDScSb
https://pastebin.com/7mDcGwtR
https://pastebin.com/3xV61sHt
https://pastebin.com/iQakPefn
https://pastebin.com/0CWW1Xta
https://pastebin.com/90zmcK10
https://pastebin.com/6CH0bCbh
https://pastebin.com/b6zdrzYw
https://pastebin.com/414XDcCa
https://pastebin.com/Mf0rTkWN
https://pastebin.com/gT4iprCN
https://pastebin.com/qeDfQegQ
https://pastebin.com/1e4vRx0y
https://pastebin.com/kGZUceQg
https://pastebin.com/9ustBt9n
https://pastebin.com/N4kwVZns
https://pastebin.com/qkBjMdA7
https://pastebin.com/w6XX4ciC
https://pastebin.com/54cBU8ze
https://pastebin.com/1mnAuUDZ
https://pastebin.com/VsgcjvTE
https://pastebin.com/wP31PyVb
https://pastebin.com/XPBk0zv8
https://pastebin.com/QRE1qguw
https://pastebin.com/iQpMss7p
https://pastebin.com/kKCXTdF9
https://pastebin.com/EwBniqXp
https://pastebin.com/A7LEwGq8
https://pastebin.com/XtXPS80z
https://pastebin.com/ghHSfqUZ
https://pastebin.com/pEH2u4Mj
https://pastebin.com/GiE2VShc
https://pastebin.com/NmfaPSX3
https://pastebin.com/fBfZs9d9
https://pastebin.com/CcHrZqng
https://pastebin.com/DcALJUNr
https://pastebin.com/hvGqEU4c
https://pastebin.com/HSf8h6BJ
https://pastebin.com/SCNykcCB
https://pastebin.com/RAnMDpBN
https://pastebin.com/0bbYFAG1
https://pastebin.com/6LjMvDuD
https://pastebin.com/u8dUE6wL
https://pastebin.com/8jVE6YLs
https://pastebin.com/xv6kzZyF
https://pastebin.com/L5WMJb5t
https://pastebin.com/sbe7FFD4
https://pastebin.com/aU4YUWDr
https://pastebin.com/3Z1YFmFW
https://pastebin.com/XvqqwSxq
https://pastebin.com/mJX0WRsc
https://pastebin.com/SGkjCXRB
https://pastebin.com/zv8zAxMd
https://pastebin.com/4bRTkCkm
https://pastebin.com/5s9JtWfS
https://pastebin.com/4VVU6Cxg
https://pastebin.com/TewUpi9F
https://pastebin.com/LKZwmBSi
https://pastebin.com/mu27p7w7
https://pastebin.com/JtiF4S2E
https://pastebin.com/xpeq692Q
https://pastebin.com/ypMqWqLC
https://pastebin.com/NrF7S04d
https://pastebin.com/j3riqEAh
https://pastebin.com/6iWCgpuJ
https://pastebin.com/s6KVgTgr
https://pastebin.com/1760APmp
https://pastebin.com/T6LTqjHK
https://pastebin.com/ttGrUAd7
https://pastebin.com/0PQTrPXK
https://pastebin.com/ZtmvtT35
https://pastebin.com/8TjBbUcR
https://pastebin.com/bYCv91Zb
https://pastebin.com/fpZrFF5w
https://pastebin.com/nrXWRsTd
https://pastebin.com/p4UWmpHz
https://pastebin.com/FUkFJhvg
https://pastebin.com/iBPFDUJ3
https://pastebin.com/ET0iD33D
https://pastebin.com/iwPwXsca
https://pastebin.com/8mmzg8p6
https://pastebin.com/8342WqK5
https://pastebin.com/pwYYMgbq
https://pastebin.com/cRgWPHH1
https://pastebin.com/rzyEfV9J
https://pastebin.com/kkAZWims
https://pastebin.com/fQn41cHZ
https://pastebin.com/fJ8vJ8be
https://pastebin.com/SzcAwdbu
https://pastebin.com/pCWkDayj
https://pastebin.com/L9pkse7j
https://pastebin.com/FxKwn5ng
https://pastebin.com/vFCLDqaV
https://pastebin.com/NRnYdnNH
https://pastebin.com/2ER3wSYv
https://pastebin.com/Q3YCRgG6
https://pastebin.com/YFaNTgNN
https://pastebin.com/9n9shZLu
https://pastebin.com/PBbWWUgX
https://pastebin.com/2R5pKJLh
https://pastebin.com/k2yY9ULe
https://pastebin.com/CJph4hrD
https://pastebin.com/6EwGM5CL
https://pastebin.com/DELYFAem
https://pastebin.com/Ggv8dLaa
https://pastebin.com/vM0r7xLq
https://pastebin.com/nbPGG85J
https://pastebin.com/ZVvYnFre
https://pastebin.com/LjJ9AwB9
https://pastebin.com/6hq2KXML
https://pastebin.com/pugZBcNi
https://pastebin.com/pmPvrW9q
https://pastebin.com/fhueU8S6
https://pastebin.com/kQazy17K
https://pastebin.com/VfTbduXf
https://pastebin.com/pXjYSwfd
https://pastebin.com/hUUnksFb
https://pastebin.com/AGnzrkpi
https://pastebin.com/s9jXdQ2e
https://pastebin.com/tkNdPSWm
https://pastebin.com/buGSwi0Q
https://pastebin.com/iqyy4wdi
https://pastebin.com/RiGF4W7H
https://pastebin.com/pxNKyFmV
https://pastebin.com/WwXY1ryk
https://pastebin.com/dNHDcvEE
https://pastebin.com/dstyKVbw
https://pastebin.com/recG0Tg4
https://pastebin.com/Bu8wxzkr
https://pastebin.com/FuZgbtXf
https://pastebin.com/56Ze2VPk
https://pastebin.com/qYG0243R
https://pastebin.com/AZ8iKJWf
https://pastebin.com/hNwShQks
https://pastebin.com/P8iaLhZF
https://pastebin.com/Dm05MGfE
https://pastebin.com/zamDMZgY
https://pastebin.com/7iyftr84
https://pastebin.com/0NssQJ78
https://pastebin.com/kdxr8s0Z
https://pastebin.com/awjDqW6h
https://pastebin.com/GWgZwDB6
https://pastebin.com/riTJWSts
https://pastebin.com/6dmkXAhN
https://pastebin.com/XZLHY1iX
https://pastebin.com/my97aREv
https://pastebin.com/H09exPyA
https://pastebin.com/Jjw8R1hF
https://pastebin.com/hm4qKthR
https://pastebin.com/G9uVUmcV
https://pastebin.com/Z4ZGXCbg
https://pastebin.com/zttcE8aT
https://pastebin.com/ieWfnuEy
https://pastebin.com/EnmdLmjw
https://pastebin.com/q7Nj4JEA
https://pastebin.com/cCnrQ8ft
https://pastebin.com/zt89NyCc
https://pastebin.com/cV5KJRUN
https://pastebin.com/e4pzjDm2
https://pastebin.com/rGb2fsmp
https://pastebin.com/q8ikYfF0
https://pastebin.com/y9e0KRNW
https://pastebin.com/r3qCSEu5
https://pastebin.com/H37KdV5m
https://pastebin.com/SREPy9Lr
https://pastebin.com/25JSeDYG
https://pastebin.com/j2a0BJdf
https://pastebin.com/pGbzGr3L
https://pastebin.com/1WJkKeyt
https://pastebin.com/DPDXbJ9L
https://pastebin.com/4gGEvFSt
https://pastebin.com/L0HCPVB0
https://pastebin.com/0eQjwvaY
https://pastebin.com/rzSNBFS8
https://pastebin.com/NWi9hui6
https://pastebin.com/xPjT5mxu
https://pastebin.com/e5neTg7h
https://pastebin.com/TZnwGHx4
https://pastebin.com/Tb98uyxA
https://pastebin.com/DPcVtW6C
https://pastebin.com/zZ7bNVBg
https://pastebin.com/yVQXZ1T1

收起阅读 »

Text组件字符超过特定长度时,超出部分如何隐藏与显示

text

问题现象
在Text中显示文本时,如果文本超过一定长度,通常会有超出部分隐藏与显示的需求,例如:当最多显示的行数为2,组件宽度比例为0.4时,该如何实现?

背景知识
measureText方法能够根据文本信息计算文本宽度。
getAllDisplays方法能够获取display对象,display对象的width属性为屏幕的宽度。
点击放大

解决方案
首先设定的文本长度计算方式:设定文本长度 = 屏幕宽度 最大行数 组件宽度比例。屏幕宽度可以使用getAllDisplays获取。
然后使用measureText方法测量实际文本宽度,比较“设定文本长度”与“实际文本宽度”进行大小比较,判断是否需要隐藏。
当需要隐藏时,只展示“设定长度”的文本内容,超出部分显示为“...”。当点击“…”时将该文本变为“…收起”,显示隐藏部分内容。
完整示例参考如下:

import { MeasureUtils } from '@kit.ArkUI';
import curves from '@ohos.curves';
import { BusinessError } from '@ohos.base';
import display from '@ohos.display';

@Entry
@Component
struct Index {
// 长文本
longMessage: string = '走在繁华的城市街头,明空感到无比紧张。他的心跳如雷鼓般擂动着胸膛,使得身上的伪装仿佛随时都要被揭开。然而,他仍然保持着冷静,凭借着过人的胆识与智慧,成功地躲过了敌人的层层封锁。\n' +
'\n' +
'  最终,明空来到了敌对帮派的老巢。此时此刻,那里的守卫正沉浸在欢庆的氛围中,丝毫没有察觉到即将来临的危机。明空深吸一口气,压抑住内心的激动,悄然潜入了这座古老的建筑。';
// 最大显示行数
@State lines: number = 2;
// 长文本状态(展开 or 收起)
@State collapseText: string = '...';
// 屏幕宽度(单位px)
screenWidth: number = 0;
// 是否需要显示"展开"字样(注:当文本长度较短时就不需要“展开”)
@State isExpanded: boolean = false;
uiContext: UIContext = this.getUIContext();
uiContextMeasure: MeasureUtils = this.uiContext.getMeasureUtils();
// 测量文本宽度(单位px)
textWidth: number = this.uiContextMeasure.measureText({
textContent: this.longMessage,
fontSize: 20
});
// 获取当前所有的display对象
promise: Promise<Array<display.Display>> = display.getAllDisplays();

aboutToAppear() {
console.info(文本宽度为:${this.textWidth});
this.promise.then((data: Array<display.Display>) => {
console.info(所有的屏幕信息:${JSON.stringify(data)});
// 单位为像素
this.screenWidth = data[0]["width"];
// 屏幕宽度 最大行数 组件宽度比例 和 文字测量宽度
this.isExpanded = this.screenWidth this.lines 0.4 <= this.textWidth;
}).catch((err: BusinessError) => {
console.error(Failed to obtain all the display objects. Code: ${JSON.stringify(err)});
});
}

build() {
Row() {
Column() {
if (this.isExpanded) {
Stack({ alignContent: Alignment.BottomEnd }) {
Text(this.longMessage)
.fontSize(20)
.fontColor(Color.Black)
.maxLines(this.lines)
.width("40%")
Row() {
Text(this.collapseText)
.fontSize(20)
.backgroundColor(Color.White)
}
.justifyContent(FlexAlign.End)
.onClick(() => {
if (this.collapseText == '...') {
this.collapseText = '...收起';
// 展开动画
this.uiContext.animateTo({
duration: 150,
curve: curves.springMotion(0.5, 0.8),
}, () => {
this.lines = -1; // 使得设置的最大行属性无效
});
} else {
this.collapseText = '...';
// 收起动画
this.uiContext.animateTo(
{
duration: 100,
curve: Curve.Friction,
}, () => {
this.lines = 2; // 只显示2行
});
}
})
}
}
else {
Text(this.longMessage)
.fontSize(20)
.fontColor(Color.Black)
}
}
.width('100%')
}
.height('100%')
}
}
https://pastebin.com/yYjzfBYh
https://pastebin.com/KvWVh2mC
https://pastebin.com/1e4eFFEG
https://pastebin.com/P3QEZ0Vt
https://pastebin.com/ySGX6wUJ
https://pastebin.com/jFJ9dwM8
https://pastebin.com/F8rBVMEp
https://pastebin.com/Th3G7tkh
https://pastebin.com/SN1eWG5Z
https://pastebin.com/eMtbaeZm
https://pastebin.com/7G7Ad9d5
https://pastebin.com/wAGuhNej
https://pastebin.com/Cmfya5mB
https://pastebin.com/pjPAkDdh
https://pastebin.com/C4124mFd
https://pastebin.com/1wHR87LD
https://pastebin.com/pccVzdhD
https://pastebin.com/J5MsUs86
https://pastebin.com/3DcWSqk8
https://pastebin.com/jFg0ThQC
https://pastebin.com/5xAUfgws
https://pastebin.com/6vaGRrFj
https://pastebin.com/jzHNkpVz
https://pastebin.com/6qZYe5TF
https://pastebin.com/QhC6D1Ea
https://pastebin.com/RHDyMM5i
https://pastebin.com/u6YdPYNT
https://pastebin.com/vMfTX3f8
https://pastebin.com/JfQ5h4mh
https://pastebin.com/eZTzxZXf
https://pastebin.com/ebALnXDi
https://pastebin.com/KgWVfrxD
https://pastebin.com/qN9C02WR
https://pastebin.com/wfmDCen7
https://pastebin.com/TRCTJxzH
https://pastebin.com/zUwZttGi
https://pastebin.com/tP3krksd
https://pastebin.com/a4zMuKAf
https://pastebin.com/Qd26iPzX
https://pastebin.com/QsYfKNGq
https://pastebin.com/ZBRQrP7g
https://pastebin.com/eLtxHFyq
https://pastebin.com/FFH804TB
https://pastebin.com/mpwpwtk1
https://pastebin.com/9MU20Mx1
https://pastebin.com/P8t51jjE
https://pastebin.com/yggX6dVr
https://pastebin.com/73KZ5Ewf
https://pastebin.com/B4s8zydV
https://pastebin.com/KvXBdDAh
https://pastebin.com/jfSidFKG
https://pastebin.com/i6z3pEGD
https://pastebin.com/K4wDCGB4
https://pastebin.com/Fk5vZKih
https://pastebin.com/j47NvPir
https://pastebin.com/r7jvjYg6
https://pastebin.com/BJzmiF4Q
https://pastebin.com/T983TDL4
https://pastebin.com/w03GsEzJ
https://pastebin.com/eVJ6DFrh
https://pastebin.com/JT5m4Fcd
https://pastebin.com/2Lyw6s6U
https://pastebin.com/nNnz4WSG
https://pastebin.com/zYw0vSEs
https://pastebin.com/7GNKsiA4
https://pastebin.com/1G8Ns8jL
https://pastebin.com/PfzWDnKs
https://pastebin.com/abuDWb37
https://pastebin.com/cV910k6U
https://pastebin.com/d1mmsxZD
https://pastebin.com/G9FgAyi3
https://pastebin.com/bAeBEub8
https://pastebin.com/1khz4e3X
https://pastebin.com/vxgkb5LD
https://pastebin.com/agcLMv2d
https://pastebin.com/nbSGyLLE
https://pastebin.com/fBXRb652
https://pastebin.com/AEaYhdxJ
https://pastebin.com/QnynP0t9
https://pastebin.com/KKG6w0k7
https://pastebin.com/s0iiVSxp
https://pastebin.com/EcmwFtbt
https://pastebin.com/KNmHDurJ
https://pastebin.com/CH32Naac
https://pastebin.com/DX2L75yh
https://pastebin.com/fkvZzYWa
https://pastebin.com/YH5AVbn3
https://pastebin.com/nkY9vSR2
https://pastebin.com/qQ9CkVRM
https://pastebin.com/cYMgDT9Q
https://pastebin.com/NCtDqJeU
https://pastebin.com/umbABgNV
https://pastebin.com/Jb0RrAxC
https://pastebin.com/nWHXx7p0
https://pastebin.com/Atbf7RdX
https://pastebin.com/yDd2FNsG
https://pastebin.com/NEfD7g3Z
https://pastebin.com/rZ1AkzAZ
https://pastebin.com/3HCfn9P1
https://pastebin.com/GWrtDxQr
https://pastebin.com/sf7fhcWs
https://pastebin.com/K7UL8AFj
https://pastebin.com/w4Hm6FuE
https://pastebin.com/5f0KTubZ
https://pastebin.com/6X5dsStC
https://pastebin.com/3nP0pK0t
https://pastebin.com/Emmq0RgR
https://pastebin.com/An3zQJse
https://pastebin.com/6h38FzmU
https://pastebin.com/y3GcsSec
https://pastebin.com/xnNtJTAg
https://pastebin.com/dZAGmXFz
https://pastebin.com/FZScNNPE
https://pastebin.com/8nLrkahp
https://pastebin.com/qx0Nznfz
https://pastebin.com/bbj21hbF
https://pastebin.com/QwZEg5QW
https://pastebin.com/A6Ph6wSg
https://pastebin.com/v8YbNB2J
https://pastebin.com/1Me85UF8
https://pastebin.com/N5zPTGhM
https://pastebin.com/cxR3Z0Q9
https://pastebin.com/yPptx6L2
https://pastebin.com/MgwpSDkL
https://pastebin.com/PdQkppe3
https://pastebin.com/ybfJNJTG
https://pastebin.com/4Cxexqf9
https://pastebin.com/cAShGPFD
https://pastebin.com/7iKLHyRr
https://pastebin.com/mttz0KMU
https://pastebin.com/EVrThu9E
https://pastebin.com/Y50asBDv
https://pastebin.com/95e2yHKf
https://pastebin.com/75zBX7Lg
https://pastebin.com/H88viQHj
https://pastebin.com/nJai6ZvU
https://pastebin.com/XGQr0J9c
https://pastebin.com/B26473RK
https://pastebin.com/ZkMRJwsT
https://pastebin.com/A7eaF21y
https://pastebin.com/qJrNz3u4
https://pastebin.com/2Egf1rmF
https://pastebin.com/ZDSc4Det
https://pastebin.com/DEGVVTgx
https://pastebin.com/MgRWq7xG
https://pastebin.com/qad7X0EQ
https://pastebin.com/G3xSFwem
https://pastebin.com/EffXNSx1
https://pastebin.com/e2GFCkaX
https://pastebin.com/d6XpErS5
https://pastebin.com/Atqhj6gz
https://pastebin.com/qmbXp0Sy
https://pastebin.com/UpgN3P4V
https://pastebin.com/VuwwY5ip
https://pastebin.com/NWnRfqPS
https://pastebin.com/c9GM9mBv
https://pastebin.com/0ZsBLMfd
https://pastebin.com/TFMs3tGt
https://pastebin.com/ehrjT1Gn
https://pastebin.com/m5RE6Avs
https://pastebin.com/fWYHdNgA
https://pastebin.com/gLVzuBx3
https://pastebin.com/rB9HYuaZ
https://pastebin.com/Fe2TBsvf
https://pastebin.com/xHugabcz
https://pastebin.com/ranMDSE7
https://pastebin.com/v1sqVnVc
https://pastebin.com/KB0TWNjm
https://pastebin.com/Z31VUeKU
https://pastebin.com/mjh7S1aF
https://pastebin.com/hrhppQs7
https://pastebin.com/gi9JXzNb
https://pastebin.com/fFVyxssb
https://pastebin.com/iBVj7uYr
https://pastebin.com/YvPJ8P5R
https://pastebin.com/70EAxttP
https://pastebin.com/EPbXeVtD
https://pastebin.com/EVSJNZin
https://pastebin.com/cc8QsGFx
https://pastebin.com/6TG7XnrV
https://pastebin.com/a84xV4uk
https://pastebin.com/KKZzVH4a
https://pastebin.com/XAMTJyHs
https://pastebin.com/Fz3DjJZ9
https://pastebin.com/g0sd0Bzs
https://pastebin.com/Jp8VpszT
https://pastebin.com/YUKEygx1
https://pastebin.com/uVwpBydg
https://pastebin.com/c9aAXgFc
https://pastebin.com/pZ28ZqPj
https://pastebin.com/rtW3W8AQ
https://pastebin.com/jg7cApH9
https://pastebin.com/JptcDPdH

继续阅读 »

问题现象
在Text中显示文本时,如果文本超过一定长度,通常会有超出部分隐藏与显示的需求,例如:当最多显示的行数为2,组件宽度比例为0.4时,该如何实现?

背景知识
measureText方法能够根据文本信息计算文本宽度。
getAllDisplays方法能够获取display对象,display对象的width属性为屏幕的宽度。
点击放大

解决方案
首先设定的文本长度计算方式:设定文本长度 = 屏幕宽度 最大行数 组件宽度比例。屏幕宽度可以使用getAllDisplays获取。
然后使用measureText方法测量实际文本宽度,比较“设定文本长度”与“实际文本宽度”进行大小比较,判断是否需要隐藏。
当需要隐藏时,只展示“设定长度”的文本内容,超出部分显示为“...”。当点击“…”时将该文本变为“…收起”,显示隐藏部分内容。
完整示例参考如下:

import { MeasureUtils } from '@kit.ArkUI';
import curves from '@ohos.curves';
import { BusinessError } from '@ohos.base';
import display from '@ohos.display';

@Entry
@Component
struct Index {
// 长文本
longMessage: string = '走在繁华的城市街头,明空感到无比紧张。他的心跳如雷鼓般擂动着胸膛,使得身上的伪装仿佛随时都要被揭开。然而,他仍然保持着冷静,凭借着过人的胆识与智慧,成功地躲过了敌人的层层封锁。\n' +
'\n' +
'  最终,明空来到了敌对帮派的老巢。此时此刻,那里的守卫正沉浸在欢庆的氛围中,丝毫没有察觉到即将来临的危机。明空深吸一口气,压抑住内心的激动,悄然潜入了这座古老的建筑。';
// 最大显示行数
@State lines: number = 2;
// 长文本状态(展开 or 收起)
@State collapseText: string = '...';
// 屏幕宽度(单位px)
screenWidth: number = 0;
// 是否需要显示"展开"字样(注:当文本长度较短时就不需要“展开”)
@State isExpanded: boolean = false;
uiContext: UIContext = this.getUIContext();
uiContextMeasure: MeasureUtils = this.uiContext.getMeasureUtils();
// 测量文本宽度(单位px)
textWidth: number = this.uiContextMeasure.measureText({
textContent: this.longMessage,
fontSize: 20
});
// 获取当前所有的display对象
promise: Promise<Array<display.Display>> = display.getAllDisplays();

aboutToAppear() {
console.info(文本宽度为:${this.textWidth});
this.promise.then((data: Array<display.Display>) => {
console.info(所有的屏幕信息:${JSON.stringify(data)});
// 单位为像素
this.screenWidth = data[0]["width"];
// 屏幕宽度 最大行数 组件宽度比例 和 文字测量宽度
this.isExpanded = this.screenWidth this.lines 0.4 <= this.textWidth;
}).catch((err: BusinessError) => {
console.error(Failed to obtain all the display objects. Code: ${JSON.stringify(err)});
});
}

build() {
Row() {
Column() {
if (this.isExpanded) {
Stack({ alignContent: Alignment.BottomEnd }) {
Text(this.longMessage)
.fontSize(20)
.fontColor(Color.Black)
.maxLines(this.lines)
.width("40%")
Row() {
Text(this.collapseText)
.fontSize(20)
.backgroundColor(Color.White)
}
.justifyContent(FlexAlign.End)
.onClick(() => {
if (this.collapseText == '...') {
this.collapseText = '...收起';
// 展开动画
this.uiContext.animateTo({
duration: 150,
curve: curves.springMotion(0.5, 0.8),
}, () => {
this.lines = -1; // 使得设置的最大行属性无效
});
} else {
this.collapseText = '...';
// 收起动画
this.uiContext.animateTo(
{
duration: 100,
curve: Curve.Friction,
}, () => {
this.lines = 2; // 只显示2行
});
}
})
}
}
else {
Text(this.longMessage)
.fontSize(20)
.fontColor(Color.Black)
}
}
.width('100%')
}
.height('100%')
}
}
https://pastebin.com/yYjzfBYh
https://pastebin.com/KvWVh2mC
https://pastebin.com/1e4eFFEG
https://pastebin.com/P3QEZ0Vt
https://pastebin.com/ySGX6wUJ
https://pastebin.com/jFJ9dwM8
https://pastebin.com/F8rBVMEp
https://pastebin.com/Th3G7tkh
https://pastebin.com/SN1eWG5Z
https://pastebin.com/eMtbaeZm
https://pastebin.com/7G7Ad9d5
https://pastebin.com/wAGuhNej
https://pastebin.com/Cmfya5mB
https://pastebin.com/pjPAkDdh
https://pastebin.com/C4124mFd
https://pastebin.com/1wHR87LD
https://pastebin.com/pccVzdhD
https://pastebin.com/J5MsUs86
https://pastebin.com/3DcWSqk8
https://pastebin.com/jFg0ThQC
https://pastebin.com/5xAUfgws
https://pastebin.com/6vaGRrFj
https://pastebin.com/jzHNkpVz
https://pastebin.com/6qZYe5TF
https://pastebin.com/QhC6D1Ea
https://pastebin.com/RHDyMM5i
https://pastebin.com/u6YdPYNT
https://pastebin.com/vMfTX3f8
https://pastebin.com/JfQ5h4mh
https://pastebin.com/eZTzxZXf
https://pastebin.com/ebALnXDi
https://pastebin.com/KgWVfrxD
https://pastebin.com/qN9C02WR
https://pastebin.com/wfmDCen7
https://pastebin.com/TRCTJxzH
https://pastebin.com/zUwZttGi
https://pastebin.com/tP3krksd
https://pastebin.com/a4zMuKAf
https://pastebin.com/Qd26iPzX
https://pastebin.com/QsYfKNGq
https://pastebin.com/ZBRQrP7g
https://pastebin.com/eLtxHFyq
https://pastebin.com/FFH804TB
https://pastebin.com/mpwpwtk1
https://pastebin.com/9MU20Mx1
https://pastebin.com/P8t51jjE
https://pastebin.com/yggX6dVr
https://pastebin.com/73KZ5Ewf
https://pastebin.com/B4s8zydV
https://pastebin.com/KvXBdDAh
https://pastebin.com/jfSidFKG
https://pastebin.com/i6z3pEGD
https://pastebin.com/K4wDCGB4
https://pastebin.com/Fk5vZKih
https://pastebin.com/j47NvPir
https://pastebin.com/r7jvjYg6
https://pastebin.com/BJzmiF4Q
https://pastebin.com/T983TDL4
https://pastebin.com/w03GsEzJ
https://pastebin.com/eVJ6DFrh
https://pastebin.com/JT5m4Fcd
https://pastebin.com/2Lyw6s6U
https://pastebin.com/nNnz4WSG
https://pastebin.com/zYw0vSEs
https://pastebin.com/7GNKsiA4
https://pastebin.com/1G8Ns8jL
https://pastebin.com/PfzWDnKs
https://pastebin.com/abuDWb37
https://pastebin.com/cV910k6U
https://pastebin.com/d1mmsxZD
https://pastebin.com/G9FgAyi3
https://pastebin.com/bAeBEub8
https://pastebin.com/1khz4e3X
https://pastebin.com/vxgkb5LD
https://pastebin.com/agcLMv2d
https://pastebin.com/nbSGyLLE
https://pastebin.com/fBXRb652
https://pastebin.com/AEaYhdxJ
https://pastebin.com/QnynP0t9
https://pastebin.com/KKG6w0k7
https://pastebin.com/s0iiVSxp
https://pastebin.com/EcmwFtbt
https://pastebin.com/KNmHDurJ
https://pastebin.com/CH32Naac
https://pastebin.com/DX2L75yh
https://pastebin.com/fkvZzYWa
https://pastebin.com/YH5AVbn3
https://pastebin.com/nkY9vSR2
https://pastebin.com/qQ9CkVRM
https://pastebin.com/cYMgDT9Q
https://pastebin.com/NCtDqJeU
https://pastebin.com/umbABgNV
https://pastebin.com/Jb0RrAxC
https://pastebin.com/nWHXx7p0
https://pastebin.com/Atbf7RdX
https://pastebin.com/yDd2FNsG
https://pastebin.com/NEfD7g3Z
https://pastebin.com/rZ1AkzAZ
https://pastebin.com/3HCfn9P1
https://pastebin.com/GWrtDxQr
https://pastebin.com/sf7fhcWs
https://pastebin.com/K7UL8AFj
https://pastebin.com/w4Hm6FuE
https://pastebin.com/5f0KTubZ
https://pastebin.com/6X5dsStC
https://pastebin.com/3nP0pK0t
https://pastebin.com/Emmq0RgR
https://pastebin.com/An3zQJse
https://pastebin.com/6h38FzmU
https://pastebin.com/y3GcsSec
https://pastebin.com/xnNtJTAg
https://pastebin.com/dZAGmXFz
https://pastebin.com/FZScNNPE
https://pastebin.com/8nLrkahp
https://pastebin.com/qx0Nznfz
https://pastebin.com/bbj21hbF
https://pastebin.com/QwZEg5QW
https://pastebin.com/A6Ph6wSg
https://pastebin.com/v8YbNB2J
https://pastebin.com/1Me85UF8
https://pastebin.com/N5zPTGhM
https://pastebin.com/cxR3Z0Q9
https://pastebin.com/yPptx6L2
https://pastebin.com/MgwpSDkL
https://pastebin.com/PdQkppe3
https://pastebin.com/ybfJNJTG
https://pastebin.com/4Cxexqf9
https://pastebin.com/cAShGPFD
https://pastebin.com/7iKLHyRr
https://pastebin.com/mttz0KMU
https://pastebin.com/EVrThu9E
https://pastebin.com/Y50asBDv
https://pastebin.com/95e2yHKf
https://pastebin.com/75zBX7Lg
https://pastebin.com/H88viQHj
https://pastebin.com/nJai6ZvU
https://pastebin.com/XGQr0J9c
https://pastebin.com/B26473RK
https://pastebin.com/ZkMRJwsT
https://pastebin.com/A7eaF21y
https://pastebin.com/qJrNz3u4
https://pastebin.com/2Egf1rmF
https://pastebin.com/ZDSc4Det
https://pastebin.com/DEGVVTgx
https://pastebin.com/MgRWq7xG
https://pastebin.com/qad7X0EQ
https://pastebin.com/G3xSFwem
https://pastebin.com/EffXNSx1
https://pastebin.com/e2GFCkaX
https://pastebin.com/d6XpErS5
https://pastebin.com/Atqhj6gz
https://pastebin.com/qmbXp0Sy
https://pastebin.com/UpgN3P4V
https://pastebin.com/VuwwY5ip
https://pastebin.com/NWnRfqPS
https://pastebin.com/c9GM9mBv
https://pastebin.com/0ZsBLMfd
https://pastebin.com/TFMs3tGt
https://pastebin.com/ehrjT1Gn
https://pastebin.com/m5RE6Avs
https://pastebin.com/fWYHdNgA
https://pastebin.com/gLVzuBx3
https://pastebin.com/rB9HYuaZ
https://pastebin.com/Fe2TBsvf
https://pastebin.com/xHugabcz
https://pastebin.com/ranMDSE7
https://pastebin.com/v1sqVnVc
https://pastebin.com/KB0TWNjm
https://pastebin.com/Z31VUeKU
https://pastebin.com/mjh7S1aF
https://pastebin.com/hrhppQs7
https://pastebin.com/gi9JXzNb
https://pastebin.com/fFVyxssb
https://pastebin.com/iBVj7uYr
https://pastebin.com/YvPJ8P5R
https://pastebin.com/70EAxttP
https://pastebin.com/EPbXeVtD
https://pastebin.com/EVSJNZin
https://pastebin.com/cc8QsGFx
https://pastebin.com/6TG7XnrV
https://pastebin.com/a84xV4uk
https://pastebin.com/KKZzVH4a
https://pastebin.com/XAMTJyHs
https://pastebin.com/Fz3DjJZ9
https://pastebin.com/g0sd0Bzs
https://pastebin.com/Jp8VpszT
https://pastebin.com/YUKEygx1
https://pastebin.com/uVwpBydg
https://pastebin.com/c9aAXgFc
https://pastebin.com/pZ28ZqPj
https://pastebin.com/rtW3W8AQ
https://pastebin.com/jg7cApH9
https://pastebin.com/JptcDPdH

收起阅读 »

如何解决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/jg7cApH9
https://pastebin.com/JptcDPdH
https://pastebin.com/fJ3FRPmU
https://pastebin.com/XW6K3fae
https://pastebin.com/LTuQfDs4
https://pastebin.com/B7u5aJgV
https://pastebin.com/kQDwTYr0
https://pastebin.com/xBwWHVWP
https://pastebin.com/XnbRLadK
https://pastebin.com/P7cJhcvz
https://pastebin.com/PPHJBRbF
https://pastebin.com/p3d9QNpd
https://pastebin.com/cvXpr2Xe
https://pastebin.com/xPFHs3J9
https://pastebin.com/jSmP0nAz
https://pastebin.com/F7BVe7rA
https://pastebin.com/rxxsw7rL
https://pastebin.com/dsapsf85
https://pastebin.com/WDTMjhBj
https://pastebin.com/YZm9PuQ0
https://pastebin.com/Ww8WiVCh
https://pastebin.com/1mdA2xYa
https://pastebin.com/HmnTgAvU
https://pastebin.com/4VFUyY1W
https://pastebin.com/iSCA3e1G
https://pastebin.com/DvvZgR5T
https://pastebin.com/XkCssDHN
https://pastebin.com/MS590bez
https://pastebin.com/APFd7Si7
https://pastebin.com/zszhKUha
https://pastebin.com/eCxbgYRD
https://pastebin.com/rvuEnH0U
https://pastebin.com/gvp8Sryc
https://pastebin.com/5G9bqXX8
https://pastebin.com/iveHA0B9
https://pastebin.com/YN31LHqg
https://pastebin.com/wwePXfTd
https://pastebin.com/xVjTy8Eh
https://pastebin.com/R2GZKWcL
https://pastebin.com/5R5n97MN
https://pastebin.com/bTJYZwXQ
https://pastebin.com/3MMSMF4w
https://pastebin.com/8FfWGCfV
https://pastebin.com/FG1V23qy
https://pastebin.com/R76515LN
https://pastebin.com/dgwf902E
https://pastebin.com/vF3LW9wz
https://pastebin.com/xuVFsSpN
https://pastebin.com/ycNDJLKt
https://pastebin.com/856Ss0AA
https://pastebin.com/SU4ZD1Zn
https://pastebin.com/VdiknXu9
https://pastebin.com/Qt1TYCpX
https://pastebin.com/7S5zwEmb
https://pastebin.com/YgNQiKJu
https://pastebin.com/8qE1cRZh
https://pastebin.com/qgtGNvG2
https://pastebin.com/ripQ1rCp
https://pastebin.com/vj9eK6Tw
https://pastebin.com/qD8waSpv
https://pastebin.com/LTPgDm4K
https://pastebin.com/AD1JQT8M
https://pastebin.com/F8BZKARC
https://pastebin.com/rtgxejCJ
https://pastebin.com/iGDCC7v6
https://pastebin.com/KDGz1ZAw
https://pastebin.com/T6ZRvjnv
https://pastebin.com/gn4VQL8C
https://pastebin.com/Pe2hxUPW
https://pastebin.com/ABUpdTBf
https://pastebin.com/hkr9q5qT
https://pastebin.com/7eMPsQSF
https://pastebin.com/2eazmQsj
https://pastebin.com/ZDyMcSUu
https://pastebin.com/40sqLNgD
https://pastebin.com/K4tB8zUq
https://pastebin.com/Vu5qGCNq
https://pastebin.com/NadrhJpP
https://pastebin.com/DMmxaYYg
https://pastebin.com/MD2QievW
https://pastebin.com/PE70Eqmr
https://pastebin.com/Ew5Fv07S
https://pastebin.com/UTUpEMDs
https://pastebin.com/msjPsKni
https://pastebin.com/Cy8PQ25K
https://pastebin.com/7mxb1JXt
https://pastebin.com/AgycmibL
https://pastebin.com/AVU1pR19
https://pastebin.com/3RmynMcG
https://pastebin.com/bAnvjLAq
https://pastebin.com/MNhKPjgL
https://pastebin.com/28gSRM4Y
https://pastebin.com/K10xjm2X
https://pastebin.com/HDW8s1cW
https://pastebin.com/Vz1hyR31
https://pastebin.com/0NVNEz8A
https://pastebin.com/5fqUpYWd
https://pastebin.com/L3Q0tjsz
https://pastebin.com/vcr11xWp
https://pastebin.com/QcuCqCyz
https://pastebin.com/VwCDdqGb
https://pastebin.com/RxyBYiQ1
https://pastebin.com/0cDzryZ8
https://pastebin.com/Ckxhy2mx
https://pastebin.com/y5gNKnjD
https://pastebin.com/k9cBDx1L
https://pastebin.com/KrdmLCzz
https://pastebin.com/XnbC31tF
https://pastebin.com/75Uq20MB
https://pastebin.com/w99f2xji
https://pastebin.com/wcbEE71j
https://pastebin.com/kGjYuVGW
https://pastebin.com/fugp0ttc
https://pastebin.com/N7s1QHRQ
https://pastebin.com/pPsWPb1a
https://pastebin.com/NWCppgZH
https://pastebin.com/sG0EpEW3
https://pastebin.com/QBXpHJhW
https://pastebin.com/9uaS9gT8
https://pastebin.com/q5RL1azA
https://pastebin.com/sXgTvvNe
https://pastebin.com/dM3Y0fNj
https://pastebin.com/2fvDixft
https://pastebin.com/TVCDt8Bk
https://pastebin.com/C5TNtJzS
https://pastebin.com/gvu7HrFG
https://pastebin.com/6gtmpefC
https://pastebin.com/e5XXTcSu
https://pastebin.com/ULRT40ic
https://pastebin.com/35dDdqDv
https://pastebin.com/V3Q4xPDB
https://pastebin.com/6FQ3hjhu
https://pastebin.com/GXVmSxWa
https://pastebin.com/ARpP5Sgx
https://pastebin.com/2C4G0GXm
https://pastebin.com/aydQrrL2
https://pastebin.com/RcDaQksi
https://pastebin.com/A09zVHhV
https://pastebin.com/EW4dKr6p
https://pastebin.com/NbuHg3jA
https://pastebin.com/mpvxPgsk
https://pastebin.com/d5me4T4d
https://pastebin.com/Pq4xqrwy
https://pastebin.com/1fwUEq5w
https://pastebin.com/RhQmmqpX
https://pastebin.com/0dmyxL0K
https://pastebin.com/whYZqr0q
https://pastebin.com/2Jzhd4hu
https://pastebin.com/kphAgh4R
https://pastebin.com/GDrrQdRp
https://pastebin.com/fY2yfAB7
https://pastebin.com/qYKKXLYL
https://pastebin.com/ybxMQCT1
https://pastebin.com/2au0x8Lf
https://pastebin.com/BvAZqhcP
https://pastebin.com/46LiCfhw
https://pastebin.com/DtZgXzmr
https://pastebin.com/XcWD26ZA
https://pastebin.com/C9emeaLS
https://pastebin.com/09GWiGur
https://pastebin.com/aH6FR1eC
https://pastebin.com/P8LJSBmN
https://pastebin.com/wiNqpWqX
https://pastebin.com/zT6vi5ys
https://pastebin.com/AVaKA8ci
https://pastebin.com/k3SrKPSD
https://pastebin.com/qtCMmq6p
https://pastebin.com/FJ464td4
https://pastebin.com/c6fkeh3w
https://pastebin.com/SbkLNL4E
https://pastebin.com/VGqk15nm
https://pastebin.com/h4SxwUdU
https://pastebin.com/Ngzb6uJq
https://pastebin.com/ff3aCBWh
https://pastebin.com/0i06Njsd
https://pastebin.com/fdYcqYTb
https://pastebin.com/bFiemuPx
https://pastebin.com/Syn6MvVa
https://pastebin.com/wGFSznjy
https://pastebin.com/StLnicTr
https://pastebin.com/KYLknUL1
https://pastebin.com/qKFitbxZ
https://pastebin.com/Q6tJT1ar
https://pastebin.com/GAyLPptG
https://pastebin.com/2zqFYn9X
https://pastebin.com/5ED0Vjjx
https://pastebin.com/dfPRkZay
https://pastebin.com/5W2xXc9L
https://pastebin.com/KRiFEcKH
https://pastebin.com/1kJv45DQ
https://pastebin.com/m2624v5Q
https://pastebin.com/w06qZAVW
https://pastebin.com/L4LmccPV
https://pastebin.com/JzNusi76
https://pastebin.com/EwSR48QA
https://pastebin.com/45A8NUsn
https://pastebin.com/TYg6awym
https://pastebin.com/ti8fjF4t
https://pastebin.com/eVVGSL2Z
https://pastebin.com/fRVbrzKS
https://pastebin.com/aVSd5N24
https://pastebin.com/tscNEGQe
https://pastebin.com/YWnRTD7n
https://pastebin.com/KWXg4hdG
https://pastebin.com/9phkHrjB
https://pastebin.com/3PtPqjvc
https://pastebin.com/8duhjkTw
https://pastebin.com/r2FdrSPY
https://pastebin.com/6fnVj3bj
https://pastebin.com/WsT72uPu

继续阅读 »

问题现象
在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/jg7cApH9
https://pastebin.com/JptcDPdH
https://pastebin.com/fJ3FRPmU
https://pastebin.com/XW6K3fae
https://pastebin.com/LTuQfDs4
https://pastebin.com/B7u5aJgV
https://pastebin.com/kQDwTYr0
https://pastebin.com/xBwWHVWP
https://pastebin.com/XnbRLadK
https://pastebin.com/P7cJhcvz
https://pastebin.com/PPHJBRbF
https://pastebin.com/p3d9QNpd
https://pastebin.com/cvXpr2Xe
https://pastebin.com/xPFHs3J9
https://pastebin.com/jSmP0nAz
https://pastebin.com/F7BVe7rA
https://pastebin.com/rxxsw7rL
https://pastebin.com/dsapsf85
https://pastebin.com/WDTMjhBj
https://pastebin.com/YZm9PuQ0
https://pastebin.com/Ww8WiVCh
https://pastebin.com/1mdA2xYa
https://pastebin.com/HmnTgAvU
https://pastebin.com/4VFUyY1W
https://pastebin.com/iSCA3e1G
https://pastebin.com/DvvZgR5T
https://pastebin.com/XkCssDHN
https://pastebin.com/MS590bez
https://pastebin.com/APFd7Si7
https://pastebin.com/zszhKUha
https://pastebin.com/eCxbgYRD
https://pastebin.com/rvuEnH0U
https://pastebin.com/gvp8Sryc
https://pastebin.com/5G9bqXX8
https://pastebin.com/iveHA0B9
https://pastebin.com/YN31LHqg
https://pastebin.com/wwePXfTd
https://pastebin.com/xVjTy8Eh
https://pastebin.com/R2GZKWcL
https://pastebin.com/5R5n97MN
https://pastebin.com/bTJYZwXQ
https://pastebin.com/3MMSMF4w
https://pastebin.com/8FfWGCfV
https://pastebin.com/FG1V23qy
https://pastebin.com/R76515LN
https://pastebin.com/dgwf902E
https://pastebin.com/vF3LW9wz
https://pastebin.com/xuVFsSpN
https://pastebin.com/ycNDJLKt
https://pastebin.com/856Ss0AA
https://pastebin.com/SU4ZD1Zn
https://pastebin.com/VdiknXu9
https://pastebin.com/Qt1TYCpX
https://pastebin.com/7S5zwEmb
https://pastebin.com/YgNQiKJu
https://pastebin.com/8qE1cRZh
https://pastebin.com/qgtGNvG2
https://pastebin.com/ripQ1rCp
https://pastebin.com/vj9eK6Tw
https://pastebin.com/qD8waSpv
https://pastebin.com/LTPgDm4K
https://pastebin.com/AD1JQT8M
https://pastebin.com/F8BZKARC
https://pastebin.com/rtgxejCJ
https://pastebin.com/iGDCC7v6
https://pastebin.com/KDGz1ZAw
https://pastebin.com/T6ZRvjnv
https://pastebin.com/gn4VQL8C
https://pastebin.com/Pe2hxUPW
https://pastebin.com/ABUpdTBf
https://pastebin.com/hkr9q5qT
https://pastebin.com/7eMPsQSF
https://pastebin.com/2eazmQsj
https://pastebin.com/ZDyMcSUu
https://pastebin.com/40sqLNgD
https://pastebin.com/K4tB8zUq
https://pastebin.com/Vu5qGCNq
https://pastebin.com/NadrhJpP
https://pastebin.com/DMmxaYYg
https://pastebin.com/MD2QievW
https://pastebin.com/PE70Eqmr
https://pastebin.com/Ew5Fv07S
https://pastebin.com/UTUpEMDs
https://pastebin.com/msjPsKni
https://pastebin.com/Cy8PQ25K
https://pastebin.com/7mxb1JXt
https://pastebin.com/AgycmibL
https://pastebin.com/AVU1pR19
https://pastebin.com/3RmynMcG
https://pastebin.com/bAnvjLAq
https://pastebin.com/MNhKPjgL
https://pastebin.com/28gSRM4Y
https://pastebin.com/K10xjm2X
https://pastebin.com/HDW8s1cW
https://pastebin.com/Vz1hyR31
https://pastebin.com/0NVNEz8A
https://pastebin.com/5fqUpYWd
https://pastebin.com/L3Q0tjsz
https://pastebin.com/vcr11xWp
https://pastebin.com/QcuCqCyz
https://pastebin.com/VwCDdqGb
https://pastebin.com/RxyBYiQ1
https://pastebin.com/0cDzryZ8
https://pastebin.com/Ckxhy2mx
https://pastebin.com/y5gNKnjD
https://pastebin.com/k9cBDx1L
https://pastebin.com/KrdmLCzz
https://pastebin.com/XnbC31tF
https://pastebin.com/75Uq20MB
https://pastebin.com/w99f2xji
https://pastebin.com/wcbEE71j
https://pastebin.com/kGjYuVGW
https://pastebin.com/fugp0ttc
https://pastebin.com/N7s1QHRQ
https://pastebin.com/pPsWPb1a
https://pastebin.com/NWCppgZH
https://pastebin.com/sG0EpEW3
https://pastebin.com/QBXpHJhW
https://pastebin.com/9uaS9gT8
https://pastebin.com/q5RL1azA
https://pastebin.com/sXgTvvNe
https://pastebin.com/dM3Y0fNj
https://pastebin.com/2fvDixft
https://pastebin.com/TVCDt8Bk
https://pastebin.com/C5TNtJzS
https://pastebin.com/gvu7HrFG
https://pastebin.com/6gtmpefC
https://pastebin.com/e5XXTcSu
https://pastebin.com/ULRT40ic
https://pastebin.com/35dDdqDv
https://pastebin.com/V3Q4xPDB
https://pastebin.com/6FQ3hjhu
https://pastebin.com/GXVmSxWa
https://pastebin.com/ARpP5Sgx
https://pastebin.com/2C4G0GXm
https://pastebin.com/aydQrrL2
https://pastebin.com/RcDaQksi
https://pastebin.com/A09zVHhV
https://pastebin.com/EW4dKr6p
https://pastebin.com/NbuHg3jA
https://pastebin.com/mpvxPgsk
https://pastebin.com/d5me4T4d
https://pastebin.com/Pq4xqrwy
https://pastebin.com/1fwUEq5w
https://pastebin.com/RhQmmqpX
https://pastebin.com/0dmyxL0K
https://pastebin.com/whYZqr0q
https://pastebin.com/2Jzhd4hu
https://pastebin.com/kphAgh4R
https://pastebin.com/GDrrQdRp
https://pastebin.com/fY2yfAB7
https://pastebin.com/qYKKXLYL
https://pastebin.com/ybxMQCT1
https://pastebin.com/2au0x8Lf
https://pastebin.com/BvAZqhcP
https://pastebin.com/46LiCfhw
https://pastebin.com/DtZgXzmr
https://pastebin.com/XcWD26ZA
https://pastebin.com/C9emeaLS
https://pastebin.com/09GWiGur
https://pastebin.com/aH6FR1eC
https://pastebin.com/P8LJSBmN
https://pastebin.com/wiNqpWqX
https://pastebin.com/zT6vi5ys
https://pastebin.com/AVaKA8ci
https://pastebin.com/k3SrKPSD
https://pastebin.com/qtCMmq6p
https://pastebin.com/FJ464td4
https://pastebin.com/c6fkeh3w
https://pastebin.com/SbkLNL4E
https://pastebin.com/VGqk15nm
https://pastebin.com/h4SxwUdU
https://pastebin.com/Ngzb6uJq
https://pastebin.com/ff3aCBWh
https://pastebin.com/0i06Njsd
https://pastebin.com/fdYcqYTb
https://pastebin.com/bFiemuPx
https://pastebin.com/Syn6MvVa
https://pastebin.com/wGFSznjy
https://pastebin.com/StLnicTr
https://pastebin.com/KYLknUL1
https://pastebin.com/qKFitbxZ
https://pastebin.com/Q6tJT1ar
https://pastebin.com/GAyLPptG
https://pastebin.com/2zqFYn9X
https://pastebin.com/5ED0Vjjx
https://pastebin.com/dfPRkZay
https://pastebin.com/5W2xXc9L
https://pastebin.com/KRiFEcKH
https://pastebin.com/1kJv45DQ
https://pastebin.com/m2624v5Q
https://pastebin.com/w06qZAVW
https://pastebin.com/L4LmccPV
https://pastebin.com/JzNusi76
https://pastebin.com/EwSR48QA
https://pastebin.com/45A8NUsn
https://pastebin.com/TYg6awym
https://pastebin.com/ti8fjF4t
https://pastebin.com/eVVGSL2Z
https://pastebin.com/fRVbrzKS
https://pastebin.com/aVSd5N24
https://pastebin.com/tscNEGQe
https://pastebin.com/YWnRTD7n
https://pastebin.com/KWXg4hdG
https://pastebin.com/9phkHrjB
https://pastebin.com/3PtPqjvc
https://pastebin.com/8duhjkTw
https://pastebin.com/r2FdrSPY
https://pastebin.com/6fnVj3bj
https://pastebin.com/WsT72uPu

收起阅读 »

华为应用市场上架被拒|2026最全高频驳回原因、整改方案与申诉攻略

华为应用市场

华为应用市场上架被拒|2026最全高频驳回原因、整改方案与申诉攻略
很多开发者iOS上架能过,却频频卡在华为应用市场审核。华为审核逻辑、合规标准、技术检测、内容风控和苹果完全不同,不看界面颜值,主打硬性合规、技术完整性、资质真实性、用户体验底线。
2026年华为应用市场审核全面升级,强化隐私合规扫描、SDK风控、资质核验、同质化检测、功能完整性校验,大量开发者遭遇反复驳回、版本打回、冻结提审权限等问题。
本文整理华为官方最新审核规则+上千款App上架实操经验,汇总TOP10高频被拒原因、逐点整改方案、提审避坑清单、专属申诉话术,工具、教育、娱乐、生活服务、企业类App通用,看完基本可以一次性过审。


一、先搞懂:华为审核和苹果审核的核心区别
很多人整改无效,根本原因是用iOS上架思维做华为上架,两套审核体系完全不同:

  • 苹果:重账号权重、代码指纹、同质化马甲、产品价值,轻度合规问题可容错;
  • 华为:零容错硬性合规,隐私、权限、资质、SDK、UX体验、加固兼容性任意一项不达标,直接驳回,无容错空间。
    华为审核最大特点:机器静态扫描+动态运行检测+人工资质复核三重校验,技术漏洞、合规瑕疵、资质造假100%检出。

二、2026华为上架TOP10高频被拒原因+精准整改方案(99%开发者踩坑)
1、隐私政策不合规(全网最高频驳回)
驳回表现:隐私协议缺失、链接打不开、未标注第三方SDK收集行为、权限用途说明模糊、未适配最新隐私规范。
核心坑点:华为严格检测所有集成的第三方SDK(推送、统计、登录、支付、定位),只要有SDK数据收集行为,隐私协议未逐条说明,直接驳回。同时禁止用户未同意隐私政策前初始化SDK、读取设备信息、偷跑流量。
标准整改方案:

  • 搭建独立可访问、无失效的隐私政策官网链接,页面干净无广告、无跳转;
  • 逐条写明:收集设备信息、相册、相机、定位、存储等权限的具体业务用途;
  • 单独公示所有第三方SDK名称、收集数据类型、使用用途、数据留存规则;
  • 代码拦截:用户未同意隐私前,禁止任何SDK初始化、网络请求、设备信息读取。
    2、权限申请过度、索权无依据
    驳回表现:申请通讯录、短信、电话、定位、后台权限,但App核心功能无需对应权限,属于违规过度索权。
    整改方案:
  • 删除所有非必要敏感权限,能不用就不用;
  • 保留的权限必须在隐私协议、弹窗说明中,明确对应核心业务场景,做到权限与功能强绑定;
  • 禁止静默申请权限,所有敏感权限必须用户主动授权后再启用对应功能。
    3、软著/资质主体不一致、材料不全
    驳回表现:软件著作权主体、开发者账号主体、企业营业执照主体不一致,软著截图模糊、版本不匹配、缺少授权证明。
    核心规则:华为审核资质100%严格匹配,主体不一致直接驳回,无协商余地。
    整改方案:
  • 软著主体必须和华为开发者账号企业主体完全一致;
  • 若为授权应用,补齐官方授权链路证明、多级授权文件;
  • 上传高清无水印、无遮挡资质材料,版本号与提交App版本完全对应。
    4、应用UX体验不达标、适配异常
    驳回表现:深色模式显示错乱、页面布局拉伸、按钮点击失效、分辨率适配异常、加载空白、交互卡顿,不符合华为UX体验标准。
    整改方案:
  • 全面适配华为手机常规分辨率、深色/浅色模式,无错乱、无遮挡、无黑屏;
  • 优化页面加载逻辑,杜绝首次启动空白、卡顿、长时间无响应;
  • 按钮、弹窗、输入框交互正常,无点击失效、穿透、错位问题。
    5、商店素材违规:截图/文案/图标虚假不符
    驳回表现:截图展示未上线功能、含有其他品牌机型、文案夸大宣传、关键词堆砌、素材含第三方水印、图文与实际功能不符。
    整改方案:
  • 所有截图、预览视频必须为App真实原生界面,禁止虚假展示、超前展示未开发功能;
  • 素材优先使用华为机型展示,去除其他品牌logo、水印;
  • 删除“100%有效”“最强”“极致”等绝对化宣传词汇,文案如实描述功能。
    6、测试残留、调试信息未清理
    驳回表现:包体内残留测试账号、测试弹窗、debug日志、测试水印、冗余调试代码,被判定为测试版本,不允许上架。
    整改方案:
  • 正式打包关闭Debug模式,清空所有测试日志、测试入口、测试弹窗;
  • 删除测试占位图、废弃页面、冗余资源,保证Release包纯净;
  • 杜绝包内残留内测、体验版标识。
    7、加固兼容问题、启动闪退、运行异常
    驳回表现:加固后Manifest解析失败、启动闪退、功能失效、防二次打包与华为系统签名冲突,审核机型无法正常运行。
    整改方案:
  • 关闭加固Manifest加密参数,避免配置文件无法解析;
  • 优化SDK和应用初始化时机,规避加固导致的初始化顺序错乱;
  • 上架前在华为主流机型实测运行,确保无闪退、崩溃、功能异常问题。
    8、同质化、低质应用判定
    驳回表现:模板套壳、功能简陋、与站内大量应用高度相似,无独立创新价值,判定低质应用驳回。
    整改方案:
  • 优化产品差异化,新增独立特色功能,杜绝纯模板套壳;
  • 重构页面布局、交互逻辑,与市面同类模板应用做出明显区分;
  • 完善功能闭环,避免单一简陋功能、无使用价值的工具应用。
    9、内容违规、敏感风控不通过
    驳回表现:包含涉政、色情、暴力、迷信、虚假金融、违规推广、侵权内容,或存在误导用户、恶意引流行为。
    整改方案:
  • 全面清理App内敏感文案、违规图片、第三方引流入口;
  • 教育、金融、医疗类应用补齐对应专项资质,无资质严禁展示相关服务内容;
  • 开启内容审核机制,杜绝UGC违规内容外露。
    10、鸿蒙适配不达标、API不规范
    驳回表现:使用私有API、未适配鸿蒙特性、分布式能力异常,系统兼容性不达标。
    整改方案:
  • 替换所有私有API,使用华为官方公开标准接口;
  • 通过DevEco Studio完成API兼容性检测,修复所有适配报错;
  • 针对鸿蒙机型完成基础适配,保证运行稳定、无功能异常。

三、华为上架必做自查清单(提审前一键核对)
按照以下清单核对,可规避95%驳回问题:

  1. 资质合规:软著、营业执照、授权文件主体一致、版本匹配、材料清晰完整;
  2. 隐私合规:隐私链接有效、SDK全部公示、权限用途明确、无前置偷跑数据;
  3. 权限精简:无多余敏感权限,权限与核心功能一一对应;
  4. 包体纯净:无Debug残留、无测试入口、无冗余调试信息;
  5. 体验适配:全机型适配、深色模式正常、无闪退卡顿、交互完整;
  6. 素材真实:图文文案与功能一致,无虚假宣传、无第三方违规元素;
  7. 内容干净:无敏感内容、无违规引流、无侵权素材;
  8. 加固兼容:加固后运行正常,无签名冲突、无解析失败。

四、华为审核被拒专属申诉话术(可直接复制)
华为审核支持人工复核,轻微误判、整改后可通过申诉快速过审,以下为通用标准话术:
尊敬的华为应用市场审核团队:
您好!针对本次应用审核驳回问题,我方已全面核对规则并完成全方位合规整改。
本次已完成整改内容如下:完整优化隐私政策公示内容,逐条标注第三方SDK数据收集规则与权限使用用途,清理全部测试残留代码与调试信息;精简非必要敏感权限,确保所有权限均与核心业务强相关;全面适配华为机型及深色模式,修复适配异常与交互问题;重做商店素材,保证图文与应用实际功能完全一致;排查并修复加固兼容问题,包体运行稳定无闪退。
本应用为合规自研产品,无同质化低质问题、无敏感违规内容、无侵权及虚假宣传行为,完全符合《华为应用市场审核指南》规范。
恳请审核团队重新复核审核,我方将严格遵守平台规则持续合规运营,感谢您的审核工作!


五、华为上架长期避坑核心逻辑
不同于苹果的权重风控,华为审核的核心是合规完整性+技术稳定性:

  • 不接受“差不多”,所有合规条款必须100%达标,无容错空间;
  • 资质、隐私、技术、素材、内容五大维度缺一不可,单一瑕疵直接驳回;
  • 杜绝模板套壳、虚假素材、过度索权、测试残留四大高频问题;
  • 每次提审前必须完整自查,避免反复驳回导致账号审核优先级降低。

六、全文总结
华为应用市场上架被拒,绝大多数不是玄学问题,而是隐私不合规、资质不匹配、技术适配瑕疵、素材虚假、权限滥用五大硬性问题导致。
2026年审核愈发严格,机器扫描全覆盖、人工复核零容忍,开发者必须摒弃敷衍整改思维,做到资质齐全、隐私合规、包体纯净、体验达标、素材真实。
严格按照本文自查清单整改、规范提审,即可大幅降低驳回率,实现华为应用市场一次性稳定上架。

继续阅读 »

华为应用市场上架被拒|2026最全高频驳回原因、整改方案与申诉攻略
很多开发者iOS上架能过,却频频卡在华为应用市场审核。华为审核逻辑、合规标准、技术检测、内容风控和苹果完全不同,不看界面颜值,主打硬性合规、技术完整性、资质真实性、用户体验底线。
2026年华为应用市场审核全面升级,强化隐私合规扫描、SDK风控、资质核验、同质化检测、功能完整性校验,大量开发者遭遇反复驳回、版本打回、冻结提审权限等问题。
本文整理华为官方最新审核规则+上千款App上架实操经验,汇总TOP10高频被拒原因、逐点整改方案、提审避坑清单、专属申诉话术,工具、教育、娱乐、生活服务、企业类App通用,看完基本可以一次性过审。


一、先搞懂:华为审核和苹果审核的核心区别
很多人整改无效,根本原因是用iOS上架思维做华为上架,两套审核体系完全不同:

  • 苹果:重账号权重、代码指纹、同质化马甲、产品价值,轻度合规问题可容错;
  • 华为:零容错硬性合规,隐私、权限、资质、SDK、UX体验、加固兼容性任意一项不达标,直接驳回,无容错空间。
    华为审核最大特点:机器静态扫描+动态运行检测+人工资质复核三重校验,技术漏洞、合规瑕疵、资质造假100%检出。

二、2026华为上架TOP10高频被拒原因+精准整改方案(99%开发者踩坑)
1、隐私政策不合规(全网最高频驳回)
驳回表现:隐私协议缺失、链接打不开、未标注第三方SDK收集行为、权限用途说明模糊、未适配最新隐私规范。
核心坑点:华为严格检测所有集成的第三方SDK(推送、统计、登录、支付、定位),只要有SDK数据收集行为,隐私协议未逐条说明,直接驳回。同时禁止用户未同意隐私政策前初始化SDK、读取设备信息、偷跑流量。
标准整改方案:

  • 搭建独立可访问、无失效的隐私政策官网链接,页面干净无广告、无跳转;
  • 逐条写明:收集设备信息、相册、相机、定位、存储等权限的具体业务用途;
  • 单独公示所有第三方SDK名称、收集数据类型、使用用途、数据留存规则;
  • 代码拦截:用户未同意隐私前,禁止任何SDK初始化、网络请求、设备信息读取。
    2、权限申请过度、索权无依据
    驳回表现:申请通讯录、短信、电话、定位、后台权限,但App核心功能无需对应权限,属于违规过度索权。
    整改方案:
  • 删除所有非必要敏感权限,能不用就不用;
  • 保留的权限必须在隐私协议、弹窗说明中,明确对应核心业务场景,做到权限与功能强绑定;
  • 禁止静默申请权限,所有敏感权限必须用户主动授权后再启用对应功能。
    3、软著/资质主体不一致、材料不全
    驳回表现:软件著作权主体、开发者账号主体、企业营业执照主体不一致,软著截图模糊、版本不匹配、缺少授权证明。
    核心规则:华为审核资质100%严格匹配,主体不一致直接驳回,无协商余地。
    整改方案:
  • 软著主体必须和华为开发者账号企业主体完全一致;
  • 若为授权应用,补齐官方授权链路证明、多级授权文件;
  • 上传高清无水印、无遮挡资质材料,版本号与提交App版本完全对应。
    4、应用UX体验不达标、适配异常
    驳回表现:深色模式显示错乱、页面布局拉伸、按钮点击失效、分辨率适配异常、加载空白、交互卡顿,不符合华为UX体验标准。
    整改方案:
  • 全面适配华为手机常规分辨率、深色/浅色模式,无错乱、无遮挡、无黑屏;
  • 优化页面加载逻辑,杜绝首次启动空白、卡顿、长时间无响应;
  • 按钮、弹窗、输入框交互正常,无点击失效、穿透、错位问题。
    5、商店素材违规:截图/文案/图标虚假不符
    驳回表现:截图展示未上线功能、含有其他品牌机型、文案夸大宣传、关键词堆砌、素材含第三方水印、图文与实际功能不符。
    整改方案:
  • 所有截图、预览视频必须为App真实原生界面,禁止虚假展示、超前展示未开发功能;
  • 素材优先使用华为机型展示,去除其他品牌logo、水印;
  • 删除“100%有效”“最强”“极致”等绝对化宣传词汇,文案如实描述功能。
    6、测试残留、调试信息未清理
    驳回表现:包体内残留测试账号、测试弹窗、debug日志、测试水印、冗余调试代码,被判定为测试版本,不允许上架。
    整改方案:
  • 正式打包关闭Debug模式,清空所有测试日志、测试入口、测试弹窗;
  • 删除测试占位图、废弃页面、冗余资源,保证Release包纯净;
  • 杜绝包内残留内测、体验版标识。
    7、加固兼容问题、启动闪退、运行异常
    驳回表现:加固后Manifest解析失败、启动闪退、功能失效、防二次打包与华为系统签名冲突,审核机型无法正常运行。
    整改方案:
  • 关闭加固Manifest加密参数,避免配置文件无法解析;
  • 优化SDK和应用初始化时机,规避加固导致的初始化顺序错乱;
  • 上架前在华为主流机型实测运行,确保无闪退、崩溃、功能异常问题。
    8、同质化、低质应用判定
    驳回表现:模板套壳、功能简陋、与站内大量应用高度相似,无独立创新价值,判定低质应用驳回。
    整改方案:
  • 优化产品差异化,新增独立特色功能,杜绝纯模板套壳;
  • 重构页面布局、交互逻辑,与市面同类模板应用做出明显区分;
  • 完善功能闭环,避免单一简陋功能、无使用价值的工具应用。
    9、内容违规、敏感风控不通过
    驳回表现:包含涉政、色情、暴力、迷信、虚假金融、违规推广、侵权内容,或存在误导用户、恶意引流行为。
    整改方案:
  • 全面清理App内敏感文案、违规图片、第三方引流入口;
  • 教育、金融、医疗类应用补齐对应专项资质,无资质严禁展示相关服务内容;
  • 开启内容审核机制,杜绝UGC违规内容外露。
    10、鸿蒙适配不达标、API不规范
    驳回表现:使用私有API、未适配鸿蒙特性、分布式能力异常,系统兼容性不达标。
    整改方案:
  • 替换所有私有API,使用华为官方公开标准接口;
  • 通过DevEco Studio完成API兼容性检测,修复所有适配报错;
  • 针对鸿蒙机型完成基础适配,保证运行稳定、无功能异常。

三、华为上架必做自查清单(提审前一键核对)
按照以下清单核对,可规避95%驳回问题:

  1. 资质合规:软著、营业执照、授权文件主体一致、版本匹配、材料清晰完整;
  2. 隐私合规:隐私链接有效、SDK全部公示、权限用途明确、无前置偷跑数据;
  3. 权限精简:无多余敏感权限,权限与核心功能一一对应;
  4. 包体纯净:无Debug残留、无测试入口、无冗余调试信息;
  5. 体验适配:全机型适配、深色模式正常、无闪退卡顿、交互完整;
  6. 素材真实:图文文案与功能一致,无虚假宣传、无第三方违规元素;
  7. 内容干净:无敏感内容、无违规引流、无侵权素材;
  8. 加固兼容:加固后运行正常,无签名冲突、无解析失败。

四、华为审核被拒专属申诉话术(可直接复制)
华为审核支持人工复核,轻微误判、整改后可通过申诉快速过审,以下为通用标准话术:
尊敬的华为应用市场审核团队:
您好!针对本次应用审核驳回问题,我方已全面核对规则并完成全方位合规整改。
本次已完成整改内容如下:完整优化隐私政策公示内容,逐条标注第三方SDK数据收集规则与权限使用用途,清理全部测试残留代码与调试信息;精简非必要敏感权限,确保所有权限均与核心业务强相关;全面适配华为机型及深色模式,修复适配异常与交互问题;重做商店素材,保证图文与应用实际功能完全一致;排查并修复加固兼容问题,包体运行稳定无闪退。
本应用为合规自研产品,无同质化低质问题、无敏感违规内容、无侵权及虚假宣传行为,完全符合《华为应用市场审核指南》规范。
恳请审核团队重新复核审核,我方将严格遵守平台规则持续合规运营,感谢您的审核工作!


五、华为上架长期避坑核心逻辑
不同于苹果的权重风控,华为审核的核心是合规完整性+技术稳定性:

  • 不接受“差不多”,所有合规条款必须100%达标,无容错空间;
  • 资质、隐私、技术、素材、内容五大维度缺一不可,单一瑕疵直接驳回;
  • 杜绝模板套壳、虚假素材、过度索权、测试残留四大高频问题;
  • 每次提审前必须完整自查,避免反复驳回导致账号审核优先级降低。

六、全文总结
华为应用市场上架被拒,绝大多数不是玄学问题,而是隐私不合规、资质不匹配、技术适配瑕疵、素材虚假、权限滥用五大硬性问题导致。
2026年审核愈发严格,机器扫描全覆盖、人工复核零容忍,开发者必须摒弃敷衍整改思维,做到资质齐全、隐私合规、包体纯净、体验达标、素材真实。
严格按照本文自查清单整改、规范提审,即可大幅降低驳回率,实现华为应用市场一次性稳定上架。

收起阅读 »

苹果上架遇到 3.2 封号怎么办?原因是什么?应该怎么申诉?

苹果审核

苹果上架遇到 3.2 封号怎么办?原因是什么?应该怎么申诉?

在 App Store 上架过程中,很多开发者最怕遇到两类问题:一种是 App 被拒,另一种就是开发者账号被调查甚至被封。相比普通拒审,3.2 相关问题往往更麻烦,因为它不只是某个版本的问题,还可能涉及账号主体、业务模式、资质材料、开发者身份、商业合规等多个方面。

很多人看到 3.2 后第一反应是:“是不是 App 有问题?”其实不一定。3.2 更偏向商业模式、开发者身份、资质真实性、业务合规性、是否存在误导用户、是否存在代上架或批量上架等问题。如果处理不当,轻则 App 被拒,重则账号被限制、调查,甚至终止开发者计划。

一、苹果 3.2 主要看什么?

苹果审核指南 3.2 属于“Business”商业相关规则,重点关注 App 的商业模式是否合理、开发者身份是否真实、服务是否合规、是否存在误导用户或不符合平台规则的行为。

简单理解,苹果会关注以下几个问题:

  1. 这个 App 的业务是否真实存在;
  2. 开发者是否有资格提供这个服务;
  3. App 是否涉及需要资质的行业;
  4. App 是否存在误导用户的商业行为;
  5. App 是否是给别人代上架;
  6. 账号主体和 App 业务是否匹配;
  7. 是否存在批量提交、重复提交、规避审核的行为;
  8. 是否存在虚假资料、虚假功能、虚假宣传;
  9. 是否存在高风险业务,比如金融、医疗、借贷、博彩、虚拟资产等;
  10. 是否违反了 Apple Developer Program License Agreement。

所以,3.2 不是简单改几句文案就一定能解决的问题。它通常需要从账号、资质、业务、App 内容、审核说明多个方面一起处理。

二、为什么 3.2 会导致封号?

普通拒审一般只影响当前版本,但 3.2 如果严重,就可能影响整个开发者账号。

原因很简单:苹果可能认为问题不是 App 的某个页面,而是账号本身存在风险。比如开发者账号和实际业务不匹配、提交的 App 不属于账号主体经营范围、存在代上架嫌疑、重复提交高风险应用、使用虚假资料、绕过审核规则等。

一旦苹果认为账号存在信任问题,就可能不只是拒绝 App,而是对账号进行进一步审核。这个时候开发者可能会收到类似账号调查、账号终止、开发者计划被移除等邮件。

常见表现包括:

  1. App 审核中突然被拒;
  2. App Store Connect 功能受限;
  3. 新版本无法继续提交;
  4. 账号收到调查邮件;
  5. 账号被要求提供业务资质;
  6. 账号被要求解释 App 归属;
  7. 账号被终止开发者计划;
  8. 同主体或相关账号后续提交变得更难。

所以,遇到 3.2 不要简单当作普通拒审处理,更不要频繁重复提交。

三、3.2 封号常见原因

  1. 账号主体和 App 业务不匹配

这是非常常见的原因。

比如账号主体是一家普通科技公司,但提交的 App 是金融、借贷、医疗、保险、证券、心理咨询、算命、支付、数字藏品、虚拟资产等业务。苹果可能会要求证明你有资格提供这些服务。

如果主体资料、营业执照经营范围、网站备案、隐私政策、App 内品牌、客服信息、付款主体都不一致,就会进一步增加风险。

  1. 涉及需要资质的行业

有些行业不是随便一个开发者账号就能提交。

比如:

  1. 金融借贷类;
  2. 证券基金类;
  3. 医疗健康类;
  4. 保险类;
  5. 教育培训类;
  6. 彩票博彩类;
  7. 虚拟币、虚拟资产类;
  8. 电商交易类;
  9. 支付类;
  10. 政务、公共服务类。

如果 App 涉及这些方向,但没有提供对应资质,或者资质主体和开发者主体不一致,就容易触发 3.2。

  1. 代上架痕迹明显

苹果比较关注开发者账号是否被用于给第三方代上架。

比如:

  1. 一个账号下提交多个不同客户的 App;
  2. App 内品牌和开发者名称完全不一致;
  3. 客服电话、网站、公司名称、隐私政策主体不一致;
  4. 账号主体和 App 实际运营主体不一致;
  5. 不同 App 业务跨度很大;
  6. 同账号频繁提交各种不相关类型的 App;
  7. 审核备注无法说明开发者和 App 的关系。

如果苹果认为账号不是实际运营方,而是在代替别人上架,就可能触发更严重的账号风险。

  1. App 存在误导用户或商业模式不清晰

有些 App 在标题、截图、描述里宣传得很夸张,但实际功能很简单,甚至和描述不一致。还有一些 App 通过诱导订阅、隐藏收费、模糊价格、夸大效果等方式吸引用户,也容易触发 3.2。

比如:

  1. 截图展示的功能 App 内没有;
  2. 描述夸大服务效果;
  3. 订阅价格不清楚;
  4. 试用规则不透明;
  5. 用户无法取消或管理服务;
  6. App 内服务承诺无法兑现;
  7. 用擦边文案吸引用户下载;
  8. 功能包装和实际内容不一致。

这种情况即使不封号,也很容易被拒。

  1. 反复提交高风险 App

如果一个账号多次提交被拒的 App,尤其是涉及 3.2、4.3、5.2.3、1.2、3.1.2 等问题,账号历史会越来越敏感。

比如:

  1. 被拒后没有解决根本问题,直接重提;
  2. 多次修改一点点继续碰运气;
  3. 频繁撤回、频繁提交;
  4. 多次尝试不同包名、不同名称;
  5. 同类型 App 在账号下反复出现;
  6. 明显有规避审核的痕迹。

这类行为可能让苹果认为开发者没有认真遵守审核规则,从而进一步处理账号。

  1. 资料不真实或前后不一致

苹果非常看重开发者资料的真实性。

如果 App Store Connect 信息、开发者账号信息、公司资料、网站信息、隐私政策、用户协议、App 内展示信息不一致,就容易被认为存在风险。

常见问题包括:

  1. 隐私政策里的公司名和开发者账号主体不同;
  2. App 内客服主体和开发者主体不同;
  3. 网站备案主体和 App 主体不同;
  4. 营业执照和实际业务不匹配;
  5. 审核备注里解释不清楚;
  6. 使用了不属于自己的品牌或资质;
  7. 提供的材料模糊、不完整、不可信。

这些问题都会影响账号可信度。

四、遇到 3.2 后不要做什么?

遇到 3.2 后,最忌讳乱操作。

不建议做以下事情:

  1. 不看原因,直接重新提交;
  2. 只改名字、截图、图标;
  3. 换一个包继续提交;
  4. 频繁催审核或加急;
  5. 申诉时情绪化表达;
  6. 提供无法证明的解释;
  7. 使用虚假资料补充审核;
  8. 继续用同账号提交类似 App;
  9. 把责任推给审核员;
  10. 复制模板申诉信直接发送。

3.2 问题更像是信任问题。你的申诉重点不是“求苹果放过”,而是证明:账号主体真实、业务真实、资质真实、App 归属清晰、没有误导用户、没有代上架、没有规避审核。

五、3.2 封号后应该先做什么?

  1. 先看苹果邮件原文

不要只看“3.2”这个编号,要看苹果具体写了什么。不同邮件的严重程度不一样。

你要重点看:

  1. 是 App 被拒,还是账号被终止;
  2. 是否要求提供材料;
  3. 是否提到欺诈、误导、规避审核;
  4. 是否提到开发者计划协议;
  5. 是否给了申诉入口;
  6. 是否允许继续解释;
  7. 是否要求证明 App 所属关系。

如果邮件里已经涉及账号终止,就不能再当普通拒审处理。

  1. 梳理 App 和主体关系

你要先把关系说清楚:

  1. 这个 App 是谁运营的;
  2. 开发者账号主体是谁;
  3. App 内品牌属于谁;
  4. 隐私政策主体是谁;
  5. 用户协议主体是谁;
  6. 客服和网站主体是谁;
  7. 是否有授权关系;
  8. 是否有相关资质。

如果 App 是公司自己的产品,要证明开发者主体和产品主体一致。

如果 App 是客户产品,最好有清晰授权材料,但代上架本身就容易带来风险。

  1. 准备资质和证明材料

根据业务类型准备材料。

可能需要的材料包括:

  1. 营业执照;
  2. 品牌授权书;
  3. 软件著作权;
  4. 网站备案信息;
  5. 行业许可证;
  6. 业务资质;
  7. App 运营说明;
  8. 隐私政策和用户协议;
  9. 公司官网;
  10. 客服联系方式;
  11. App 功能说明文档;
  12. 与 App 品牌相关的证明材料。

材料一定要真实、清晰、对应得上,不要临时拼凑。

  1. 检查 App 内外一致性

申诉前建议统一以下信息:

  1. App 名称;
  2. 开发者名称;
  3. 公司名称;
  4. 隐私政策主体;
  5. 用户协议主体;
  6. 官网备案主体;
  7. 客服邮箱;
  8. App 内关于我们页面;
  9. 审核备注;
  10. App Store 描述。

信息越统一,可信度越高。

六、3.2 怎么申诉?

申诉时要注意四个原则:

  1. 态度要客观

不要质问审核员,也不要说“为什么别人可以我不可以”。苹果更看重事实和证明材料。

  1. 解释要具体

不要只写“我们没有违规”。要说明 App 是什么、谁运营、服务对象是谁、是否有资质、如何保障用户权益。

  1. 材料要完整

如果涉及资质,尽量一次性提供清楚。不要一句话解释半天,但没有任何证明。

  1. 承诺要真实

可以说明已经整改了哪些内容,但不要承诺无法执行的东西。

七、3.2 申诉信模板

下面是一份比较稳的申诉模板,可以根据实际情况修改。

Hello App Review Team,
Thank you for reviewing our app and providing feedback.
We understand that the issue is related to Guideline 3.2 and the business compliance of our app. We take this matter seriously and have carefully reviewed our app, account information, business model, metadata, privacy policy, and user-facing content.
Our app is operated by [公司名称], and the Apple Developer account is also registered under [开发者主体名称]. The app is designed to provide [简要说明 App 的核心功能和服务对象]. We confirm that the app is not submitted on behalf of an unrelated third party, and it is not intended to mislead users or bypass the App Review process.
To address the concern, we have completed the following updates:

  1. Updated the app description to clearly explain the app’s core features and target users.
  2. Updated the review notes to help the review team understand the app’s usage flow.
  3. Verified that the privacy policy and terms of service are accessible and consistent with the app.
  4. Ensured that the company name, app branding, support contact, and website information are consistent.
  5. Reviewed the app content to make sure there is no misleading business information.
  6. Prepared supporting documents to verify our business ownership and qualification.
    If needed, we can provide the following supporting documents:
  7. Business license.
  8. App ownership or authorization documents.
  9. Website and company information.
  10. Relevant industry qualification documents.
  11. Additional explanation of the app’s business model and user flow.
    We respectfully request the App Review Team to reconsider our case. If there is any specific information or document required, we are willing to provide it promptly.
    Thank you for your time and support.
    Best regards,
    [姓名 / 公司名称]

八、中文申诉思路参考

如果你要先整理中文版本,可以这样写:

您好,App Review 团队:
感谢您对我们 App 的审核反馈。
我们已经认真阅读了关于 Guideline 3.2 的审核意见,并对 App 的业务模式、开发者主体、资质材料、隐私政策、用户协议、App Store 元数据以及 App 内展示内容进行了全面检查。
当前 App 由【公司名称】运营,开发者账号主体为【开发者主体名称】。该 App 主要用于【说明 App 核心功能】,服务对象为【说明用户群体】。我们确认该 App 并非代表无关第三方提交,也不存在误导用户或规避 App Review 的情况。
针对本次反馈,我们已经完成以下调整:

  1. 重新整理了 App Store 描述,明确 App 的核心功能和使用场景;
  2. 完善了审核备注,方便审核团队理解 App 的主要流程;
  3. 检查并统一了隐私政策、用户协议、公司名称、客服信息和官网信息;
  4. 核查了 App 内的功能展示,避免出现误导性描述;
  5. 准备了营业执照、授权证明、业务说明等相关材料;
  6. 对 App 内涉及商业服务的内容进行了合规检查。
    如果审核团队需要进一步确认,我们可以继续提供营业执照、品牌授权、业务资质、官网信息、App 功能说明等证明材料。
    我们尊重 App Review 的审核规则,也希望能够进一步说明我们的业务真实性和 App 合规性。恳请审核团队重新评估我们的提交。如仍有需要补充的材料,我们会第一时间配合提供。
    感谢您的时间和支持。

九、申诉材料怎么组织?

建议材料不要乱发,最好整理成清晰的说明。

可以按这个顺序组织:

  1. 公司主体说明;
  2. App 业务说明;
  3. App 和公司之间的关系;
  4. 用户使用流程;
  5. 是否涉及资质;
  6. 已经完成的整改内容;
  7. 可提供的证明材料;
  8. 联系方式和官网地址。

如果是截图材料,可以命名清楚:

  1. business_license.pdf
  2. app_ownership_statement.pdf
  3. privacy_policy_screenshot.png
  4. terms_of_service_screenshot.png
  5. app_user_flow.pdf
  6. qualification_documents.pdf

材料越清晰,审核团队越容易判断。

十、申诉成功的关键是什么?

3.2 申诉成功的关键不是写得多,而是能不能证明三个点:

第一,主体真实。

开发者账号、公司主体、App 品牌、官网、隐私政策、客服信息要能对应起来。

第二,业务合规。

App 的业务不能是平台明确不允许或高风险但无资质的方向。如果涉及特殊行业,要有对应证明。

第三,解释清楚。

审核员要能快速理解这个 App 是做什么的、谁运营、给谁用、为什么合规。

如果这三个点说不清楚,申诉信写得再长也很难解决问题。

十一、总结

苹果 3.2 问题比普通拒审更严重,因为它往往涉及商业模式、账号主体、资质证明、业务真实性和开发者可信度。轻微情况可能只是 App 被拒,严重情况可能导致账号被调查甚至封号。

遇到 3.2 不要急着重新提交,也不要只做表面修改。正确做法是先分析苹果邮件内容,再梳理账号主体、App 归属、业务资质、隐私政策、用户协议、官网信息和审核备注。

申诉时不要情绪化,不要套模板硬发,而是要围绕“主体真实、业务真实、资质真实、信息一致、用户不被误导”这几个核心点来说明。

如果账号已经被封,更要谨慎处理。这个时候重点不是继续提交新包,而是通过申诉材料证明账号和 App 的合规性。只有把信任问题解释清楚,才有机会让苹果重新评估。

继续阅读 »

苹果上架遇到 3.2 封号怎么办?原因是什么?应该怎么申诉?

在 App Store 上架过程中,很多开发者最怕遇到两类问题:一种是 App 被拒,另一种就是开发者账号被调查甚至被封。相比普通拒审,3.2 相关问题往往更麻烦,因为它不只是某个版本的问题,还可能涉及账号主体、业务模式、资质材料、开发者身份、商业合规等多个方面。

很多人看到 3.2 后第一反应是:“是不是 App 有问题?”其实不一定。3.2 更偏向商业模式、开发者身份、资质真实性、业务合规性、是否存在误导用户、是否存在代上架或批量上架等问题。如果处理不当,轻则 App 被拒,重则账号被限制、调查,甚至终止开发者计划。

一、苹果 3.2 主要看什么?

苹果审核指南 3.2 属于“Business”商业相关规则,重点关注 App 的商业模式是否合理、开发者身份是否真实、服务是否合规、是否存在误导用户或不符合平台规则的行为。

简单理解,苹果会关注以下几个问题:

  1. 这个 App 的业务是否真实存在;
  2. 开发者是否有资格提供这个服务;
  3. App 是否涉及需要资质的行业;
  4. App 是否存在误导用户的商业行为;
  5. App 是否是给别人代上架;
  6. 账号主体和 App 业务是否匹配;
  7. 是否存在批量提交、重复提交、规避审核的行为;
  8. 是否存在虚假资料、虚假功能、虚假宣传;
  9. 是否存在高风险业务,比如金融、医疗、借贷、博彩、虚拟资产等;
  10. 是否违反了 Apple Developer Program License Agreement。

所以,3.2 不是简单改几句文案就一定能解决的问题。它通常需要从账号、资质、业务、App 内容、审核说明多个方面一起处理。

二、为什么 3.2 会导致封号?

普通拒审一般只影响当前版本,但 3.2 如果严重,就可能影响整个开发者账号。

原因很简单:苹果可能认为问题不是 App 的某个页面,而是账号本身存在风险。比如开发者账号和实际业务不匹配、提交的 App 不属于账号主体经营范围、存在代上架嫌疑、重复提交高风险应用、使用虚假资料、绕过审核规则等。

一旦苹果认为账号存在信任问题,就可能不只是拒绝 App,而是对账号进行进一步审核。这个时候开发者可能会收到类似账号调查、账号终止、开发者计划被移除等邮件。

常见表现包括:

  1. App 审核中突然被拒;
  2. App Store Connect 功能受限;
  3. 新版本无法继续提交;
  4. 账号收到调查邮件;
  5. 账号被要求提供业务资质;
  6. 账号被要求解释 App 归属;
  7. 账号被终止开发者计划;
  8. 同主体或相关账号后续提交变得更难。

所以,遇到 3.2 不要简单当作普通拒审处理,更不要频繁重复提交。

三、3.2 封号常见原因

  1. 账号主体和 App 业务不匹配

这是非常常见的原因。

比如账号主体是一家普通科技公司,但提交的 App 是金融、借贷、医疗、保险、证券、心理咨询、算命、支付、数字藏品、虚拟资产等业务。苹果可能会要求证明你有资格提供这些服务。

如果主体资料、营业执照经营范围、网站备案、隐私政策、App 内品牌、客服信息、付款主体都不一致,就会进一步增加风险。

  1. 涉及需要资质的行业

有些行业不是随便一个开发者账号就能提交。

比如:

  1. 金融借贷类;
  2. 证券基金类;
  3. 医疗健康类;
  4. 保险类;
  5. 教育培训类;
  6. 彩票博彩类;
  7. 虚拟币、虚拟资产类;
  8. 电商交易类;
  9. 支付类;
  10. 政务、公共服务类。

如果 App 涉及这些方向,但没有提供对应资质,或者资质主体和开发者主体不一致,就容易触发 3.2。

  1. 代上架痕迹明显

苹果比较关注开发者账号是否被用于给第三方代上架。

比如:

  1. 一个账号下提交多个不同客户的 App;
  2. App 内品牌和开发者名称完全不一致;
  3. 客服电话、网站、公司名称、隐私政策主体不一致;
  4. 账号主体和 App 实际运营主体不一致;
  5. 不同 App 业务跨度很大;
  6. 同账号频繁提交各种不相关类型的 App;
  7. 审核备注无法说明开发者和 App 的关系。

如果苹果认为账号不是实际运营方,而是在代替别人上架,就可能触发更严重的账号风险。

  1. App 存在误导用户或商业模式不清晰

有些 App 在标题、截图、描述里宣传得很夸张,但实际功能很简单,甚至和描述不一致。还有一些 App 通过诱导订阅、隐藏收费、模糊价格、夸大效果等方式吸引用户,也容易触发 3.2。

比如:

  1. 截图展示的功能 App 内没有;
  2. 描述夸大服务效果;
  3. 订阅价格不清楚;
  4. 试用规则不透明;
  5. 用户无法取消或管理服务;
  6. App 内服务承诺无法兑现;
  7. 用擦边文案吸引用户下载;
  8. 功能包装和实际内容不一致。

这种情况即使不封号,也很容易被拒。

  1. 反复提交高风险 App

如果一个账号多次提交被拒的 App,尤其是涉及 3.2、4.3、5.2.3、1.2、3.1.2 等问题,账号历史会越来越敏感。

比如:

  1. 被拒后没有解决根本问题,直接重提;
  2. 多次修改一点点继续碰运气;
  3. 频繁撤回、频繁提交;
  4. 多次尝试不同包名、不同名称;
  5. 同类型 App 在账号下反复出现;
  6. 明显有规避审核的痕迹。

这类行为可能让苹果认为开发者没有认真遵守审核规则,从而进一步处理账号。

  1. 资料不真实或前后不一致

苹果非常看重开发者资料的真实性。

如果 App Store Connect 信息、开发者账号信息、公司资料、网站信息、隐私政策、用户协议、App 内展示信息不一致,就容易被认为存在风险。

常见问题包括:

  1. 隐私政策里的公司名和开发者账号主体不同;
  2. App 内客服主体和开发者主体不同;
  3. 网站备案主体和 App 主体不同;
  4. 营业执照和实际业务不匹配;
  5. 审核备注里解释不清楚;
  6. 使用了不属于自己的品牌或资质;
  7. 提供的材料模糊、不完整、不可信。

这些问题都会影响账号可信度。

四、遇到 3.2 后不要做什么?

遇到 3.2 后,最忌讳乱操作。

不建议做以下事情:

  1. 不看原因,直接重新提交;
  2. 只改名字、截图、图标;
  3. 换一个包继续提交;
  4. 频繁催审核或加急;
  5. 申诉时情绪化表达;
  6. 提供无法证明的解释;
  7. 使用虚假资料补充审核;
  8. 继续用同账号提交类似 App;
  9. 把责任推给审核员;
  10. 复制模板申诉信直接发送。

3.2 问题更像是信任问题。你的申诉重点不是“求苹果放过”,而是证明:账号主体真实、业务真实、资质真实、App 归属清晰、没有误导用户、没有代上架、没有规避审核。

五、3.2 封号后应该先做什么?

  1. 先看苹果邮件原文

不要只看“3.2”这个编号,要看苹果具体写了什么。不同邮件的严重程度不一样。

你要重点看:

  1. 是 App 被拒,还是账号被终止;
  2. 是否要求提供材料;
  3. 是否提到欺诈、误导、规避审核;
  4. 是否提到开发者计划协议;
  5. 是否给了申诉入口;
  6. 是否允许继续解释;
  7. 是否要求证明 App 所属关系。

如果邮件里已经涉及账号终止,就不能再当普通拒审处理。

  1. 梳理 App 和主体关系

你要先把关系说清楚:

  1. 这个 App 是谁运营的;
  2. 开发者账号主体是谁;
  3. App 内品牌属于谁;
  4. 隐私政策主体是谁;
  5. 用户协议主体是谁;
  6. 客服和网站主体是谁;
  7. 是否有授权关系;
  8. 是否有相关资质。

如果 App 是公司自己的产品,要证明开发者主体和产品主体一致。

如果 App 是客户产品,最好有清晰授权材料,但代上架本身就容易带来风险。

  1. 准备资质和证明材料

根据业务类型准备材料。

可能需要的材料包括:

  1. 营业执照;
  2. 品牌授权书;
  3. 软件著作权;
  4. 网站备案信息;
  5. 行业许可证;
  6. 业务资质;
  7. App 运营说明;
  8. 隐私政策和用户协议;
  9. 公司官网;
  10. 客服联系方式;
  11. App 功能说明文档;
  12. 与 App 品牌相关的证明材料。

材料一定要真实、清晰、对应得上,不要临时拼凑。

  1. 检查 App 内外一致性

申诉前建议统一以下信息:

  1. App 名称;
  2. 开发者名称;
  3. 公司名称;
  4. 隐私政策主体;
  5. 用户协议主体;
  6. 官网备案主体;
  7. 客服邮箱;
  8. App 内关于我们页面;
  9. 审核备注;
  10. App Store 描述。

信息越统一,可信度越高。

六、3.2 怎么申诉?

申诉时要注意四个原则:

  1. 态度要客观

不要质问审核员,也不要说“为什么别人可以我不可以”。苹果更看重事实和证明材料。

  1. 解释要具体

不要只写“我们没有违规”。要说明 App 是什么、谁运营、服务对象是谁、是否有资质、如何保障用户权益。

  1. 材料要完整

如果涉及资质,尽量一次性提供清楚。不要一句话解释半天,但没有任何证明。

  1. 承诺要真实

可以说明已经整改了哪些内容,但不要承诺无法执行的东西。

七、3.2 申诉信模板

下面是一份比较稳的申诉模板,可以根据实际情况修改。

Hello App Review Team,
Thank you for reviewing our app and providing feedback.
We understand that the issue is related to Guideline 3.2 and the business compliance of our app. We take this matter seriously and have carefully reviewed our app, account information, business model, metadata, privacy policy, and user-facing content.
Our app is operated by [公司名称], and the Apple Developer account is also registered under [开发者主体名称]. The app is designed to provide [简要说明 App 的核心功能和服务对象]. We confirm that the app is not submitted on behalf of an unrelated third party, and it is not intended to mislead users or bypass the App Review process.
To address the concern, we have completed the following updates:

  1. Updated the app description to clearly explain the app’s core features and target users.
  2. Updated the review notes to help the review team understand the app’s usage flow.
  3. Verified that the privacy policy and terms of service are accessible and consistent with the app.
  4. Ensured that the company name, app branding, support contact, and website information are consistent.
  5. Reviewed the app content to make sure there is no misleading business information.
  6. Prepared supporting documents to verify our business ownership and qualification.
    If needed, we can provide the following supporting documents:
  7. Business license.
  8. App ownership or authorization documents.
  9. Website and company information.
  10. Relevant industry qualification documents.
  11. Additional explanation of the app’s business model and user flow.
    We respectfully request the App Review Team to reconsider our case. If there is any specific information or document required, we are willing to provide it promptly.
    Thank you for your time and support.
    Best regards,
    [姓名 / 公司名称]

八、中文申诉思路参考

如果你要先整理中文版本,可以这样写:

您好,App Review 团队:
感谢您对我们 App 的审核反馈。
我们已经认真阅读了关于 Guideline 3.2 的审核意见,并对 App 的业务模式、开发者主体、资质材料、隐私政策、用户协议、App Store 元数据以及 App 内展示内容进行了全面检查。
当前 App 由【公司名称】运营,开发者账号主体为【开发者主体名称】。该 App 主要用于【说明 App 核心功能】,服务对象为【说明用户群体】。我们确认该 App 并非代表无关第三方提交,也不存在误导用户或规避 App Review 的情况。
针对本次反馈,我们已经完成以下调整:

  1. 重新整理了 App Store 描述,明确 App 的核心功能和使用场景;
  2. 完善了审核备注,方便审核团队理解 App 的主要流程;
  3. 检查并统一了隐私政策、用户协议、公司名称、客服信息和官网信息;
  4. 核查了 App 内的功能展示,避免出现误导性描述;
  5. 准备了营业执照、授权证明、业务说明等相关材料;
  6. 对 App 内涉及商业服务的内容进行了合规检查。
    如果审核团队需要进一步确认,我们可以继续提供营业执照、品牌授权、业务资质、官网信息、App 功能说明等证明材料。
    我们尊重 App Review 的审核规则,也希望能够进一步说明我们的业务真实性和 App 合规性。恳请审核团队重新评估我们的提交。如仍有需要补充的材料,我们会第一时间配合提供。
    感谢您的时间和支持。

九、申诉材料怎么组织?

建议材料不要乱发,最好整理成清晰的说明。

可以按这个顺序组织:

  1. 公司主体说明;
  2. App 业务说明;
  3. App 和公司之间的关系;
  4. 用户使用流程;
  5. 是否涉及资质;
  6. 已经完成的整改内容;
  7. 可提供的证明材料;
  8. 联系方式和官网地址。

如果是截图材料,可以命名清楚:

  1. business_license.pdf
  2. app_ownership_statement.pdf
  3. privacy_policy_screenshot.png
  4. terms_of_service_screenshot.png
  5. app_user_flow.pdf
  6. qualification_documents.pdf

材料越清晰,审核团队越容易判断。

十、申诉成功的关键是什么?

3.2 申诉成功的关键不是写得多,而是能不能证明三个点:

第一,主体真实。

开发者账号、公司主体、App 品牌、官网、隐私政策、客服信息要能对应起来。

第二,业务合规。

App 的业务不能是平台明确不允许或高风险但无资质的方向。如果涉及特殊行业,要有对应证明。

第三,解释清楚。

审核员要能快速理解这个 App 是做什么的、谁运营、给谁用、为什么合规。

如果这三个点说不清楚,申诉信写得再长也很难解决问题。

十一、总结

苹果 3.2 问题比普通拒审更严重,因为它往往涉及商业模式、账号主体、资质证明、业务真实性和开发者可信度。轻微情况可能只是 App 被拒,严重情况可能导致账号被调查甚至封号。

遇到 3.2 不要急着重新提交,也不要只做表面修改。正确做法是先分析苹果邮件内容,再梳理账号主体、App 归属、业务资质、隐私政策、用户协议、官网信息和审核备注。

申诉时不要情绪化,不要套模板硬发,而是要围绕“主体真实、业务真实、资质真实、信息一致、用户不被误导”这几个核心点来说明。

如果账号已经被封,更要谨慎处理。这个时候重点不是继续提交新包,而是通过申诉材料证明账号和 App 的合规性。只有把信任问题解释清楚,才有机会让苹果重新评估。

收起阅读 »

苹果审核上架审核太慢了,怎么办?不要一上来就加急,尤其是多次 4.3 的账号

苹果审核上架审核太慢了,怎么办?

很多开发者在提交 App Store 审核后,最怕遇到的情况就是审核一直没有动静。后台状态可能一直停留在“等待审核”,也可能已经进入“正在审核”,但是一天、两天甚至更久都没有结果。这个时候很多人会开始着急:是不是包有问题?是不是账号有问题?要不要取消重新提交?要不要申请加急审核?

其实,苹果审核慢不一定代表异常。不同类型的 App、不同账号历史、不同功能复杂度,审核时间都会不一样。尤其是涉及登录、订阅、UGC、金融、工具、AI、资质、隐私权限、马甲包相似度等内容的 App,审核时间变长是比较常见的情况。

一、审核慢,先不要马上取消审核

很多人看到审核慢,第一反应就是取消审核,然后重新打包提交。这个操作不一定正确。

如果 App 只是刚提交没多久,比如 24 小时左右还在等待审核,一般不建议马上取消。因为取消后重新提交,等于重新进入审核队列,不一定会更快,反而可能浪费时间。

如果已经进入“正在审核”,也不要频繁撤回。这个阶段说明审核员可能已经开始查看你的 App。频繁撤回、频繁改包、频繁提交,有时反而会让审核记录变得更复杂。

正确做法是先检查以下几个地方:

  1. 测试账号是否能正常登录。
  2. App 是否需要验证码,审核员是否能顺利进入。
  3. 后台接口是否稳定。
  4. App 内核心功能是否能正常体验。
  5. 隐私政策、用户协议是否能打开。
  6. 订阅信息是否完整。
  7. 权限弹窗是否说明用途。
  8. 审核备注是否写清楚。
  9. 截图、标题、描述是否和实际功能一致。

如果这些基础信息没有问题,可以先观察,不要急着重新提交。

二、苹果审核可以加急,但不能乱用

苹果确实有加急审核机制。如果你的 App 有真实紧急情况,比如线上版本出现严重 bug、影响大量用户使用、重大活动即将开始、安全修复必须尽快上线,这种情况可以尝试申请加急审核。

但是,加急审核不是万能的。

加急的作用只是让苹果更快处理你的审核请求,并不代表会降低审核标准。如果你的 App 本身存在问题,比如 4.3 相似应用、功能不完整、资质不足、隐私合规没做好、订阅信息缺失、截图和功能不匹配,那么加急只会让问题更快暴露。

很多人误以为审核慢了就申请加急,结果反而很快收到拒绝。原因很简单:苹果不是因为你加急就放宽审核,而是更快进入审核流程。

所以,加急只能用在真正紧急的场景,不适合用来解决包本身的问题。

三、多次 4.3 的账号,更不建议随便加急

如果你的 App 之前已经多次收到 4.3,或者账号下提交过多个相似 App,那么审核慢的时候更要谨慎。

4.3 通常和重复 App、相似功能、低差异化、马甲包痕迹有关。这个问题不是靠加急能解决的,而是要从产品、代码、UI、素材、功能、账号环境等多个方面重新处理。

特别是多次 4.3 之后,如果你没有做明显修改,只是换个包、换个图标、换个名字继续提交,再去申请加急,风险会更高。因为审核员可能会更快关注到你的历史记录和当前版本之间的相似性。

严格来说,真正导致账号风险升高的不是“申请一次加急”本身,而是长期反复提交高风险包、重复违规、问题没有解决还一直提交。加急只是让审核更快发生,如果包本身风险没处理干净,结果往往不会更好。

所以,多次 4.3 的账号,建议先处理以下问题:

  1. App 定位是否和之前的包明显不同。
  2. 核心功能是否有真实差异。
  3. UI 页面是否还是同一套模板。
  4. 代码结构是否高度相似。
  5. 接口、资源、素材是否重复。
  6. 隐私政策和协议是否独立。
  7. App Store 截图和描述是否像批量生成。
  8. 审核备注是否能说明 App 的真实价值。

这些没有处理好之前,不建议直接加急。

四、审核太慢时,正确处理顺序

第一步,先看审核状态。

如果只是“等待审核”,可以先观察。如果已经“正在审核”,不要频繁撤回。

第二步,检查基础资料。

重点检查测试账号、审核备注、隐私政策、用户协议、订阅信息、权限说明、App 内功能入口。很多 App 审核慢,不是苹果故意卡,而是审核员无法快速判断 App 的完整性。

第三步,判断是否存在高风险。

如果你的 App 属于工具类、AI 类、教育类、算命类、金融类、UGC 类、订阅类,或者之前有过 4.3、2.1、3.2、5.2.3 等拒绝记录,就要更加谨慎。不要把审核慢简单理解成“苹果没看到”,它也可能是在更细地看。

第四步,必要时联系苹果。

可以通过 App Store Connect 联系审核团队,询问当前审核状态,或者补充说明信息。语气要客观,不要催促、抱怨,也不要写得太情绪化。

第五步,确实紧急时,再申请加急。

如果没有真实紧急原因,不建议随便申请加急。尤其是多次 4.3 的账号,更建议先排查包体和资料问题。

五、什么情况适合申请加急?

以下情况可以考虑申请加急:

  1. 线上版本存在严重 bug。
  2. App 无法正常使用,影响大量用户。
  3. 版本涉及安全修复。
  4. 有明确时间节点的活动。
  5. App 是活动、课程、服务上线的必要工具。
  6. 当前版本必须尽快替换旧版本。

加急理由一定要真实、具体、可验证。比如:

当前版本用于修复线上严重崩溃问题,该问题会影响用户正常使用核心功能,希望申请加急审核。

这种理由相对合理。

不建议写下面这些理由:

客户很着急。
老板催上线。
已经等了一天。
我们想尽快发布。
别人都审核通过了。

这些理由通常不够充分,也容易显得不专业。

六、什么情况不建议加急?

以下情况不建议加急:

  1. 刚提交一天左右。
  2. 没有真实紧急原因。
  3. 之前刚被 4.3 拒绝。
  4. 包体没有做明显修改。
  5. 账号近期频繁提交类似 App。
  6. 测试账号不稳定。
  7. 审核备注没写清楚。
  8. 隐私政策、订阅、权限说明还没整理好。
  9. App 功能本身还不完整。
  10. 只是单纯想快点上线。

审核慢的时候,最怕的不是等待,而是乱操作。频繁撤回、频繁提交、频繁加急,有时会让账号和 App 的审核记录越来越敏感。

七、可以这样联系苹果

如果只是想询问审核状态,可以这样写:

您好,我们的 App 当前已提交审核,目前仍处于等待审核或正在审核状态。我们已经确认测试账号、核心功能、隐私政策、权限说明和审核备注均可正常使用。如果审核过程中需要更多信息,我们可以随时配合补充。感谢审核团队的处理。

如果确实需要申请加急,可以这样写:

您好,当前版本主要用于修复线上严重问题,该问题会影响用户正常使用核心功能。我们希望申请加急审核,以便尽快为用户提供稳定版本。我们理解加急审核仅适用于紧急情况,也会尊重 App Review 的审核流程。感谢审核团队的支持。

注意,语气一定要稳,不要写成催促,不要质问审核员,也不要把加急当成投诉。

八、总结

苹果审核太慢,不一定代表 App 有问题,但也不能完全忽视。正确做法是先判断状态,再检查资料,最后再考虑是否联系苹果或申请加急。

加急审核确实可以申请,但不要乱用。它适合真实紧急场景,不适合用来解决 4.3、相似度、资质、功能包装、隐私合规等根本问题。

尤其是多次 4.3 的账号,更要谨慎。这个时候重点不是催审核,而是先把 App 本身处理干净,包括功能差异、UI 差异、代码差异、素材差异、审核备注、隐私合规、账号环境等。

审核慢可以等,可以沟通,也可以在必要时加急。但真正影响过审结果的,还是 App 是否独立、完整、合规、有真实价值。不要把加急当成捷径,尤其不要在包本身风险很高的时候频繁加急,否则很容易让问题更快暴露,甚至影响后续审核节奏。

更多资料查看我主页信息

继续阅读 »

苹果审核上架审核太慢了,怎么办?

很多开发者在提交 App Store 审核后,最怕遇到的情况就是审核一直没有动静。后台状态可能一直停留在“等待审核”,也可能已经进入“正在审核”,但是一天、两天甚至更久都没有结果。这个时候很多人会开始着急:是不是包有问题?是不是账号有问题?要不要取消重新提交?要不要申请加急审核?

其实,苹果审核慢不一定代表异常。不同类型的 App、不同账号历史、不同功能复杂度,审核时间都会不一样。尤其是涉及登录、订阅、UGC、金融、工具、AI、资质、隐私权限、马甲包相似度等内容的 App,审核时间变长是比较常见的情况。

一、审核慢,先不要马上取消审核

很多人看到审核慢,第一反应就是取消审核,然后重新打包提交。这个操作不一定正确。

如果 App 只是刚提交没多久,比如 24 小时左右还在等待审核,一般不建议马上取消。因为取消后重新提交,等于重新进入审核队列,不一定会更快,反而可能浪费时间。

如果已经进入“正在审核”,也不要频繁撤回。这个阶段说明审核员可能已经开始查看你的 App。频繁撤回、频繁改包、频繁提交,有时反而会让审核记录变得更复杂。

正确做法是先检查以下几个地方:

  1. 测试账号是否能正常登录。
  2. App 是否需要验证码,审核员是否能顺利进入。
  3. 后台接口是否稳定。
  4. App 内核心功能是否能正常体验。
  5. 隐私政策、用户协议是否能打开。
  6. 订阅信息是否完整。
  7. 权限弹窗是否说明用途。
  8. 审核备注是否写清楚。
  9. 截图、标题、描述是否和实际功能一致。

如果这些基础信息没有问题,可以先观察,不要急着重新提交。

二、苹果审核可以加急,但不能乱用

苹果确实有加急审核机制。如果你的 App 有真实紧急情况,比如线上版本出现严重 bug、影响大量用户使用、重大活动即将开始、安全修复必须尽快上线,这种情况可以尝试申请加急审核。

但是,加急审核不是万能的。

加急的作用只是让苹果更快处理你的审核请求,并不代表会降低审核标准。如果你的 App 本身存在问题,比如 4.3 相似应用、功能不完整、资质不足、隐私合规没做好、订阅信息缺失、截图和功能不匹配,那么加急只会让问题更快暴露。

很多人误以为审核慢了就申请加急,结果反而很快收到拒绝。原因很简单:苹果不是因为你加急就放宽审核,而是更快进入审核流程。

所以,加急只能用在真正紧急的场景,不适合用来解决包本身的问题。

三、多次 4.3 的账号,更不建议随便加急

如果你的 App 之前已经多次收到 4.3,或者账号下提交过多个相似 App,那么审核慢的时候更要谨慎。

4.3 通常和重复 App、相似功能、低差异化、马甲包痕迹有关。这个问题不是靠加急能解决的,而是要从产品、代码、UI、素材、功能、账号环境等多个方面重新处理。

特别是多次 4.3 之后,如果你没有做明显修改,只是换个包、换个图标、换个名字继续提交,再去申请加急,风险会更高。因为审核员可能会更快关注到你的历史记录和当前版本之间的相似性。

严格来说,真正导致账号风险升高的不是“申请一次加急”本身,而是长期反复提交高风险包、重复违规、问题没有解决还一直提交。加急只是让审核更快发生,如果包本身风险没处理干净,结果往往不会更好。

所以,多次 4.3 的账号,建议先处理以下问题:

  1. App 定位是否和之前的包明显不同。
  2. 核心功能是否有真实差异。
  3. UI 页面是否还是同一套模板。
  4. 代码结构是否高度相似。
  5. 接口、资源、素材是否重复。
  6. 隐私政策和协议是否独立。
  7. App Store 截图和描述是否像批量生成。
  8. 审核备注是否能说明 App 的真实价值。

这些没有处理好之前,不建议直接加急。

四、审核太慢时,正确处理顺序

第一步,先看审核状态。

如果只是“等待审核”,可以先观察。如果已经“正在审核”,不要频繁撤回。

第二步,检查基础资料。

重点检查测试账号、审核备注、隐私政策、用户协议、订阅信息、权限说明、App 内功能入口。很多 App 审核慢,不是苹果故意卡,而是审核员无法快速判断 App 的完整性。

第三步,判断是否存在高风险。

如果你的 App 属于工具类、AI 类、教育类、算命类、金融类、UGC 类、订阅类,或者之前有过 4.3、2.1、3.2、5.2.3 等拒绝记录,就要更加谨慎。不要把审核慢简单理解成“苹果没看到”,它也可能是在更细地看。

第四步,必要时联系苹果。

可以通过 App Store Connect 联系审核团队,询问当前审核状态,或者补充说明信息。语气要客观,不要催促、抱怨,也不要写得太情绪化。

第五步,确实紧急时,再申请加急。

如果没有真实紧急原因,不建议随便申请加急。尤其是多次 4.3 的账号,更建议先排查包体和资料问题。

五、什么情况适合申请加急?

以下情况可以考虑申请加急:

  1. 线上版本存在严重 bug。
  2. App 无法正常使用,影响大量用户。
  3. 版本涉及安全修复。
  4. 有明确时间节点的活动。
  5. App 是活动、课程、服务上线的必要工具。
  6. 当前版本必须尽快替换旧版本。

加急理由一定要真实、具体、可验证。比如:

当前版本用于修复线上严重崩溃问题,该问题会影响用户正常使用核心功能,希望申请加急审核。

这种理由相对合理。

不建议写下面这些理由:

客户很着急。
老板催上线。
已经等了一天。
我们想尽快发布。
别人都审核通过了。

这些理由通常不够充分,也容易显得不专业。

六、什么情况不建议加急?

以下情况不建议加急:

  1. 刚提交一天左右。
  2. 没有真实紧急原因。
  3. 之前刚被 4.3 拒绝。
  4. 包体没有做明显修改。
  5. 账号近期频繁提交类似 App。
  6. 测试账号不稳定。
  7. 审核备注没写清楚。
  8. 隐私政策、订阅、权限说明还没整理好。
  9. App 功能本身还不完整。
  10. 只是单纯想快点上线。

审核慢的时候,最怕的不是等待,而是乱操作。频繁撤回、频繁提交、频繁加急,有时会让账号和 App 的审核记录越来越敏感。

七、可以这样联系苹果

如果只是想询问审核状态,可以这样写:

您好,我们的 App 当前已提交审核,目前仍处于等待审核或正在审核状态。我们已经确认测试账号、核心功能、隐私政策、权限说明和审核备注均可正常使用。如果审核过程中需要更多信息,我们可以随时配合补充。感谢审核团队的处理。

如果确实需要申请加急,可以这样写:

您好,当前版本主要用于修复线上严重问题,该问题会影响用户正常使用核心功能。我们希望申请加急审核,以便尽快为用户提供稳定版本。我们理解加急审核仅适用于紧急情况,也会尊重 App Review 的审核流程。感谢审核团队的支持。

注意,语气一定要稳,不要写成催促,不要质问审核员,也不要把加急当成投诉。

八、总结

苹果审核太慢,不一定代表 App 有问题,但也不能完全忽视。正确做法是先判断状态,再检查资料,最后再考虑是否联系苹果或申请加急。

加急审核确实可以申请,但不要乱用。它适合真实紧急场景,不适合用来解决 4.3、相似度、资质、功能包装、隐私合规等根本问题。

尤其是多次 4.3 的账号,更要谨慎。这个时候重点不是催审核,而是先把 App 本身处理干净,包括功能差异、UI 差异、代码差异、素材差异、审核备注、隐私合规、账号环境等。

审核慢可以等,可以沟通,也可以在必要时加急。但真正影响过审结果的,还是 App 是否独立、完整、合规、有真实价值。不要把加急当成捷径,尤其不要在包本身风险很高的时候频繁加急,否则很容易让问题更快暴露,甚至影响后续审核节奏。

更多资料查看我主页信息

收起阅读 »

设置Text字体颜色后,手机运行项目,字体仍显示为黑色

问题现象
在ArkTS项目中设置Text字体颜色fontColor为蓝色后,手机运行项目,字体仍显示为黑色。多台同型号手机运行同一项目,只有一台出现该问题。

解决方案
该问题的出现是由于问题手机开启了“高对比度文字”开关,开启“高对比度文字”后,所有应用的浅色背景字体均会显示为黑色。

解决方案:

关闭“设置”-“辅助功能”-“高对比度文字”开关。
如需配置应用字体颜色不跟随系统“高对比度文字”变化,可设置text.setTextHighContrast模式为TEXT_APP_DISABLE_HIGH_CONTRAST,关闭应用的文字渲染高对比度配置,该模式的优先级高于系统设置中的高对比度文字配置。此方法从HarmonyOS 6.0.0(API version 20)开始支持。
配置方法:text.setTextHighContrast(text.TextHighContrast.TEXT_APP_DISABLE_HIGH_CONTRAST)。
https://pastebin.com/kiSr7ViS
https://pastebin.com/DfFmsTgr
https://pastebin.com/ZpTK923Y
https://pastebin.com/r5GxKZiU
https://pastebin.com/1Sme9Xif
https://pastebin.com/nhPQB5jh
https://pastebin.com/bkDS62ZK
https://pastebin.com/GnfHYHCX
https://pastebin.com/7mc8djKs
https://pastebin.com/Z62QG9qf
https://pastebin.com/WuFEuVA3
https://pastebin.com/y0RRJ16S
https://pastebin.com/QduGHr3K
https://pastebin.com/bTUrRS7h
https://pastebin.com/2m1MEYA1
https://pastebin.com/Qi2YFNBR
https://pastebin.com/RhYrDWAF
https://pastebin.com/eLiFeBnv
https://pastebin.com/LScJb0vW
https://pastebin.com/tYWJRis5
https://pastebin.com/DtTCk9fw
https://pastebin.com/WyPm1wSN
https://pastebin.com/CzCfr7cA
https://pastebin.com/w8qKwxBa
https://pastebin.com/PUWuAd7s
https://pastebin.com/RB4NHQdW
https://pastebin.com/07TzPNQg
https://pastebin.com/EjAnqnKu
https://pastebin.com/fzm8KRhs
https://pastebin.com/SUjh0fU9
https://pastebin.com/vrDjKTQx
https://pastebin.com/W4vFQSn6
https://pastebin.com/9GQkNHuJ
https://pastebin.com/UHG8Ffat
https://pastebin.com/eazqdSZu
https://pastebin.com/1aS1Gc9L
https://pastebin.com/SPy3b2ds
https://pastebin.com/v2HNu0nf
https://pastebin.com/27jX3MzL
https://pastebin.com/ViUHutnk
https://pastebin.com/jeTazRhL
https://pastebin.com/GHWjfiN8
https://pastebin.com/c3evjtfA
https://pastebin.com/L0x7Z3K0
https://pastebin.com/pPmG3LyL
https://pastebin.com/e7uaA9gJ
https://pastebin.com/cciAuBdb
https://pastebin.com/HfLUh1kp
https://pastebin.com/4kqH08V5
https://pastebin.com/z8aYPvcm
https://pastebin.com/gcgkBXGT
https://pastebin.com/nwX5QJcc
https://pastebin.com/wPEM0x6E
https://pastebin.com/t430Uc81
https://pastebin.com/bwGwBwsz
https://pastebin.com/sTP0TE2Q
https://pastebin.com/DVxxu4aA
https://pastebin.com/PxNJPUM5
https://pastebin.com/id94WHZx
https://pastebin.com/j5uZy0XQ
https://pastebin.com/BbDfHQvG
https://pastebin.com/PEmem4wT
https://pastebin.com/tyTJzB65
https://pastebin.com/cdrbpJjd
https://pastebin.com/bhxp8VNY
https://pastebin.com/HKrX4Tus
https://pastebin.com/hECd8vmS
https://pastebin.com/zh61Uq6j
https://pastebin.com/uNeHHk8S
https://pastebin.com/iWWKVTLk
https://pastebin.com/agDuiejY
https://pastebin.com/JPS2m5i9
https://pastebin.com/gaLihEnP
https://pastebin.com/jwbtBGMS
https://pastebin.com/SLFeUnwL
https://pastebin.com/5x0j4vq4
https://pastebin.com/3zjakGxt
https://pastebin.com/Cbmd07DJ
https://pastebin.com/rL5DVSUH
https://pastebin.com/wvVf1DD3
https://pastebin.com/GRfyTFAx
https://pastebin.com/8S4VuPXw
https://pastebin.com/qsfRkzGx
https://pastebin.com/1jqMwUfv
https://pastebin.com/PAJQ9Eg7
https://pastebin.com/t6dF8PzU
https://pastebin.com/uJB2X2Th
https://pastebin.com/vaUsZ22U
https://pastebin.com/xfnHhPTu
https://pastebin.com/QzM4DUBs
https://pastebin.com/GWYXTE80
https://pastebin.com/kMZRt0gF
https://pastebin.com/XQ5MLV2j
https://pastebin.com/nR4u0s16
https://pastebin.com/P5KAdyKH
https://pastebin.com/0cVdBAww
https://pastebin.com/UccQWF5a
https://pastebin.com/Td1nxZnP
https://pastebin.com/zsKyKNSk
https://pastebin.com/crPUcGUa
https://pastebin.com/dbWbyABR
https://pastebin.com/2KUXTZDV
https://pastebin.com/wnCUGi8P
https://pastebin.com/KSYQ2k96
https://pastebin.com/1XAwRu0d
https://pastebin.com/1hhU1dVY
https://pastebin.com/ZLWu9y50
https://pastebin.com/RTkpMrz1
https://pastebin.com/mq5Neaw7
https://pastebin.com/pc5uGqK4
https://pastebin.com/uMdaGhxX
https://pastebin.com/9TDZSigD
https://pastebin.com/r0ZRJwwv
https://pastebin.com/pnWaz1cJ
https://pastebin.com/APyv4DWL
https://pastebin.com/nuKDnxVQ
https://pastebin.com/kCXpZGuT
https://pastebin.com/Bpv6Hfrq
https://pastebin.com/xw7ngGLz
https://pastebin.com/Xv8H8WNN
https://pastebin.com/5XCt11kA
https://pastebin.com/y5EAHX6m
https://pastebin.com/SR5KeQEy
https://pastebin.com/XK5VEeUV
https://pastebin.com/54i2zsvY
https://pastebin.com/CkjHtCP0
https://pastebin.com/0JqwyCKH
https://pastebin.com/wFB0ktyx
https://pastebin.com/DwWKEAC2
https://pastebin.com/bryfFEVG
https://pastebin.com/FP4bJvFq
https://pastebin.com/uPsUpJ5t
https://pastebin.com/jFUaKu3K
https://pastebin.com/v55AiTnz
https://pastebin.com/H35zXRUk
https://pastebin.com/xpsXDS4S
https://pastebin.com/rD5wrQjY
https://pastebin.com/avH7NBLb
https://pastebin.com/WA8AKxTu
https://pastebin.com/UhXN5y8y
https://pastebin.com/6jhE7F3N
https://pastebin.com/yfGA68YL
https://pastebin.com/3NKQPpTx
https://pastebin.com/JWmpHXsB
https://pastebin.com/insya6dQ
https://pastebin.com/QfXTarn1
https://pastebin.com/PC9r3UQ0
https://pastebin.com/4JJWbRhw
https://pastebin.com/YpCUdAqx
https://pastebin.com/VZccdHNQ
https://pastebin.com/sdNtjpk0
https://pastebin.com/dP2NcNtM
https://pastebin.com/NcWMNiVe
https://pastebin.com/VN5iarkU
https://pastebin.com/zS1MjxPB
https://pastebin.com/yu0nFyLc
https://pastebin.com/CsG3ThX0
https://pastebin.com/aw7HKMRc
https://pastebin.com/UHXaARF2
https://pastebin.com/qRP07XUZ
https://pastebin.com/2Ky10eBM
https://pastebin.com/CKkd2VWb
https://pastebin.com/DtwBvTyu
https://pastebin.com/7K4ZWutn
https://pastebin.com/dWdGEchW
https://pastebin.com/tz8DFpe8
https://pastebin.com/xS0h0yD7
https://pastebin.com/z2KZ6zbT
https://pastebin.com/uRxAmAce
https://pastebin.com/MFfaXKmR
https://pastebin.com/u9Bg7P8d
https://pastebin.com/6APdQ9gw
https://pastebin.com/L7XFHpAp
https://pastebin.com/BEMm2XX2
https://pastebin.com/4xhShRTd
https://pastebin.com/5UZqW6aZ
https://pastebin.com/BZ4qk9X8
https://pastebin.com/1n1Uc7Dk
https://pastebin.com/dAFkhkk4
https://pastebin.com/ic6nRJPQ
https://pastebin.com/YCYzAfG7
https://pastebin.com/t944pQ0j
https://pastebin.com/jKwryHTd
https://pastebin.com/5XaDsZPR
https://pastebin.com/q7fRLust
https://pastebin.com/03F01BET
https://pastebin.com/jHA2z3Va
https://pastebin.com/WWc6TfYy
https://pastebin.com/6EpsmfpX
https://pastebin.com/bdthptUt
https://pastebin.com/vxmJf5MR
https://pastebin.com/mTYMWrJN
https://pastebin.com/hRfRxt67
https://pastebin.com/fGzANLqH
https://pastebin.com/HXCSviYR
https://pastebin.com/eEPJC1aH

继续阅读 »

问题现象
在ArkTS项目中设置Text字体颜色fontColor为蓝色后,手机运行项目,字体仍显示为黑色。多台同型号手机运行同一项目,只有一台出现该问题。

解决方案
该问题的出现是由于问题手机开启了“高对比度文字”开关,开启“高对比度文字”后,所有应用的浅色背景字体均会显示为黑色。

解决方案:

关闭“设置”-“辅助功能”-“高对比度文字”开关。
如需配置应用字体颜色不跟随系统“高对比度文字”变化,可设置text.setTextHighContrast模式为TEXT_APP_DISABLE_HIGH_CONTRAST,关闭应用的文字渲染高对比度配置,该模式的优先级高于系统设置中的高对比度文字配置。此方法从HarmonyOS 6.0.0(API version 20)开始支持。
配置方法:text.setTextHighContrast(text.TextHighContrast.TEXT_APP_DISABLE_HIGH_CONTRAST)。
https://pastebin.com/kiSr7ViS
https://pastebin.com/DfFmsTgr
https://pastebin.com/ZpTK923Y
https://pastebin.com/r5GxKZiU
https://pastebin.com/1Sme9Xif
https://pastebin.com/nhPQB5jh
https://pastebin.com/bkDS62ZK
https://pastebin.com/GnfHYHCX
https://pastebin.com/7mc8djKs
https://pastebin.com/Z62QG9qf
https://pastebin.com/WuFEuVA3
https://pastebin.com/y0RRJ16S
https://pastebin.com/QduGHr3K
https://pastebin.com/bTUrRS7h
https://pastebin.com/2m1MEYA1
https://pastebin.com/Qi2YFNBR
https://pastebin.com/RhYrDWAF
https://pastebin.com/eLiFeBnv
https://pastebin.com/LScJb0vW
https://pastebin.com/tYWJRis5
https://pastebin.com/DtTCk9fw
https://pastebin.com/WyPm1wSN
https://pastebin.com/CzCfr7cA
https://pastebin.com/w8qKwxBa
https://pastebin.com/PUWuAd7s
https://pastebin.com/RB4NHQdW
https://pastebin.com/07TzPNQg
https://pastebin.com/EjAnqnKu
https://pastebin.com/fzm8KRhs
https://pastebin.com/SUjh0fU9
https://pastebin.com/vrDjKTQx
https://pastebin.com/W4vFQSn6
https://pastebin.com/9GQkNHuJ
https://pastebin.com/UHG8Ffat
https://pastebin.com/eazqdSZu
https://pastebin.com/1aS1Gc9L
https://pastebin.com/SPy3b2ds
https://pastebin.com/v2HNu0nf
https://pastebin.com/27jX3MzL
https://pastebin.com/ViUHutnk
https://pastebin.com/jeTazRhL
https://pastebin.com/GHWjfiN8
https://pastebin.com/c3evjtfA
https://pastebin.com/L0x7Z3K0
https://pastebin.com/pPmG3LyL
https://pastebin.com/e7uaA9gJ
https://pastebin.com/cciAuBdb
https://pastebin.com/HfLUh1kp
https://pastebin.com/4kqH08V5
https://pastebin.com/z8aYPvcm
https://pastebin.com/gcgkBXGT
https://pastebin.com/nwX5QJcc
https://pastebin.com/wPEM0x6E
https://pastebin.com/t430Uc81
https://pastebin.com/bwGwBwsz
https://pastebin.com/sTP0TE2Q
https://pastebin.com/DVxxu4aA
https://pastebin.com/PxNJPUM5
https://pastebin.com/id94WHZx
https://pastebin.com/j5uZy0XQ
https://pastebin.com/BbDfHQvG
https://pastebin.com/PEmem4wT
https://pastebin.com/tyTJzB65
https://pastebin.com/cdrbpJjd
https://pastebin.com/bhxp8VNY
https://pastebin.com/HKrX4Tus
https://pastebin.com/hECd8vmS
https://pastebin.com/zh61Uq6j
https://pastebin.com/uNeHHk8S
https://pastebin.com/iWWKVTLk
https://pastebin.com/agDuiejY
https://pastebin.com/JPS2m5i9
https://pastebin.com/gaLihEnP
https://pastebin.com/jwbtBGMS
https://pastebin.com/SLFeUnwL
https://pastebin.com/5x0j4vq4
https://pastebin.com/3zjakGxt
https://pastebin.com/Cbmd07DJ
https://pastebin.com/rL5DVSUH
https://pastebin.com/wvVf1DD3
https://pastebin.com/GRfyTFAx
https://pastebin.com/8S4VuPXw
https://pastebin.com/qsfRkzGx
https://pastebin.com/1jqMwUfv
https://pastebin.com/PAJQ9Eg7
https://pastebin.com/t6dF8PzU
https://pastebin.com/uJB2X2Th
https://pastebin.com/vaUsZ22U
https://pastebin.com/xfnHhPTu
https://pastebin.com/QzM4DUBs
https://pastebin.com/GWYXTE80
https://pastebin.com/kMZRt0gF
https://pastebin.com/XQ5MLV2j
https://pastebin.com/nR4u0s16
https://pastebin.com/P5KAdyKH
https://pastebin.com/0cVdBAww
https://pastebin.com/UccQWF5a
https://pastebin.com/Td1nxZnP
https://pastebin.com/zsKyKNSk
https://pastebin.com/crPUcGUa
https://pastebin.com/dbWbyABR
https://pastebin.com/2KUXTZDV
https://pastebin.com/wnCUGi8P
https://pastebin.com/KSYQ2k96
https://pastebin.com/1XAwRu0d
https://pastebin.com/1hhU1dVY
https://pastebin.com/ZLWu9y50
https://pastebin.com/RTkpMrz1
https://pastebin.com/mq5Neaw7
https://pastebin.com/pc5uGqK4
https://pastebin.com/uMdaGhxX
https://pastebin.com/9TDZSigD
https://pastebin.com/r0ZRJwwv
https://pastebin.com/pnWaz1cJ
https://pastebin.com/APyv4DWL
https://pastebin.com/nuKDnxVQ
https://pastebin.com/kCXpZGuT
https://pastebin.com/Bpv6Hfrq
https://pastebin.com/xw7ngGLz
https://pastebin.com/Xv8H8WNN
https://pastebin.com/5XCt11kA
https://pastebin.com/y5EAHX6m
https://pastebin.com/SR5KeQEy
https://pastebin.com/XK5VEeUV
https://pastebin.com/54i2zsvY
https://pastebin.com/CkjHtCP0
https://pastebin.com/0JqwyCKH
https://pastebin.com/wFB0ktyx
https://pastebin.com/DwWKEAC2
https://pastebin.com/bryfFEVG
https://pastebin.com/FP4bJvFq
https://pastebin.com/uPsUpJ5t
https://pastebin.com/jFUaKu3K
https://pastebin.com/v55AiTnz
https://pastebin.com/H35zXRUk
https://pastebin.com/xpsXDS4S
https://pastebin.com/rD5wrQjY
https://pastebin.com/avH7NBLb
https://pastebin.com/WA8AKxTu
https://pastebin.com/UhXN5y8y
https://pastebin.com/6jhE7F3N
https://pastebin.com/yfGA68YL
https://pastebin.com/3NKQPpTx
https://pastebin.com/JWmpHXsB
https://pastebin.com/insya6dQ
https://pastebin.com/QfXTarn1
https://pastebin.com/PC9r3UQ0
https://pastebin.com/4JJWbRhw
https://pastebin.com/YpCUdAqx
https://pastebin.com/VZccdHNQ
https://pastebin.com/sdNtjpk0
https://pastebin.com/dP2NcNtM
https://pastebin.com/NcWMNiVe
https://pastebin.com/VN5iarkU
https://pastebin.com/zS1MjxPB
https://pastebin.com/yu0nFyLc
https://pastebin.com/CsG3ThX0
https://pastebin.com/aw7HKMRc
https://pastebin.com/UHXaARF2
https://pastebin.com/qRP07XUZ
https://pastebin.com/2Ky10eBM
https://pastebin.com/CKkd2VWb
https://pastebin.com/DtwBvTyu
https://pastebin.com/7K4ZWutn
https://pastebin.com/dWdGEchW
https://pastebin.com/tz8DFpe8
https://pastebin.com/xS0h0yD7
https://pastebin.com/z2KZ6zbT
https://pastebin.com/uRxAmAce
https://pastebin.com/MFfaXKmR
https://pastebin.com/u9Bg7P8d
https://pastebin.com/6APdQ9gw
https://pastebin.com/L7XFHpAp
https://pastebin.com/BEMm2XX2
https://pastebin.com/4xhShRTd
https://pastebin.com/5UZqW6aZ
https://pastebin.com/BZ4qk9X8
https://pastebin.com/1n1Uc7Dk
https://pastebin.com/dAFkhkk4
https://pastebin.com/ic6nRJPQ
https://pastebin.com/YCYzAfG7
https://pastebin.com/t944pQ0j
https://pastebin.com/jKwryHTd
https://pastebin.com/5XaDsZPR
https://pastebin.com/q7fRLust
https://pastebin.com/03F01BET
https://pastebin.com/jHA2z3Va
https://pastebin.com/WWc6TfYy
https://pastebin.com/6EpsmfpX
https://pastebin.com/bdthptUt
https://pastebin.com/vxmJf5MR
https://pastebin.com/mTYMWrJN
https://pastebin.com/hRfRxt67
https://pastebin.com/fGzANLqH
https://pastebin.com/HXCSviYR
https://pastebin.com/eEPJC1aH

收起阅读 »

Tabs组件实现的侧边栏,如何实现自顶到底的效果

问题现象
在实现侧边栏时,希望侧边栏从最顶部开始往下排列,在条目撑满侧边栏时可以滑动,且在选中条目时能自动居中。但是使用Tabs组件中把页签设置在侧边,页签中的条目始终是居中排列,无法做到从最顶部开始往下排列。

背景知识
Tabs组件:是一种常见的界面导航结构。通过页签容器,用户可以快捷地访问应用的不同模块。
使用Tabs组件时,可以使用barMode(BarMode.Scrollable)配置实现可滚动页签,但是Tabs组件中条目高度无法自定义,而且条目数量未撑满Tabs组件时,无法实现自顶到底的效果。
List组件适合连续、多行呈现同类数据,例如图片和文本。
解决方案
由于Tabs组件无法实现自顶到底的效果,可以通过自定义组件来达到此效果。实现如下:

最外层使用Row()组件包裹,使List自定义的导航栏和Tab页内容左右分布。
导航栏使用List实现,使用Scroller的scrollToIndex方法控制List的滚动,达到子项居中显示的效果。
使用TabsController的changeIndex方法控制Tab组件的切换。
https://pastebin.com/7zPqyTTn
https://pastebin.com/3r7bw9dk
https://pastebin.com/xRWEdB7p
https://pastebin.com/6gN2DKnp
https://pastebin.com/tq3JqfmS
https://pastebin.com/6M8Hzf1v
https://pastebin.com/Q6QPY0m4
https://pastebin.com/rXQThcmE
https://pastebin.com/s9RSQt1i
https://pastebin.com/kpgu0syj
https://pastebin.com/cQkreSJj
https://pastebin.com/pGKueqEW
https://pastebin.com/Ub2efkep
https://pastebin.com/JZuHEf67
https://pastebin.com/cAdnU1nX
https://pastebin.com/RHze4jPd
https://pastebin.com/ivFEAyci
https://pastebin.com/DZN43zha
https://pastebin.com/PEFqZaD1
https://pastebin.com/PnkRfvPf
https://pastebin.com/X2qauyrJ
https://pastebin.com/41n4xzW7
https://pastebin.com/nKabq05k
https://pastebin.com/pFAYd79m
https://pastebin.com/Ma7SrzwJ
https://pastebin.com/5GVfRATY
https://pastebin.com/pwhJqSBn
https://pastebin.com/H4T9Ue4y
https://pastebin.com/wzgKdJH1
https://pastebin.com/uUKqQXqL
https://pastebin.com/rVdDMqVW
https://pastebin.com/EtNpnqEc
https://pastebin.com/MKMurYHG
https://pastebin.com/PnAtY2u3
https://pastebin.com/xQ1Kwgsz
https://pastebin.com/jQEsyCSQ
https://pastebin.com/Pggpmf3U
https://pastebin.com/ycZnZPS2
https://pastebin.com/qqjxZNhB
https://pastebin.com/4pC9wk1b
https://pastebin.com/ykPeMYZC
https://pastebin.com/wZmy5XS3
https://pastebin.com/rPbpzXsP
https://pastebin.com/LfJ5i2mu
https://pastebin.com/DUtxHa2z
https://pastebin.com/yCtLdCAf
https://pastebin.com/1BR8fpni
https://pastebin.com/eiR1U7Nc
https://pastebin.com/zh0vNSyw
https://pastebin.com/W9s708Kt
https://pastebin.com/tBbzTXqn
https://pastebin.com/JGRWPRtL
https://pastebin.com/x8JQH2na
https://pastebin.com/hrcvXGjE
https://pastebin.com/KcL5RdZp
https://pastebin.com/S2k7pc6g
https://pastebin.com/Rjh7D6p3
https://pastebin.com/LRLUqaZ0
https://pastebin.com/ihF5hA4w
https://pastebin.com/5HzGf0nR
https://pastebin.com/Yy8Q6s1h
https://pastebin.com/Z9ryCzTF
https://pastebin.com/4QtPzwLG
https://pastebin.com/GjfPdZ1W
https://pastebin.com/waBzCayQ
https://pastebin.com/9qtj2H3u
https://pastebin.com/DLGTwYLY
https://pastebin.com/83sNSekY
https://pastebin.com/er6AVGJp
https://pastebin.com/Ls76v072
https://pastebin.com/Xdvwxe8q
https://pastebin.com/R4bpErJ6
https://pastebin.com/mkQt542L
https://pastebin.com/YjQPYWiL
https://pastebin.com/XgqdtDjZ
https://pastebin.com/K2yN1Mms
https://pastebin.com/qx8Lx3QP
https://pastebin.com/bmBtiM4T
https://pastebin.com/EtaTmPAb
https://pastebin.com/G6W9DVpg
https://pastebin.com/kFBaYsVX
https://pastebin.com/Mmrna3im
https://pastebin.com/EPnjS4rd
https://pastebin.com/uwRENUE4
https://pastebin.com/gernPuSE
https://pastebin.com/8iDzr9Ph
https://pastebin.com/C03Bt2QU
https://pastebin.com/niwK92Yp
https://pastebin.com/LY4yZAPJ
https://pastebin.com/VW2biahP
https://pastebin.com/K7RpECJV
https://pastebin.com/JCTksFpe
https://pastebin.com/QMQBdbpD
https://pastebin.com/N1hAF1mc
https://pastebin.com/6cKeH1tX
https://pastebin.com/68Mw66dM
https://pastebin.com/Cp7fmZDu
https://pastebin.com/P5vTvAcA
https://pastebin.com/nQdetgZg
https://pastebin.com/rcq6uzsD
https://pastebin.com/SJeXRy40
https://pastebin.com/2Fi1TLRn
https://pastebin.com/dB11T4di
https://pastebin.com/anTZLE5p
https://pastebin.com/nmvu5M7B
https://pastebin.com/7DQHBCFX
https://pastebin.com/8jA68mkb
https://pastebin.com/rL2wrVmX
https://pastebin.com/paL5RtAF
https://pastebin.com/HDieSCVh
https://pastebin.com/aZyZZDg4
https://pastebin.com/PK7Hkwi8
https://pastebin.com/N00bJb8z
https://pastebin.com/P8RY6t6r
https://pastebin.com/c0kav7yn
https://pastebin.com/dPspabSq
https://pastebin.com/FHsMGbmQ
https://pastebin.com/tgdZqiMk
https://pastebin.com/i8Kvg3P9
https://pastebin.com/Nizubmiq
https://pastebin.com/JPNNuCBs
https://pastebin.com/zWN5n4kh
https://pastebin.com/QFZhy26c
https://pastebin.com/NS8gZ2CK
https://pastebin.com/4FyNZ4yZ
https://pastebin.com/uv8uzVRg
https://pastebin.com/XQPn6kF8
https://pastebin.com/VDjK64C1
https://pastebin.com/06KMkWcL
https://pastebin.com/jCmqiWx2
https://pastebin.com/WZQ2bzzr
https://pastebin.com/BRsv6QmL
https://pastebin.com/p9Vy4AXa
https://pastebin.com/JjpxE0gS
https://pastebin.com/wwNf2PBY
https://pastebin.com/zMJ0YFS0
https://pastebin.com/qA2nFPqa
https://pastebin.com/aKK0Z7N8
https://pastebin.com/bCg8hXje
https://pastebin.com/evUytMaQ
https://pastebin.com/WuKrDVT7
https://pastebin.com/8qRPuQLW
https://pastebin.com/P8c5MXCe
https://pastebin.com/ML1BTf4Q
https://pastebin.com/rfZJJug3
https://pastebin.com/uJvN72Pc
https://pastebin.com/fjmrFgn6
https://pastebin.com/eJsUETUv
https://pastebin.com/qFvz2q8t
https://pastebin.com/BD7w6Rk7
https://pastebin.com/BbW81Cgu
https://pastebin.com/CCMRFLwT
https://pastebin.com/hTrG4WBE
https://pastebin.com/syZYC87Z
https://pastebin.com/SKfbWzZv
https://pastebin.com/gfcxVAC0
https://pastebin.com/HeSDsqaX
https://pastebin.com/Dtkwz3cc
https://pastebin.com/6TGs4VkC
https://pastebin.com/iKDeNsZz
https://pastebin.com/m4cvDKB7
https://pastebin.com/KBV1xXQE
https://pastebin.com/VGYUgDi6
https://pastebin.com/8sLuSM02
https://pastebin.com/E32KXXej
https://pastebin.com/tLqK2hLz
https://pastebin.com/iDWTBsD7
https://pastebin.com/uhXwwM5j
https://pastebin.com/4fs5t8cy
https://pastebin.com/tKxreMs5
https://pastebin.com/Gxxm7Lty
https://pastebin.com/SRqapuS8
https://pastebin.com/n4h2QzUQ
https://pastebin.com/Jq2DZRVQ
https://pastebin.com/jw09dyMp
https://pastebin.com/LWLRNdZ0
https://pastebin.com/vxsVZ43h
https://pastebin.com/nnRmWBVL
https://pastebin.com/hpdHYibR
https://pastebin.com/m2AVvXpq
https://pastebin.com/Kaag6pD6
https://pastebin.com/knVJTd6m
https://pastebin.com/Ly7j9yaW
https://pastebin.com/rsSzf6Y8
https://pastebin.com/1DRQhKfj
https://pastebin.com/jPtm9wAJ
https://pastebin.com/WzVwKstK
https://pastebin.com/7YJu23DC
https://pastebin.com/JCqhkiRY
https://pastebin.com/LZEKaSJA
https://pastebin.com/NLaMdKJE
https://pastebin.com/qcz3ir4w
https://pastebin.com/Bj28z31y
https://pastebin.com/GVtrR4ML
https://pastebin.com/RGUvhARA
https://pastebin.com/3JNsdxgT
https://pastebin.com/2UDcQNre
https://pastebin.com/dQadpSW7
https://pastebin.com/HsP3WK5L
https://pastebin.com/vQtgrF28

继续阅读 »

问题现象
在实现侧边栏时,希望侧边栏从最顶部开始往下排列,在条目撑满侧边栏时可以滑动,且在选中条目时能自动居中。但是使用Tabs组件中把页签设置在侧边,页签中的条目始终是居中排列,无法做到从最顶部开始往下排列。

背景知识
Tabs组件:是一种常见的界面导航结构。通过页签容器,用户可以快捷地访问应用的不同模块。
使用Tabs组件时,可以使用barMode(BarMode.Scrollable)配置实现可滚动页签,但是Tabs组件中条目高度无法自定义,而且条目数量未撑满Tabs组件时,无法实现自顶到底的效果。
List组件适合连续、多行呈现同类数据,例如图片和文本。
解决方案
由于Tabs组件无法实现自顶到底的效果,可以通过自定义组件来达到此效果。实现如下:

最外层使用Row()组件包裹,使List自定义的导航栏和Tab页内容左右分布。
导航栏使用List实现,使用Scroller的scrollToIndex方法控制List的滚动,达到子项居中显示的效果。
使用TabsController的changeIndex方法控制Tab组件的切换。
https://pastebin.com/7zPqyTTn
https://pastebin.com/3r7bw9dk
https://pastebin.com/xRWEdB7p
https://pastebin.com/6gN2DKnp
https://pastebin.com/tq3JqfmS
https://pastebin.com/6M8Hzf1v
https://pastebin.com/Q6QPY0m4
https://pastebin.com/rXQThcmE
https://pastebin.com/s9RSQt1i
https://pastebin.com/kpgu0syj
https://pastebin.com/cQkreSJj
https://pastebin.com/pGKueqEW
https://pastebin.com/Ub2efkep
https://pastebin.com/JZuHEf67
https://pastebin.com/cAdnU1nX
https://pastebin.com/RHze4jPd
https://pastebin.com/ivFEAyci
https://pastebin.com/DZN43zha
https://pastebin.com/PEFqZaD1
https://pastebin.com/PnkRfvPf
https://pastebin.com/X2qauyrJ
https://pastebin.com/41n4xzW7
https://pastebin.com/nKabq05k
https://pastebin.com/pFAYd79m
https://pastebin.com/Ma7SrzwJ
https://pastebin.com/5GVfRATY
https://pastebin.com/pwhJqSBn
https://pastebin.com/H4T9Ue4y
https://pastebin.com/wzgKdJH1
https://pastebin.com/uUKqQXqL
https://pastebin.com/rVdDMqVW
https://pastebin.com/EtNpnqEc
https://pastebin.com/MKMurYHG
https://pastebin.com/PnAtY2u3
https://pastebin.com/xQ1Kwgsz
https://pastebin.com/jQEsyCSQ
https://pastebin.com/Pggpmf3U
https://pastebin.com/ycZnZPS2
https://pastebin.com/qqjxZNhB
https://pastebin.com/4pC9wk1b
https://pastebin.com/ykPeMYZC
https://pastebin.com/wZmy5XS3
https://pastebin.com/rPbpzXsP
https://pastebin.com/LfJ5i2mu
https://pastebin.com/DUtxHa2z
https://pastebin.com/yCtLdCAf
https://pastebin.com/1BR8fpni
https://pastebin.com/eiR1U7Nc
https://pastebin.com/zh0vNSyw
https://pastebin.com/W9s708Kt
https://pastebin.com/tBbzTXqn
https://pastebin.com/JGRWPRtL
https://pastebin.com/x8JQH2na
https://pastebin.com/hrcvXGjE
https://pastebin.com/KcL5RdZp
https://pastebin.com/S2k7pc6g
https://pastebin.com/Rjh7D6p3
https://pastebin.com/LRLUqaZ0
https://pastebin.com/ihF5hA4w
https://pastebin.com/5HzGf0nR
https://pastebin.com/Yy8Q6s1h
https://pastebin.com/Z9ryCzTF
https://pastebin.com/4QtPzwLG
https://pastebin.com/GjfPdZ1W
https://pastebin.com/waBzCayQ
https://pastebin.com/9qtj2H3u
https://pastebin.com/DLGTwYLY
https://pastebin.com/83sNSekY
https://pastebin.com/er6AVGJp
https://pastebin.com/Ls76v072
https://pastebin.com/Xdvwxe8q
https://pastebin.com/R4bpErJ6
https://pastebin.com/mkQt542L
https://pastebin.com/YjQPYWiL
https://pastebin.com/XgqdtDjZ
https://pastebin.com/K2yN1Mms
https://pastebin.com/qx8Lx3QP
https://pastebin.com/bmBtiM4T
https://pastebin.com/EtaTmPAb
https://pastebin.com/G6W9DVpg
https://pastebin.com/kFBaYsVX
https://pastebin.com/Mmrna3im
https://pastebin.com/EPnjS4rd
https://pastebin.com/uwRENUE4
https://pastebin.com/gernPuSE
https://pastebin.com/8iDzr9Ph
https://pastebin.com/C03Bt2QU
https://pastebin.com/niwK92Yp
https://pastebin.com/LY4yZAPJ
https://pastebin.com/VW2biahP
https://pastebin.com/K7RpECJV
https://pastebin.com/JCTksFpe
https://pastebin.com/QMQBdbpD
https://pastebin.com/N1hAF1mc
https://pastebin.com/6cKeH1tX
https://pastebin.com/68Mw66dM
https://pastebin.com/Cp7fmZDu
https://pastebin.com/P5vTvAcA
https://pastebin.com/nQdetgZg
https://pastebin.com/rcq6uzsD
https://pastebin.com/SJeXRy40
https://pastebin.com/2Fi1TLRn
https://pastebin.com/dB11T4di
https://pastebin.com/anTZLE5p
https://pastebin.com/nmvu5M7B
https://pastebin.com/7DQHBCFX
https://pastebin.com/8jA68mkb
https://pastebin.com/rL2wrVmX
https://pastebin.com/paL5RtAF
https://pastebin.com/HDieSCVh
https://pastebin.com/aZyZZDg4
https://pastebin.com/PK7Hkwi8
https://pastebin.com/N00bJb8z
https://pastebin.com/P8RY6t6r
https://pastebin.com/c0kav7yn
https://pastebin.com/dPspabSq
https://pastebin.com/FHsMGbmQ
https://pastebin.com/tgdZqiMk
https://pastebin.com/i8Kvg3P9
https://pastebin.com/Nizubmiq
https://pastebin.com/JPNNuCBs
https://pastebin.com/zWN5n4kh
https://pastebin.com/QFZhy26c
https://pastebin.com/NS8gZ2CK
https://pastebin.com/4FyNZ4yZ
https://pastebin.com/uv8uzVRg
https://pastebin.com/XQPn6kF8
https://pastebin.com/VDjK64C1
https://pastebin.com/06KMkWcL
https://pastebin.com/jCmqiWx2
https://pastebin.com/WZQ2bzzr
https://pastebin.com/BRsv6QmL
https://pastebin.com/p9Vy4AXa
https://pastebin.com/JjpxE0gS
https://pastebin.com/wwNf2PBY
https://pastebin.com/zMJ0YFS0
https://pastebin.com/qA2nFPqa
https://pastebin.com/aKK0Z7N8
https://pastebin.com/bCg8hXje
https://pastebin.com/evUytMaQ
https://pastebin.com/WuKrDVT7
https://pastebin.com/8qRPuQLW
https://pastebin.com/P8c5MXCe
https://pastebin.com/ML1BTf4Q
https://pastebin.com/rfZJJug3
https://pastebin.com/uJvN72Pc
https://pastebin.com/fjmrFgn6
https://pastebin.com/eJsUETUv
https://pastebin.com/qFvz2q8t
https://pastebin.com/BD7w6Rk7
https://pastebin.com/BbW81Cgu
https://pastebin.com/CCMRFLwT
https://pastebin.com/hTrG4WBE
https://pastebin.com/syZYC87Z
https://pastebin.com/SKfbWzZv
https://pastebin.com/gfcxVAC0
https://pastebin.com/HeSDsqaX
https://pastebin.com/Dtkwz3cc
https://pastebin.com/6TGs4VkC
https://pastebin.com/iKDeNsZz
https://pastebin.com/m4cvDKB7
https://pastebin.com/KBV1xXQE
https://pastebin.com/VGYUgDi6
https://pastebin.com/8sLuSM02
https://pastebin.com/E32KXXej
https://pastebin.com/tLqK2hLz
https://pastebin.com/iDWTBsD7
https://pastebin.com/uhXwwM5j
https://pastebin.com/4fs5t8cy
https://pastebin.com/tKxreMs5
https://pastebin.com/Gxxm7Lty
https://pastebin.com/SRqapuS8
https://pastebin.com/n4h2QzUQ
https://pastebin.com/Jq2DZRVQ
https://pastebin.com/jw09dyMp
https://pastebin.com/LWLRNdZ0
https://pastebin.com/vxsVZ43h
https://pastebin.com/nnRmWBVL
https://pastebin.com/hpdHYibR
https://pastebin.com/m2AVvXpq
https://pastebin.com/Kaag6pD6
https://pastebin.com/knVJTd6m
https://pastebin.com/Ly7j9yaW
https://pastebin.com/rsSzf6Y8
https://pastebin.com/1DRQhKfj
https://pastebin.com/jPtm9wAJ
https://pastebin.com/WzVwKstK
https://pastebin.com/7YJu23DC
https://pastebin.com/JCqhkiRY
https://pastebin.com/LZEKaSJA
https://pastebin.com/NLaMdKJE
https://pastebin.com/qcz3ir4w
https://pastebin.com/Bj28z31y
https://pastebin.com/GVtrR4ML
https://pastebin.com/RGUvhARA
https://pastebin.com/3JNsdxgT
https://pastebin.com/2UDcQNre
https://pastebin.com/dQadpSW7
https://pastebin.com/HsP3WK5L
https://pastebin.com/vQtgrF28

收起阅读 »

iOS 卡顿检测工具推荐 从 FPS 到帧提交延迟的分析

iOS

'''App 卡顿是 iOS 开发中最常见的性能问题之一。卡顿的表现很直观——滑动列表不跟手、页面切换掉帧、动画卡住。但定位卡顿原因光靠肉眼观察不够,需要从 FPS、帧提交延迟、CPU 和 GPU 负载几个维度综合判断。

FPS 指标怎么看

FPS(每秒渲染帧数)是衡量流畅度的基础指标。普通 iOS 设备屏幕刷新率 60Hz,最高 60 FPS。ProMotion 设备(iPhone 13 Pro 及以上)支持 120Hz,最高 120 FPS。

FPS 掉到 45 以下就能感觉到明显卡顿,低于 30 已经是严重问题。但 FPS 不能反映所有问题——有时候平均帧率看起来有 55,实际体验却一顿一顿的,这是因为帧提交时间不稳定。

卡顿检测看什么

卡顿检测追踪的是每一帧的提交延迟,和 FPS 关注的角度不同。FPS 看的是每秒渲染了多少帧,卡顿检测看的是相邻两帧之间的时间间隔是否均匀。帧率稳定但帧间隔波动大,体验依然不好。

ProMotion 高刷设备上,建议切换到卡顿监控而非 FPS 监控来观察真实渲染性能。轻载场景保持 80-120 FPS,重载场景不低于 60 FPS。如果发现刷新率长期锁定在 60Hz,可能是应用没有适配 ProMotion,需要在 plist 里声明 CADisableMinimumFrameDurationOnPhone。

Instruments:官方卡顿分析

Instruments 的 Core Animation 模板可以检测渲染性能。运行后显示 FPS、GPU 利用率和渲染提交详情。能定位到具体是哪个 view 的绘制导致掉帧。缺点是每次分析需要配置和启动,不适合日常快速验证。

Hit Testing 和滚动性能分析用 Instruments 比较准确,可以看到 vsync 丢失次数和 GPU 空闲时间。

Xcode 的屏幕调试

Xcode 的 Debug 面板里有个 Debug View Hierarchy 功能,可以检查视图层级是否过度复杂。界面上叠加了太多的视图层级,或者离屏渲染过多,都会导致每帧渲染时间增加。

Simulator 的 Debug → Color Blended Layers 选项可以高亮显示需要混合的图层区域,帮助减少透明度叠加导致的性能开销。

KeyMob 的卡顿检测

KeyMob 的 FPS 监控和卡顿检测功能放在性能图表模块里。FPS 监控显示实时帧率曲线,60Hz 设备上限 60,120Hz 设备支持到 120。

对于高刷设备,在指标下拉框里勾选"卡顿监控"而不是 FPS,可以看到设备的真实可变刷新率。卡顿监控追踪每一帧的提交延迟,能捕捉到 FPS 看不出来的丢帧问题。如果发现了卡顿可以配合性能数据保存功能,把监控结果和数据保存下来,对比不同版本的表现。

KeyMob 的 GPU 监控也能帮助分析卡顿原因。设备利用率超过 90% 通常意味着渲染压力大,检查是否有过度绘制或复杂 shader。Tile 利用率超过 85% 可能需要优化纹理压缩格式。CPU 占用过高也可能导致主线程卡顿,可以在 CPU 监控里看是否有线程持续占满资源。

多工具配合

日常快速验证用 KeyMob 的 FPS 和卡顿监控实时看一下,发现问题后再用 Instruments 做深度分析定位具体代码。两者配合覆盖了从快速排查到精确定位的完整链条。'''

继续阅读 »

'''App 卡顿是 iOS 开发中最常见的性能问题之一。卡顿的表现很直观——滑动列表不跟手、页面切换掉帧、动画卡住。但定位卡顿原因光靠肉眼观察不够,需要从 FPS、帧提交延迟、CPU 和 GPU 负载几个维度综合判断。

FPS 指标怎么看

FPS(每秒渲染帧数)是衡量流畅度的基础指标。普通 iOS 设备屏幕刷新率 60Hz,最高 60 FPS。ProMotion 设备(iPhone 13 Pro 及以上)支持 120Hz,最高 120 FPS。

FPS 掉到 45 以下就能感觉到明显卡顿,低于 30 已经是严重问题。但 FPS 不能反映所有问题——有时候平均帧率看起来有 55,实际体验却一顿一顿的,这是因为帧提交时间不稳定。

卡顿检测看什么

卡顿检测追踪的是每一帧的提交延迟,和 FPS 关注的角度不同。FPS 看的是每秒渲染了多少帧,卡顿检测看的是相邻两帧之间的时间间隔是否均匀。帧率稳定但帧间隔波动大,体验依然不好。

ProMotion 高刷设备上,建议切换到卡顿监控而非 FPS 监控来观察真实渲染性能。轻载场景保持 80-120 FPS,重载场景不低于 60 FPS。如果发现刷新率长期锁定在 60Hz,可能是应用没有适配 ProMotion,需要在 plist 里声明 CADisableMinimumFrameDurationOnPhone。

Instruments:官方卡顿分析

Instruments 的 Core Animation 模板可以检测渲染性能。运行后显示 FPS、GPU 利用率和渲染提交详情。能定位到具体是哪个 view 的绘制导致掉帧。缺点是每次分析需要配置和启动,不适合日常快速验证。

Hit Testing 和滚动性能分析用 Instruments 比较准确,可以看到 vsync 丢失次数和 GPU 空闲时间。

Xcode 的屏幕调试

Xcode 的 Debug 面板里有个 Debug View Hierarchy 功能,可以检查视图层级是否过度复杂。界面上叠加了太多的视图层级,或者离屏渲染过多,都会导致每帧渲染时间增加。

Simulator 的 Debug → Color Blended Layers 选项可以高亮显示需要混合的图层区域,帮助减少透明度叠加导致的性能开销。

KeyMob 的卡顿检测

KeyMob 的 FPS 监控和卡顿检测功能放在性能图表模块里。FPS 监控显示实时帧率曲线,60Hz 设备上限 60,120Hz 设备支持到 120。

对于高刷设备,在指标下拉框里勾选"卡顿监控"而不是 FPS,可以看到设备的真实可变刷新率。卡顿监控追踪每一帧的提交延迟,能捕捉到 FPS 看不出来的丢帧问题。如果发现了卡顿可以配合性能数据保存功能,把监控结果和数据保存下来,对比不同版本的表现。

KeyMob 的 GPU 监控也能帮助分析卡顿原因。设备利用率超过 90% 通常意味着渲染压力大,检查是否有过度绘制或复杂 shader。Tile 利用率超过 85% 可能需要优化纹理压缩格式。CPU 占用过高也可能导致主线程卡顿,可以在 CPU 监控里看是否有线程持续占满资源。

多工具配合

日常快速验证用 KeyMob 的 FPS 和卡顿监控实时看一下,发现问题后再用 Instruments 做深度分析定位具体代码。两者配合覆盖了从快速排查到精确定位的完整链条。'''

收起阅读 »

如何解决拖拽功能和长按功能的冲突问题

问题现象
在List组件中,单个ListItem在同时设置拖拽功能与长按功能时,实际运行之后会产生冲突,如何解决单个ListItem拖拽功能和长按功能的冲突问题?

效果预览
点击放大

背景知识
支持统一拖拽提供了一种通过鼠标或手势触屏传递数据的机制,即从一个组件位置拖出数据并将其拖入到另一个组件位置,以触发响应。
长按手势通过长按屏幕触发长按手势事件。
由于拖拽事件和长按手势都需要通过长按来触发,因此这种组合手势类型会出现冲突,例如List组件中每个ListItem都设置单独的长按事件时,拖拽功能和长按手势功能就会出现冲突。
Grid网格容器,由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。
滑动手势PanGesture,能够提供自定义拖拽事件的功能。
解决方案
由于在ListItem中设置单独的长按事件会与拖拽事件产生冲突,因此建议放弃List本身的拖拽事件,使用滑动手势PanGesture,自行实现拖拽过程的逻辑,然后再通过组合手势的功能,去实现其他的长按事件。
import curves from '@ohos.curves';

@Entry
@Component
struct Page {
// 元素数组
@State numbers: number[] = [];
// 多列
private str: string = '';
row: number = 4;
// 元素数组中最后一个元素的索引
@State lastIndex: number = 0;
@State dragItem: number = -1;
@State scaleItem: number = -1;
item: number = -1;
private dragRefOffsetX: number = 0;
private dragRefOffsetY: number = 0;
@State offsetX: number = 0;
@State offsetY: number = 0;
private FIX_VP_X: number = 108;
private FIX_VP_Y: number = 120;

aboutToAppear() {
for (let i = 1; i <= 36; i++) {
this.numbers.push(i);
}
this.lastIndex = this.numbers.length - 1;
// 多列
for (let i = 0; i < this.row; i++) {
this.str = this.str + '1fr ';
}
}

itemMove(index: number, newIndex: number): void {
console.info('index:' + index + ' newIndex:' + newIndex);
if (!this.isDraggable(newIndex)) {
return;
}
let tmp = this.numbers.splice(index, 1);
this.numbers.splice(newIndex, 0, tmp[0]);
}

// 向下滑
down(index: number): void {
if (!this.isDraggable(index + this.row)) {
return;
}
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
// 多列
this.itemMove(index, index + this.row);
}

// 向下滑(右下角为空)
down2(index: number): void {
if (!this.isDraggable(index + 3)) {
return;
}
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + 3);
}

// 向上滑
up(index: number): void {
if (!this.isDraggable(index - this.row)) {
return;
}
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - this.row);
}

// 向左滑
left(index: number): void {
if (!this.isDraggable(index - 1)) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.itemMove(index, index - 1);
}

// 向右滑
right(index: number): void {
if (!this.isDraggable(index + 1)) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.itemMove(index, index + 1);
}

// 向右下滑
lowerRight(index: number): void {
if (!this.isDraggable(index + this.row + 1)) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + this.row + 1);
}

// 向右上滑
upperRight(index: number): void {
if (!this.isDraggable(index - (this.row - 1))) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - (this.row - 1));
}

// 向左下滑
lowerLeft(index: number): void {
if (!this.isDraggable(index + (this.row - 1))) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + (this.row - 1));
}

// 向左上滑
upperLeft(index: number): void {
if (!this.isDraggable(index - (this.row + 1))) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - (this.row + 1));
}

// 通过元素的索引,控制对应元素是否能移动排序
isDraggable(index: number): boolean {
console.info(index: ${index});
return index > -1; // 恒成立,所有元素均可移动排序
}
https://pastebin.com/FQ7caXPg
https://pastebin.com/qrG8cLtE
https://pastebin.com/NDkKX7GA
https://pastebin.com/v7SbJUa2
https://pastebin.com/ckwh85Uv
https://pastebin.com/FyQiZnSa
https://pastebin.com/eJTdnrt3
https://pastebin.com/FSynV6Lb
https://pastebin.com/DAj2WRVR
https://pastebin.com/2Y0LWg8C
https://pastebin.com/U3rE0GN7
https://pastebin.com/5SqdHMZn
https://pastebin.com/3vZs9u6Y
https://pastebin.com/6SHV25A8
https://pastebin.com/cxcm4039
https://pastebin.com/Rgdfcp9d
https://pastebin.com/g8Thr4Mg
https://pastebin.com/rmwrNJji
https://pastebin.com/yKbAsYCa
https://pastebin.com/dRdM2X9u
https://pastebin.com/ecff1hqL
https://pastebin.com/UGKhTWQ8
https://pastebin.com/s5hexmMG
https://pastebin.com/vixNaxtq
https://pastebin.com/jM99sFyZ
https://pastebin.com/enua3UEF
https://pastebin.com/d0QccunL
https://pastebin.com/NW6ahtVi
https://pastebin.com/HdFmVJDd
https://pastebin.com/dvqz627c
https://pastebin.com/2dkeMADC
https://pastebin.com/H61nZMVs
https://pastebin.com/VAJYkWis
https://pastebin.com/3Y7xVCzF
https://pastebin.com/XWH0bcEB
https://pastebin.com/0yZbjU38
https://pastebin.com/KT9GU4Xj
https://pastebin.com/6JyqmT7e
https://pastebin.com/3fFG8u4J
https://pastebin.com/jLbepB1x
https://pastebin.com/fcqxvaXX
https://pastebin.com/3yKQCFzT
https://pastebin.com/Gpz5Yc8A
https://pastebin.com/KUjNqvfq
https://pastebin.com/JRp0SxQ5
https://pastebin.com/dAeJ7KxQ
https://pastebin.com/Y59qi6iT
https://pastebin.com/hsBpJYrt
https://pastebin.com/2wNNccE8
https://pastebin.com/dHCqmGeK
https://pastebin.com/5zYAQpvu
https://pastebin.com/dN3bshkc
https://pastebin.com/cFSUYDNN
https://pastebin.com/yWKUSPZz
https://pastebin.com/pjyMPVgp
https://pastebin.com/iASRBbGz
https://pastebin.com/zrVfHyC0
https://pastebin.com/Lg6i3qBs
https://pastebin.com/C9y6bEfC
https://pastebin.com/3xhPr5Uz
https://pastebin.com/u6fHcaUM
https://pastebin.com/GTjsW1uh
https://pastebin.com/15xfuW7r
https://pastebin.com/ATU9sQ6v
https://pastebin.com/a2mCY3Zz
https://pastebin.com/ntnWiFcr
https://pastebin.com/AH45r30t
https://pastebin.com/H0AQ1Dww
https://pastebin.com/diHn40ki
https://pastebin.com/CZH3ckGE
https://pastebin.com/UxAfGRQt
https://pastebin.com/FLNsUiG0
https://pastebin.com/AAWktRKj
https://pastebin.com/sKm7XvTE
https://pastebin.com/gvp4Q7sh
https://pastebin.com/xuCUMBur
https://pastebin.com/2espHLP1
https://pastebin.com/64pjxFAc
https://pastebin.com/J5fQPN5U
https://pastebin.com/J0rJg6DX
https://pastebin.com/QtWnkBDp
https://pastebin.com/SeGa4TkD
https://pastebin.com/WTwjcNN1
https://pastebin.com/MAqkmJXT
https://pastebin.com/sct8XVCM
https://pastebin.com/hkT7CqNH
https://pastebin.com/f7pCY395
https://pastebin.com/ZSbSpbL6
https://pastebin.com/Ug0RKLfK
https://pastebin.com/CV8Ercz3
https://pastebin.com/guYntd9W
https://pastebin.com/Dz3vpsZz
https://pastebin.com/0QCcxGWy
https://pastebin.com/Nd37dhtk
https://pastebin.com/yf59y43d
https://pastebin.com/nj7W9tyx
https://pastebin.com/5JCZtmRJ
https://pastebin.com/wagqVUtS
https://pastebin.com/1X65Yjc3
https://pastebin.com/TtXircBz
https://pastebin.com/fTwWHfEe
https://pastebin.com/zYrag51J
https://pastebin.com/E9icvGyK
https://pastebin.com/2cXwRAxL
https://pastebin.com/w0GGQRhc
https://pastebin.com/53sfuRZK
https://pastebin.com/90uQ7V15
https://pastebin.com/ghzaUYMF
https://pastebin.com/Nnpgvdes
https://pastebin.com/Y8tuCtaz
https://pastebin.com/iWx1huat
https://pastebin.com/FdQgitkv
https://pastebin.com/8amig0td
https://pastebin.com/yzcTvFfu
https://pastebin.com/68HwXpv5
https://pastebin.com/KLAWLeKM
https://pastebin.com/dMUbkzF2
https://pastebin.com/g6rLz6au
https://pastebin.com/trd44WK2
https://pastebin.com/cQ8audPK
https://pastebin.com/wRuQcX47
https://pastebin.com/nyzk75PP
https://pastebin.com/a52FLwqg
https://pastebin.com/ifwAEKs8
https://pastebin.com/7hsBC6eM
https://pastebin.com/pLAWFQ8U
https://pastebin.com/j70c8uBX
https://pastebin.com/ymKQsh4f
https://pastebin.com/4dqNaX6T
https://pastebin.com/HSdANUrQ
https://pastebin.com/Nh8sivuq
https://pastebin.com/q55w0w2i
https://pastebin.com/wXf37h3E
https://pastebin.com/RhAxX63P
https://pastebin.com/
https://pastebin.com/d0ftXeii
https://pastebin.com/w7cKXeMc
https://pastebin.com/vJQZ8zzg
https://pastebin.com/NV6uSXAB
https://pastebin.com/aDZckQqR
https://pastebin.com/LECR3S3x
https://pastebin.com/cp78R0ry
https://pastebin.com/WD0P7hDC
https://pastebin.com/iA0h7MsB
https://pastebin.com/509YHhv2
https://pastebin.com/sR22DfaA
https://pastebin.com/fkwWBgB1
https://pastebin.com/xu1tZaib
https://pastebin.com/0e9mbjm1
https://pastebin.com/8ygNAi7Q
https://pastebin.com/q10N4BVV
https://pastebin.com/E5a1VSUL
https://pastebin.com/N4rt7xkq
https://pastebin.com/KLKahxYp
https://pastebin.com/aAhka9TS
https://pastebin.com/cFzzqVdL
https://pastebin.com/TdF2uE9H
https://pastebin.com/sAwMjAbi
https://pastebin.com/DZNFtzZq
https://pastebin.com/tHjy4Dqz
https://pastebin.com/7nGK9sVT
https://pastebin.com/uh2XxG80
https://pastebin.com/AnR5ZVHR
https://pastebin.com/Y3RLNXTu
https://pastebin.com/H1QvABLE
https://pastebin.com/gu3H4ZCC
https://pastebin.com/6stL1Xpp
https://pastebin.com/yx5inydp
https://pastebin.com/hyiiCV2A
https://pastebin.com/rgCkSxnQ
https://pastebin.com/smR119Kz
https://pastebin.com/H6GguYti
https://pastebin.com/zMupz2e0
https://pastebin.com/hA0jPvEB
https://pastebin.com/a617mt5H
https://pastebin.com/nkjG08Fw
https://pastebin.com/k6NKap1G
https://pastebin.com/mmiNsmtC
https://pastebin.com/i6V5V5dz
https://pastebin.com/GUvCDwNE
https://pastebin.com/Cd7LEAAE
https://pastebin.com/uN4xeDXm
https://pastebin.com/WT2yyehE
https://pastebin.com/3qxa54xX
https://pastebin.com/xdnPSK9i
https://pastebin.com/EEpWrErg
https://pastebin.com/MbUH0ZVm
https://pastebin.com/UfRH2vMY
https://pastebin.com/qcmM4qiM
https://pastebin.com/0NXAxPQR
https://pastebin.com/bXmTJhyf
https://pastebin.com/716Zr85T
https://pastebin.com/X0JFDTJ0
https://pastebin.com/gSc7vpdF
https://pastebin.com/LKUU1kbW
https://pastebin.com/XfbRxeZ7
https://pastebin.com/afMDqP8e
https://pastebin.com/QxJgJX0x
https://pastebin.com/WGrQcNAF
https://pastebin.com/Kbj0zKmQ

继续阅读 »

问题现象
在List组件中,单个ListItem在同时设置拖拽功能与长按功能时,实际运行之后会产生冲突,如何解决单个ListItem拖拽功能和长按功能的冲突问题?

效果预览
点击放大

背景知识
支持统一拖拽提供了一种通过鼠标或手势触屏传递数据的机制,即从一个组件位置拖出数据并将其拖入到另一个组件位置,以触发响应。
长按手势通过长按屏幕触发长按手势事件。
由于拖拽事件和长按手势都需要通过长按来触发,因此这种组合手势类型会出现冲突,例如List组件中每个ListItem都设置单独的长按事件时,拖拽功能和长按手势功能就会出现冲突。
Grid网格容器,由“行”和“列”分割的单元格所组成,通过指定“项目”所在的单元格做出各种各样的布局。
滑动手势PanGesture,能够提供自定义拖拽事件的功能。
解决方案
由于在ListItem中设置单独的长按事件会与拖拽事件产生冲突,因此建议放弃List本身的拖拽事件,使用滑动手势PanGesture,自行实现拖拽过程的逻辑,然后再通过组合手势的功能,去实现其他的长按事件。
import curves from '@ohos.curves';

@Entry
@Component
struct Page {
// 元素数组
@State numbers: number[] = [];
// 多列
private str: string = '';
row: number = 4;
// 元素数组中最后一个元素的索引
@State lastIndex: number = 0;
@State dragItem: number = -1;
@State scaleItem: number = -1;
item: number = -1;
private dragRefOffsetX: number = 0;
private dragRefOffsetY: number = 0;
@State offsetX: number = 0;
@State offsetY: number = 0;
private FIX_VP_X: number = 108;
private FIX_VP_Y: number = 120;

aboutToAppear() {
for (let i = 1; i <= 36; i++) {
this.numbers.push(i);
}
this.lastIndex = this.numbers.length - 1;
// 多列
for (let i = 0; i < this.row; i++) {
this.str = this.str + '1fr ';
}
}

itemMove(index: number, newIndex: number): void {
console.info('index:' + index + ' newIndex:' + newIndex);
if (!this.isDraggable(newIndex)) {
return;
}
let tmp = this.numbers.splice(index, 1);
this.numbers.splice(newIndex, 0, tmp[0]);
}

// 向下滑
down(index: number): void {
if (!this.isDraggable(index + this.row)) {
return;
}
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
// 多列
this.itemMove(index, index + this.row);
}

// 向下滑(右下角为空)
down2(index: number): void {
if (!this.isDraggable(index + 3)) {
return;
}
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + 3);
}

// 向上滑
up(index: number): void {
if (!this.isDraggable(index - this.row)) {
return;
}
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - this.row);
}

// 向左滑
left(index: number): void {
if (!this.isDraggable(index - 1)) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.itemMove(index, index - 1);
}

// 向右滑
right(index: number): void {
if (!this.isDraggable(index + 1)) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.itemMove(index, index + 1);
}

// 向右下滑
lowerRight(index: number): void {
if (!this.isDraggable(index + this.row + 1)) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + this.row + 1);
}

// 向右上滑
upperRight(index: number): void {
if (!this.isDraggable(index - (this.row - 1))) {
return;
}
this.offsetX -= this.FIX_VP_X;
this.dragRefOffsetX += this.FIX_VP_X;
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - (this.row - 1));
}

// 向左下滑
lowerLeft(index: number): void {
if (!this.isDraggable(index + (this.row - 1))) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.offsetY -= this.FIX_VP_Y;
this.dragRefOffsetY += this.FIX_VP_Y;
this.itemMove(index, index + (this.row - 1));
}

// 向左上滑
upperLeft(index: number): void {
if (!this.isDraggable(index - (this.row + 1))) {
return;
}
this.offsetX += this.FIX_VP_X;
this.dragRefOffsetX -= this.FIX_VP_X;
this.offsetY += this.FIX_VP_Y;
this.dragRefOffsetY -= this.FIX_VP_Y;
this.itemMove(index, index - (this.row + 1));
}

// 通过元素的索引,控制对应元素是否能移动排序
isDraggable(index: number): boolean {
console.info(index: ${index});
return index > -1; // 恒成立,所有元素均可移动排序
}
https://pastebin.com/FQ7caXPg
https://pastebin.com/qrG8cLtE
https://pastebin.com/NDkKX7GA
https://pastebin.com/v7SbJUa2
https://pastebin.com/ckwh85Uv
https://pastebin.com/FyQiZnSa
https://pastebin.com/eJTdnrt3
https://pastebin.com/FSynV6Lb
https://pastebin.com/DAj2WRVR
https://pastebin.com/2Y0LWg8C
https://pastebin.com/U3rE0GN7
https://pastebin.com/5SqdHMZn
https://pastebin.com/3vZs9u6Y
https://pastebin.com/6SHV25A8
https://pastebin.com/cxcm4039
https://pastebin.com/Rgdfcp9d
https://pastebin.com/g8Thr4Mg
https://pastebin.com/rmwrNJji
https://pastebin.com/yKbAsYCa
https://pastebin.com/dRdM2X9u
https://pastebin.com/ecff1hqL
https://pastebin.com/UGKhTWQ8
https://pastebin.com/s5hexmMG
https://pastebin.com/vixNaxtq
https://pastebin.com/jM99sFyZ
https://pastebin.com/enua3UEF
https://pastebin.com/d0QccunL
https://pastebin.com/NW6ahtVi
https://pastebin.com/HdFmVJDd
https://pastebin.com/dvqz627c
https://pastebin.com/2dkeMADC
https://pastebin.com/H61nZMVs
https://pastebin.com/VAJYkWis
https://pastebin.com/3Y7xVCzF
https://pastebin.com/XWH0bcEB
https://pastebin.com/0yZbjU38
https://pastebin.com/KT9GU4Xj
https://pastebin.com/6JyqmT7e
https://pastebin.com/3fFG8u4J
https://pastebin.com/jLbepB1x
https://pastebin.com/fcqxvaXX
https://pastebin.com/3yKQCFzT
https://pastebin.com/Gpz5Yc8A
https://pastebin.com/KUjNqvfq
https://pastebin.com/JRp0SxQ5
https://pastebin.com/dAeJ7KxQ
https://pastebin.com/Y59qi6iT
https://pastebin.com/hsBpJYrt
https://pastebin.com/2wNNccE8
https://pastebin.com/dHCqmGeK
https://pastebin.com/5zYAQpvu
https://pastebin.com/dN3bshkc
https://pastebin.com/cFSUYDNN
https://pastebin.com/yWKUSPZz
https://pastebin.com/pjyMPVgp
https://pastebin.com/iASRBbGz
https://pastebin.com/zrVfHyC0
https://pastebin.com/Lg6i3qBs
https://pastebin.com/C9y6bEfC
https://pastebin.com/3xhPr5Uz
https://pastebin.com/u6fHcaUM
https://pastebin.com/GTjsW1uh
https://pastebin.com/15xfuW7r
https://pastebin.com/ATU9sQ6v
https://pastebin.com/a2mCY3Zz
https://pastebin.com/ntnWiFcr
https://pastebin.com/AH45r30t
https://pastebin.com/H0AQ1Dww
https://pastebin.com/diHn40ki
https://pastebin.com/CZH3ckGE
https://pastebin.com/UxAfGRQt
https://pastebin.com/FLNsUiG0
https://pastebin.com/AAWktRKj
https://pastebin.com/sKm7XvTE
https://pastebin.com/gvp4Q7sh
https://pastebin.com/xuCUMBur
https://pastebin.com/2espHLP1
https://pastebin.com/64pjxFAc
https://pastebin.com/J5fQPN5U
https://pastebin.com/J0rJg6DX
https://pastebin.com/QtWnkBDp
https://pastebin.com/SeGa4TkD
https://pastebin.com/WTwjcNN1
https://pastebin.com/MAqkmJXT
https://pastebin.com/sct8XVCM
https://pastebin.com/hkT7CqNH
https://pastebin.com/f7pCY395
https://pastebin.com/ZSbSpbL6
https://pastebin.com/Ug0RKLfK
https://pastebin.com/CV8Ercz3
https://pastebin.com/guYntd9W
https://pastebin.com/Dz3vpsZz
https://pastebin.com/0QCcxGWy
https://pastebin.com/Nd37dhtk
https://pastebin.com/yf59y43d
https://pastebin.com/nj7W9tyx
https://pastebin.com/5JCZtmRJ
https://pastebin.com/wagqVUtS
https://pastebin.com/1X65Yjc3
https://pastebin.com/TtXircBz
https://pastebin.com/fTwWHfEe
https://pastebin.com/zYrag51J
https://pastebin.com/E9icvGyK
https://pastebin.com/2cXwRAxL
https://pastebin.com/w0GGQRhc
https://pastebin.com/53sfuRZK
https://pastebin.com/90uQ7V15
https://pastebin.com/ghzaUYMF
https://pastebin.com/Nnpgvdes
https://pastebin.com/Y8tuCtaz
https://pastebin.com/iWx1huat
https://pastebin.com/FdQgitkv
https://pastebin.com/8amig0td
https://pastebin.com/yzcTvFfu
https://pastebin.com/68HwXpv5
https://pastebin.com/KLAWLeKM
https://pastebin.com/dMUbkzF2
https://pastebin.com/g6rLz6au
https://pastebin.com/trd44WK2
https://pastebin.com/cQ8audPK
https://pastebin.com/wRuQcX47
https://pastebin.com/nyzk75PP
https://pastebin.com/a52FLwqg
https://pastebin.com/ifwAEKs8
https://pastebin.com/7hsBC6eM
https://pastebin.com/pLAWFQ8U
https://pastebin.com/j70c8uBX
https://pastebin.com/ymKQsh4f
https://pastebin.com/4dqNaX6T
https://pastebin.com/HSdANUrQ
https://pastebin.com/Nh8sivuq
https://pastebin.com/q55w0w2i
https://pastebin.com/wXf37h3E
https://pastebin.com/RhAxX63P
https://pastebin.com/
https://pastebin.com/d0ftXeii
https://pastebin.com/w7cKXeMc
https://pastebin.com/vJQZ8zzg
https://pastebin.com/NV6uSXAB
https://pastebin.com/aDZckQqR
https://pastebin.com/LECR3S3x
https://pastebin.com/cp78R0ry
https://pastebin.com/WD0P7hDC
https://pastebin.com/iA0h7MsB
https://pastebin.com/509YHhv2
https://pastebin.com/sR22DfaA
https://pastebin.com/fkwWBgB1
https://pastebin.com/xu1tZaib
https://pastebin.com/0e9mbjm1
https://pastebin.com/8ygNAi7Q
https://pastebin.com/q10N4BVV
https://pastebin.com/E5a1VSUL
https://pastebin.com/N4rt7xkq
https://pastebin.com/KLKahxYp
https://pastebin.com/aAhka9TS
https://pastebin.com/cFzzqVdL
https://pastebin.com/TdF2uE9H
https://pastebin.com/sAwMjAbi
https://pastebin.com/DZNFtzZq
https://pastebin.com/tHjy4Dqz
https://pastebin.com/7nGK9sVT
https://pastebin.com/uh2XxG80
https://pastebin.com/AnR5ZVHR
https://pastebin.com/Y3RLNXTu
https://pastebin.com/H1QvABLE
https://pastebin.com/gu3H4ZCC
https://pastebin.com/6stL1Xpp
https://pastebin.com/yx5inydp
https://pastebin.com/hyiiCV2A
https://pastebin.com/rgCkSxnQ
https://pastebin.com/smR119Kz
https://pastebin.com/H6GguYti
https://pastebin.com/zMupz2e0
https://pastebin.com/hA0jPvEB
https://pastebin.com/a617mt5H
https://pastebin.com/nkjG08Fw
https://pastebin.com/k6NKap1G
https://pastebin.com/mmiNsmtC
https://pastebin.com/i6V5V5dz
https://pastebin.com/GUvCDwNE
https://pastebin.com/Cd7LEAAE
https://pastebin.com/uN4xeDXm
https://pastebin.com/WT2yyehE
https://pastebin.com/3qxa54xX
https://pastebin.com/xdnPSK9i
https://pastebin.com/EEpWrErg
https://pastebin.com/MbUH0ZVm
https://pastebin.com/UfRH2vMY
https://pastebin.com/qcmM4qiM
https://pastebin.com/0NXAxPQR
https://pastebin.com/bXmTJhyf
https://pastebin.com/716Zr85T
https://pastebin.com/X0JFDTJ0
https://pastebin.com/gSc7vpdF
https://pastebin.com/LKUU1kbW
https://pastebin.com/XfbRxeZ7
https://pastebin.com/afMDqP8e
https://pastebin.com/QxJgJX0x
https://pastebin.com/WGrQcNAF
https://pastebin.com/Kbj0zKmQ

收起阅读 »

苹果审核4.3a,要如何申诉?亲测破解

苹果审核
                                                            苹果审核4.3a,要如何申诉?亲测破解  
    做iOS马甲包、多矩阵应用、同系列迭代APP的开发者,大概率都吃过4.3(a)重复应用的大亏。很多人分不清4.3a和4.3b的区别:4.3b是模板换皮、低质垃圾应用,而4.3a是专属判定「账号关联、同源马甲、多包重复」。最让人头疼的是:4.3a一旦被标记,不会单次驳回,会锁账号、锁设备、锁指纹,后续同环境、同账号所有包全部从严审核、秒拒、延迟审核。网上90%的通用4.3教程只讲基础整改,根本解决不了4.3a账号关联、同源锁定问题。本文分享2026亲测有效、真实破解过审方案,包含4.3a专属申诉逻辑、逐点整改流程、1:1可复制双语申诉话术、避坑玄学套路,亲测成功破解多次重度4.3a锁包、锁账号问题。  

一、先搞懂:什么是4.3a?为什么比普通4.3更难搞?

  1. 官方精准定义
    Guideline 4.3(a) Duplicate Apps:重复应用/关联马甲包违规。
    苹果明确判定逻辑:同一开发者、关联开发者、关联设备/网络下,存在多款功能、逻辑、源码高度相似的独立APP,判定为批量马甲矩阵,属于恶意占用App Store资源,风控等级远高于普通模板换皮。
  2. 4.3a 与 4.3b 核心区别(破解关键)
    • 4.3b(Spam):单应用低质、模板套壳、UI抄袭、无独立价值,改UI改素材即可过审。
    • 4.3a(Duplicate):重点查账号关联、环境关联、源码同源、矩阵批量,哪怕界面完全不一样,只要指纹关联、账号关联,直接秒拒。
  3. 4.3a被拒的隐形后果(绝大多数人踩坑)
    • 账号永久标记「马甲矩阵风险」,审核权重暴跌;
    • 打包设备、IP、证书指纹入库,后续所有打包包体自动从严扫描;
    • 关联账号全部连带降权,换新账号同环境打包依旧被拒;
    • 反复提交无效包,直接触发账号封禁预警。

二、4.3a被拒核心诱因(亲测99%都是这4个问题)
不同于普通4.3,4.3a几乎不看表面UI,只查关联与同源:

  1. 源码同源:多马甲包基于同一套底层源码、工程架构、核心业务逻辑打包,仅改表层内容;
  2. 账号关联:同一账号、同主体账号、共用收款/隐私/域名信息,批量上架同系列APP;
  3. 环境指纹关联:多马甲共用同一台Mac、同一条WiFi、同一套打包脚本、证书;
  4. 元数据残留关联:隐私协议、技术支持网址、版权信息、关键词高度复用。
    核心真相:4.3a申诉失败,90%是因为只改UI不改「关联指纹」,审核机器依旧判定为同源马甲矩阵。

三、2026亲测4.3a破解完整流程(可直接照搬)
4.3a破解不能盲目申诉、不能盲目重提,必须遵循:停提审 → 断关联 → 深度整改 → 举证申诉 → 干净环境重提 五步闭环,亲测通过率最高。
第一步:紧急止损(必做,避免权重崩盘)
收到4.3a拒信后,立刻停止所有账号提审操作,不要换包盲提、不要反复改素材重传。每一次无效提交,都会加重账号关联标记,从轻度风控变成重度黑名单。
第二步:彻底切断所有关联指纹(破解核心)
针对4.3a「关联风控」特性,全方位切断同源、关联痕迹,缺一不可:

  1. 代码层:打破同源指纹(最关键)
    • 重构35%以上核心底层代码,调整工程目录、模块结构、函数调用逻辑;
    • 清理所有旧项目残留Demo、冗余代码、废弃资源文件;
    • 新增1-2个独家差异化功能,稀释同源代码占比,形成独立产品逻辑;
    • 使用深度混淆,修改二进制编译特征,破除机器AI同源检测。
  2. 产品层:切断功能关联
    • 彻底改版首页布局、Tab顺序、核心功能操作路径,和旧包、同系列包形成明显差异;
    • 重做图标、启动页、全套UI配色,杜绝版式同质化;
    • 调整功能定位,弱化和矩阵包的重合场景,打造专属使用场景。
  3. 环境层:物理隔离风控
    • 更换全新打包Mac设备、全新纯净网络热点,杜绝旧环境指纹;
    • 全新Bundle ID、全新描述文件、全新签名证书,不复用任何旧配置;
    • 清空编译缓存,重新Clean、Archive,杜绝残留编译指纹。
  4. 元数据层:清空关联信息
    • 重写标题、描述、关键词,完全区别同系列其他APP;
    • 更换独立隐私政策、独立技术支持域名,不再共用链接;
    • 全套重做截图、预览视频,展示全新差异化功能。
      第三步:准备申诉举证材料(过审加分项)
      4.3a申诉只话术没用,必须带实证,亲测有效举证包:
  5. 整改前后界面对比图(清晰展示UI、布局、功能差异);
  6. 工程目录结构截图(证明代码重构、结构变更);
  7. 独家新增功能演示截图、说明文档;
  8. 全新打包环境、全新证书配置截图。

四、4.3a专属申诉话术(中英双语、亲测通过率高)
4.3a绝对不能用普通4.3申诉模板!必须重点强调无账号关联、无马甲矩阵、已彻底重构差异化、切断同源指纹,精准命中审核判定点。
可直接复制粘贴至Resolution Center,附带上述举证图片即可提交。
【中文申诉文案】
尊敬的App审核团队:
本次应用被判定为4.3(a)重复马甲应用属于误判。我方已全面核查问题并完成深度整改,本应用不存在任何批量马甲矩阵、无关联同源应用。
本次版本已完成核心代码重构、工程结构重组,全新设计UI交互与页面布局,新增独家特色功能,彻底区别于名下及市场同类应用。同时我方更换了全新的打包设备、网络环境、签名证书及独立隐私域名,完全切断历史关联指纹,不存在重复应用、换皮马甲等违规行为。
附件为整改前后差异对比、代码结构、全新功能佐证截图,可清晰证明本应用为独立全新产品。恳请审核团队重新人工复核,感谢您的审核工作!
【English 官方审核优先读取】
Dear App Review Team,
The 4.3(a) duplicate app rejection of our app is a misjudgment. We have completed comprehensive and in-depth rectification.
This app has completely reconstructed core code and project structure, redesigned all UI layouts and interactive logic, and added exclusive differentiated functions. It is totally different from other apps under our developer account.
We also used brand-new packaging devices, network environments, certificates and independent privacy links to completely eliminate historical fingerprint correlation. There is no duplicate app, spam app or shell replacement behavior.
The attachments include comparison screenshots and function proof materials to prove the independence of this product. Please manually review our app again. Thank you very much.


五、亲测独家破解玄学(大幅提升过审率)
多次实操总结,官方不公开、但真实有效的4.3a提审小技巧:

  1. 错峰提审:整改完成后避开周一、月初、iOS新版本公测期,周二至周四晚间提交,风控扫描更宽松;
  2. 小幅微调信息:提审前微调应用副标题、展示文案细节,让机器判定为全新迭代版本;
  3. 拒绝连续提交:4.3a被拒后,间隔48小时以上整改重提,避免被系统标记为恶意对抗审核;
  4. 单账号单包养号:被4.3a标记的账号,短期内只上架这一款应用,关闭所有其他马甲提审,快速恢复账号权重。

六、高频踩坑误区(90%人破解失败的原因)

  • ❌ 只改UI、不改代码和环境:4.3a看指纹不看界面,百分百再次被拒;
  • ❌ 复用隐私域名、服务器接口:隐性关联依旧存在,风控不会解除;
  • ❌ 多次盲提、不举证只申诉:审核判定你拒不整改,直接加重风控;
  • ❌ 继续上架其他马甲包:矩阵行为持续触发4.3a连锁风控,账号彻底锁死。

七、终极根治方案(彻底告别4.3a反复被拒)
如果你的业务长期需要多版本、多品类应用,彻底根治4.3a的最优解:
放弃多马甲分包模式,改为「单App多租户/多模块」模式。
将所有同系列功能、不同品类内容整合进一个主APP内,通过内部模块切换、场景区分实现多业务需求,不再拆分多个独立安装包。从根源杜绝4.3a重复马甲判定,一劳永逸解决关联风控问题。


总结
4.3a不是普通的换皮垃圾应用拒审,是账号矩阵+指纹关联+源码同源的重度风控处罚。
想要成功破解,核心不在于话术,而在于彻底切断关联指纹、深度代码重构、打造产品差异化、干净环境重提。搭配专属双语申诉话术+实证材料,就能高效解除4.3a标记,实现顺利过审。
2026年iOS审核风控越来越严,避开无效整改、吃透4.3a专属规则,才是稳定上架、保住账号权重的唯一捷径。

继续阅读 »
                                                            苹果审核4.3a,要如何申诉?亲测破解  
    做iOS马甲包、多矩阵应用、同系列迭代APP的开发者,大概率都吃过4.3(a)重复应用的大亏。很多人分不清4.3a和4.3b的区别:4.3b是模板换皮、低质垃圾应用,而4.3a是专属判定「账号关联、同源马甲、多包重复」。最让人头疼的是:4.3a一旦被标记,不会单次驳回,会锁账号、锁设备、锁指纹,后续同环境、同账号所有包全部从严审核、秒拒、延迟审核。网上90%的通用4.3教程只讲基础整改,根本解决不了4.3a账号关联、同源锁定问题。本文分享2026亲测有效、真实破解过审方案,包含4.3a专属申诉逻辑、逐点整改流程、1:1可复制双语申诉话术、避坑玄学套路,亲测成功破解多次重度4.3a锁包、锁账号问题。  

一、先搞懂:什么是4.3a?为什么比普通4.3更难搞?

  1. 官方精准定义
    Guideline 4.3(a) Duplicate Apps:重复应用/关联马甲包违规。
    苹果明确判定逻辑:同一开发者、关联开发者、关联设备/网络下,存在多款功能、逻辑、源码高度相似的独立APP,判定为批量马甲矩阵,属于恶意占用App Store资源,风控等级远高于普通模板换皮。
  2. 4.3a 与 4.3b 核心区别(破解关键)
    • 4.3b(Spam):单应用低质、模板套壳、UI抄袭、无独立价值,改UI改素材即可过审。
    • 4.3a(Duplicate):重点查账号关联、环境关联、源码同源、矩阵批量,哪怕界面完全不一样,只要指纹关联、账号关联,直接秒拒。
  3. 4.3a被拒的隐形后果(绝大多数人踩坑)
    • 账号永久标记「马甲矩阵风险」,审核权重暴跌;
    • 打包设备、IP、证书指纹入库,后续所有打包包体自动从严扫描;
    • 关联账号全部连带降权,换新账号同环境打包依旧被拒;
    • 反复提交无效包,直接触发账号封禁预警。

二、4.3a被拒核心诱因(亲测99%都是这4个问题)
不同于普通4.3,4.3a几乎不看表面UI,只查关联与同源:

  1. 源码同源:多马甲包基于同一套底层源码、工程架构、核心业务逻辑打包,仅改表层内容;
  2. 账号关联:同一账号、同主体账号、共用收款/隐私/域名信息,批量上架同系列APP;
  3. 环境指纹关联:多马甲共用同一台Mac、同一条WiFi、同一套打包脚本、证书;
  4. 元数据残留关联:隐私协议、技术支持网址、版权信息、关键词高度复用。
    核心真相:4.3a申诉失败,90%是因为只改UI不改「关联指纹」,审核机器依旧判定为同源马甲矩阵。

三、2026亲测4.3a破解完整流程(可直接照搬)
4.3a破解不能盲目申诉、不能盲目重提,必须遵循:停提审 → 断关联 → 深度整改 → 举证申诉 → 干净环境重提 五步闭环,亲测通过率最高。
第一步:紧急止损(必做,避免权重崩盘)
收到4.3a拒信后,立刻停止所有账号提审操作,不要换包盲提、不要反复改素材重传。每一次无效提交,都会加重账号关联标记,从轻度风控变成重度黑名单。
第二步:彻底切断所有关联指纹(破解核心)
针对4.3a「关联风控」特性,全方位切断同源、关联痕迹,缺一不可:

  1. 代码层:打破同源指纹(最关键)
    • 重构35%以上核心底层代码,调整工程目录、模块结构、函数调用逻辑;
    • 清理所有旧项目残留Demo、冗余代码、废弃资源文件;
    • 新增1-2个独家差异化功能,稀释同源代码占比,形成独立产品逻辑;
    • 使用深度混淆,修改二进制编译特征,破除机器AI同源检测。
  2. 产品层:切断功能关联
    • 彻底改版首页布局、Tab顺序、核心功能操作路径,和旧包、同系列包形成明显差异;
    • 重做图标、启动页、全套UI配色,杜绝版式同质化;
    • 调整功能定位,弱化和矩阵包的重合场景,打造专属使用场景。
  3. 环境层:物理隔离风控
    • 更换全新打包Mac设备、全新纯净网络热点,杜绝旧环境指纹;
    • 全新Bundle ID、全新描述文件、全新签名证书,不复用任何旧配置;
    • 清空编译缓存,重新Clean、Archive,杜绝残留编译指纹。
  4. 元数据层:清空关联信息
    • 重写标题、描述、关键词,完全区别同系列其他APP;
    • 更换独立隐私政策、独立技术支持域名,不再共用链接;
    • 全套重做截图、预览视频,展示全新差异化功能。
      第三步:准备申诉举证材料(过审加分项)
      4.3a申诉只话术没用,必须带实证,亲测有效举证包:
  5. 整改前后界面对比图(清晰展示UI、布局、功能差异);
  6. 工程目录结构截图(证明代码重构、结构变更);
  7. 独家新增功能演示截图、说明文档;
  8. 全新打包环境、全新证书配置截图。

四、4.3a专属申诉话术(中英双语、亲测通过率高)
4.3a绝对不能用普通4.3申诉模板!必须重点强调无账号关联、无马甲矩阵、已彻底重构差异化、切断同源指纹,精准命中审核判定点。
可直接复制粘贴至Resolution Center,附带上述举证图片即可提交。
【中文申诉文案】
尊敬的App审核团队:
本次应用被判定为4.3(a)重复马甲应用属于误判。我方已全面核查问题并完成深度整改,本应用不存在任何批量马甲矩阵、无关联同源应用。
本次版本已完成核心代码重构、工程结构重组,全新设计UI交互与页面布局,新增独家特色功能,彻底区别于名下及市场同类应用。同时我方更换了全新的打包设备、网络环境、签名证书及独立隐私域名,完全切断历史关联指纹,不存在重复应用、换皮马甲等违规行为。
附件为整改前后差异对比、代码结构、全新功能佐证截图,可清晰证明本应用为独立全新产品。恳请审核团队重新人工复核,感谢您的审核工作!
【English 官方审核优先读取】
Dear App Review Team,
The 4.3(a) duplicate app rejection of our app is a misjudgment. We have completed comprehensive and in-depth rectification.
This app has completely reconstructed core code and project structure, redesigned all UI layouts and interactive logic, and added exclusive differentiated functions. It is totally different from other apps under our developer account.
We also used brand-new packaging devices, network environments, certificates and independent privacy links to completely eliminate historical fingerprint correlation. There is no duplicate app, spam app or shell replacement behavior.
The attachments include comparison screenshots and function proof materials to prove the independence of this product. Please manually review our app again. Thank you very much.


五、亲测独家破解玄学(大幅提升过审率)
多次实操总结,官方不公开、但真实有效的4.3a提审小技巧:

  1. 错峰提审:整改完成后避开周一、月初、iOS新版本公测期,周二至周四晚间提交,风控扫描更宽松;
  2. 小幅微调信息:提审前微调应用副标题、展示文案细节,让机器判定为全新迭代版本;
  3. 拒绝连续提交:4.3a被拒后,间隔48小时以上整改重提,避免被系统标记为恶意对抗审核;
  4. 单账号单包养号:被4.3a标记的账号,短期内只上架这一款应用,关闭所有其他马甲提审,快速恢复账号权重。

六、高频踩坑误区(90%人破解失败的原因)

  • ❌ 只改UI、不改代码和环境:4.3a看指纹不看界面,百分百再次被拒;
  • ❌ 复用隐私域名、服务器接口:隐性关联依旧存在,风控不会解除;
  • ❌ 多次盲提、不举证只申诉:审核判定你拒不整改,直接加重风控;
  • ❌ 继续上架其他马甲包:矩阵行为持续触发4.3a连锁风控,账号彻底锁死。

七、终极根治方案(彻底告别4.3a反复被拒)
如果你的业务长期需要多版本、多品类应用,彻底根治4.3a的最优解:
放弃多马甲分包模式,改为「单App多租户/多模块」模式。
将所有同系列功能、不同品类内容整合进一个主APP内,通过内部模块切换、场景区分实现多业务需求,不再拆分多个独立安装包。从根源杜绝4.3a重复马甲判定,一劳永逸解决关联风控问题。


总结
4.3a不是普通的换皮垃圾应用拒审,是账号矩阵+指纹关联+源码同源的重度风控处罚。
想要成功破解,核心不在于话术,而在于彻底切断关联指纹、深度代码重构、打造产品差异化、干净环境重提。搭配专属双语申诉话术+实证材料,就能高效解除4.3a标记,实现顺利过审。
2026年iOS审核风控越来越严,避开无效整改、吃透4.3a专属规则,才是稳定上架、保住账号权重的唯一捷径。

收起阅读 »

苹果 App Store 卡审核一天怎么办?别急着撤回,先看看是不是这几种情况

苹果审核

苹果 App Store 卡审核一天怎么办?别急着撤回,先看看是不是这几种情况

不少开发者在提交 App Store 审核后,发现状态一直停留在“等待审核(Waiting for Review)”或者“审核中(In Review)”超过一天,就开始担心是不是应用出了问题。

实际上,卡审一天并不一定意味着应用有问题。苹果审核时间会受到版本更新、审核队列、应用类型以及开发者账号历史等多方面因素影响。很多应用第二天甚至第三天就顺利通过了审核,因此第一天最重要的是先判断属于哪一种情况,而不是盲目撤回重新提交。

卡审一天正常吗?

对于大部分应用来说,卡审一天属于比较正常的情况。

苹果每天都会收到大量新的审核请求,审核资源会根据提交时间、应用类型、地区以及审核工作量动态调整。如果刚好遇到新系统发布、节假日或者大型活动期间,审核时间都会比平时更长。

因此,仅仅一天没有审核结果,并不能说明应用已经出现问题。

为什么会卡审核?

根据我们实际处理审核案例来看,卡审通常有以下几个原因。

1、审核队列较长

这是最常见的情况。

例如:

  • 新版 iOS 发布前后
  • 节假日前后
  • 全球开发者集中提交版本
  • 苹果审核资源紧张

这些都会导致等待时间延长。

如果只是等待审核,没有收到任何拒绝信息,通常建议继续耐心等待。

2、应用需要人工审核

部分应用会进入人工审核流程。

例如:

  • AI 工具类
  • 金融类
  • 医疗健康类
  • 社交类
  • 用户生成内容(UGC)
  • 涉及订阅或支付功能的应用

相比普通工具类应用,这类产品审核时间通常会更长。

3、版本改动较大

如果本次更新涉及:

  • 大量新增功能
  • 新增登录方式
  • 新增支付能力
  • 新增 AI 功能
  • 大幅调整业务流程

审核人员通常需要更长时间体验,因此审核时间也可能增加。

4、开发者账号历史影响

苹果会结合开发者账号的历史审核情况。

如果账号曾经出现过:

  • 多次被拒
  • 多次修改后重新提交
  • 较多相似应用
  • 曾出现较长审核记录

新的版本可能会进入更严格的审核流程。

这并不代表一定会被拒,而是审核周期可能更长。

卡审一天应该怎么办?

如果只是一天,建议按照下面的顺序处理。

第一,先不要撤回版本

很多开发者最大的误区就是:

上午提交。

晚上还没审核。

直接撤回重新提交。

实际上,重新提交以后,审核队列通常会重新计算,反而可能让等待时间变得更长。

如果没有发现明显问题,不建议因为等待一天就撤回版本。

第二,确认是否收到苹果消息

登录 App Store Connect,查看是否收到:

  • 补充审核信息
  • 请求测试账号
  • 请求演示视频
  • 其他审核问题

如果苹果已经发来消息,应尽快回复,否则审核可能一直暂停。

第三,检查服务器是否正常

如果你的 App 依赖服务器接口,可以确认:

  • 服务是否正常运行
  • 登录是否正常
  • 支付是否正常
  • AI 接口是否正常
  • 第三方接口是否稳定

审核期间如果服务器异常,也可能影响审核进度。

第四,耐心等待 24~48 小时

大多数情况下,等待一天属于正常范围。

如果超过两到三天仍没有任何变化,可以考虑联系苹果开发者支持或在 App Store Connect 中礼貌询问审核进度。

哪些操作不建议做?

卡审期间,建议避免以下操作:

  • 不要频繁撤回重新提交。
  • 不要连续上传多个新版本。
  • 不要频繁修改元数据。
  • 不要重复发送催审消息。
  • 不要在没有收到反馈前大幅修改应用。

这些操作不一定能够加快审核,反而可能让审核流程重新开始。

什么情况下需要重点关注?

如果出现以下情况,就需要进一步分析:

  • 等待审核超过 3~5 天没有变化。
  • 审核中(In Review)停留很长时间。
  • 多次提交都出现长时间卡审。
  • 同一开发者账号多个应用都出现类似情况。
  • 更新版本比首次上架审核时间明显更长。

这种情况可能需要结合应用类型、账号历史、版本改动等因素进行综合判断。

总结

卡审一天,大多数情况下属于正常现象。

开发者最应该做的是保持版本稳定,确认服务器正常运行,及时查看苹果是否发送审核消息,而不是因为等待时间稍长就反复撤回或重新提交。

如果等待时间持续较长,再结合应用类型、版本改动以及开发者账号情况进行分析,会比盲目修改更有效。保持耐心、及时响应审核要求,往往比频繁操作更有利于顺利完成审核。

查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页

继续阅读 »

苹果 App Store 卡审核一天怎么办?别急着撤回,先看看是不是这几种情况

不少开发者在提交 App Store 审核后,发现状态一直停留在“等待审核(Waiting for Review)”或者“审核中(In Review)”超过一天,就开始担心是不是应用出了问题。

实际上,卡审一天并不一定意味着应用有问题。苹果审核时间会受到版本更新、审核队列、应用类型以及开发者账号历史等多方面因素影响。很多应用第二天甚至第三天就顺利通过了审核,因此第一天最重要的是先判断属于哪一种情况,而不是盲目撤回重新提交。

卡审一天正常吗?

对于大部分应用来说,卡审一天属于比较正常的情况。

苹果每天都会收到大量新的审核请求,审核资源会根据提交时间、应用类型、地区以及审核工作量动态调整。如果刚好遇到新系统发布、节假日或者大型活动期间,审核时间都会比平时更长。

因此,仅仅一天没有审核结果,并不能说明应用已经出现问题。

为什么会卡审核?

根据我们实际处理审核案例来看,卡审通常有以下几个原因。

1、审核队列较长

这是最常见的情况。

例如:

  • 新版 iOS 发布前后
  • 节假日前后
  • 全球开发者集中提交版本
  • 苹果审核资源紧张

这些都会导致等待时间延长。

如果只是等待审核,没有收到任何拒绝信息,通常建议继续耐心等待。

2、应用需要人工审核

部分应用会进入人工审核流程。

例如:

  • AI 工具类
  • 金融类
  • 医疗健康类
  • 社交类
  • 用户生成内容(UGC)
  • 涉及订阅或支付功能的应用

相比普通工具类应用,这类产品审核时间通常会更长。

3、版本改动较大

如果本次更新涉及:

  • 大量新增功能
  • 新增登录方式
  • 新增支付能力
  • 新增 AI 功能
  • 大幅调整业务流程

审核人员通常需要更长时间体验,因此审核时间也可能增加。

4、开发者账号历史影响

苹果会结合开发者账号的历史审核情况。

如果账号曾经出现过:

  • 多次被拒
  • 多次修改后重新提交
  • 较多相似应用
  • 曾出现较长审核记录

新的版本可能会进入更严格的审核流程。

这并不代表一定会被拒,而是审核周期可能更长。

卡审一天应该怎么办?

如果只是一天,建议按照下面的顺序处理。

第一,先不要撤回版本

很多开发者最大的误区就是:

上午提交。

晚上还没审核。

直接撤回重新提交。

实际上,重新提交以后,审核队列通常会重新计算,反而可能让等待时间变得更长。

如果没有发现明显问题,不建议因为等待一天就撤回版本。

第二,确认是否收到苹果消息

登录 App Store Connect,查看是否收到:

  • 补充审核信息
  • 请求测试账号
  • 请求演示视频
  • 其他审核问题

如果苹果已经发来消息,应尽快回复,否则审核可能一直暂停。

第三,检查服务器是否正常

如果你的 App 依赖服务器接口,可以确认:

  • 服务是否正常运行
  • 登录是否正常
  • 支付是否正常
  • AI 接口是否正常
  • 第三方接口是否稳定

审核期间如果服务器异常,也可能影响审核进度。

第四,耐心等待 24~48 小时

大多数情况下,等待一天属于正常范围。

如果超过两到三天仍没有任何变化,可以考虑联系苹果开发者支持或在 App Store Connect 中礼貌询问审核进度。

哪些操作不建议做?

卡审期间,建议避免以下操作:

  • 不要频繁撤回重新提交。
  • 不要连续上传多个新版本。
  • 不要频繁修改元数据。
  • 不要重复发送催审消息。
  • 不要在没有收到反馈前大幅修改应用。

这些操作不一定能够加快审核,反而可能让审核流程重新开始。

什么情况下需要重点关注?

如果出现以下情况,就需要进一步分析:

  • 等待审核超过 3~5 天没有变化。
  • 审核中(In Review)停留很长时间。
  • 多次提交都出现长时间卡审。
  • 同一开发者账号多个应用都出现类似情况。
  • 更新版本比首次上架审核时间明显更长。

这种情况可能需要结合应用类型、账号历史、版本改动等因素进行综合判断。

总结

卡审一天,大多数情况下属于正常现象。

开发者最应该做的是保持版本稳定,确认服务器正常运行,及时查看苹果是否发送审核消息,而不是因为等待时间稍长就反复撤回或重新提交。

如果等待时间持续较长,再结合应用类型、版本改动以及开发者账号情况进行分析,会比盲目修改更有效。保持耐心、及时响应审核要求,往往比频繁操作更有利于顺利完成审核。

查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页
查看更多文章,看我主页

收起阅读 »