HBuilderX

HBuilderX

极客开发工具
uni-app

uni-app

开发一次,多端覆盖
uniCloud

uniCloud

云开发平台
HTML5+

HTML5+

增强HTML5的功能体验
MUI

MUI

上万Star的前端框架

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

问题现象
在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

收起阅读 »

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

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

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

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

继续阅读 »

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

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

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

收起阅读 »

发布ipa文件到开发者中心的最简方法

上架

假如是使用mac电脑,可以使用xcode上传。也可以使用xcode的命令行工具来上传,

但是windows电脑没有xcode这些工具,也没有windows版本的xcode。不过安装xcode比较大,也比较麻烦,mac电脑假如没空间,也可以使用下面windows的方法来上传。

windows电脑发布ipa文件到苹果开发者中心的构建版本,就不能使用xcode,windows发布ipa到构建版本,可使用香蕉云编来上传。

下面,是windows电脑上传ipa的方法:
(1)打开香蕉云编,进入后台,使用上传ipa到app store的功能,点击上传新文件

(2)进入密钥或密码填写界面

这里可以使用app store密钥上传或者专用密码上传,这里建议使用app store密钥上传,更加专业和可靠,因为密钥永远不会失效。

(3)设置app store密钥
假如是第一次上传,还没有app store密钥,就需要先去app store先设置密钥,上传界面有设计密钥或专用密码的教程。

(4)上传ipa
填写完所有资料,最后一步,就是上传ipa了,上传过程大概一两分钟,就可以看到上传成功了。上传成功半小时后,留意苹果的邮件,看看有没有成功进入构建版本。

继续阅读 »

假如是使用mac电脑,可以使用xcode上传。也可以使用xcode的命令行工具来上传,

但是windows电脑没有xcode这些工具,也没有windows版本的xcode。不过安装xcode比较大,也比较麻烦,mac电脑假如没空间,也可以使用下面windows的方法来上传。

windows电脑发布ipa文件到苹果开发者中心的构建版本,就不能使用xcode,windows发布ipa到构建版本,可使用香蕉云编来上传。

下面,是windows电脑上传ipa的方法:
(1)打开香蕉云编,进入后台,使用上传ipa到app store的功能,点击上传新文件

(2)进入密钥或密码填写界面

这里可以使用app store密钥上传或者专用密码上传,这里建议使用app store密钥上传,更加专业和可靠,因为密钥永远不会失效。

(3)设置app store密钥
假如是第一次上传,还没有app store密钥,就需要先去app store先设置密钥,上传界面有设计密钥或专用密码的教程。

(4)上传ipa
填写完所有资料,最后一步,就是上传ipa了,上传过程大概一两分钟,就可以看到上传成功了。上传成功半小时后,留意苹果的邮件,看看有没有成功进入构建版本。

收起阅读 »

windows上架ios app详细经验分享

应用上架

在hbuilderx打包ios应用,ios应用最终编译和打包后,会产生一个ipa格式的压缩文件,是一个.ipa后缀的文件。这个文件在苹果商店里叫构建版本。

上架的时候,需要将这个ipa文件上传到app store的构建版本上,需要使用第三方上传工具来上传。

跨平台工具:香蕉云编

mac电脑工具:xcode或者transporter

由于这里需要兼顾windows和linux开发者,因此,这个教程主要是针对使用香蕉云编上传的教程。

(一)进入苹果开发者中心后台

在苹果开发者中心,点击登录图标登录,登录后就进入苹果开发者中心的后台,可以看到app store connect这个板块,这个板块里面有个App菜单,如下图所示:

点击App这个菜单,进入APP列表页面。

(二)新建App

进入App列表页面后,假如App还不存在,则需要新新建一个App才能正式上架。
新建的时候后,需要填写名称、主要语言、套装ID和SKU这些信息,其中套装ID一定要选对,这个跟你打包的APP的appId是对应的:

(三)填写资料

点击App列表页面的App名称,就可以填写APP资料上架了。

(四)上传构建版本

在页面下面,有一项是需要选择构建版本,也就是上传ipa文件到这里。
但在苹果开发者中心无法直接上传ipa文件,因为它需要做一些ipa文件完整性校验。需要使用第三方工具来上传。这里可以使用跨平台的香蕉云编这个工具来上传:

https://www.yunedit.com/ipasend

(五)在香蕉云编上传ipa到构建版本

登录香蕉云编,进入上传ipa到app store的功能菜单,点击上传后,出现这个界面:

在上传界面里,可以使用app store密钥或者专用密码两种方法上传,这里推荐使用app store密钥上传,因为专用密码有时候会失效,比如改了用户登录密码后,专用密码也会失效。

app store密钥的设置方法,可以参考上图红色字体的教程。

(六)等待苹果邮件

在香蕉云编上传成功后,还不一定能上传到构建版本里面去,因为你的APP还可能有问题,需要等半个小时,再查看苹果邮件,看看有没有报错信息。

(七)上架

受到苹果邮件后,假如提示上传成功,就可以在刚才选择构建版本的界面,点蓝色加号选择构建版本了。

选择完构建版本,填写完其他的资料,就可以上架啦,上架要等待苹果人工审核。

继续阅读 »

在hbuilderx打包ios应用,ios应用最终编译和打包后,会产生一个ipa格式的压缩文件,是一个.ipa后缀的文件。这个文件在苹果商店里叫构建版本。

上架的时候,需要将这个ipa文件上传到app store的构建版本上,需要使用第三方上传工具来上传。

跨平台工具:香蕉云编

mac电脑工具:xcode或者transporter

由于这里需要兼顾windows和linux开发者,因此,这个教程主要是针对使用香蕉云编上传的教程。

(一)进入苹果开发者中心后台

在苹果开发者中心,点击登录图标登录,登录后就进入苹果开发者中心的后台,可以看到app store connect这个板块,这个板块里面有个App菜单,如下图所示:

点击App这个菜单,进入APP列表页面。

(二)新建App

进入App列表页面后,假如App还不存在,则需要新新建一个App才能正式上架。
新建的时候后,需要填写名称、主要语言、套装ID和SKU这些信息,其中套装ID一定要选对,这个跟你打包的APP的appId是对应的:

(三)填写资料

点击App列表页面的App名称,就可以填写APP资料上架了。

(四)上传构建版本

在页面下面,有一项是需要选择构建版本,也就是上传ipa文件到这里。
但在苹果开发者中心无法直接上传ipa文件,因为它需要做一些ipa文件完整性校验。需要使用第三方工具来上传。这里可以使用跨平台的香蕉云编这个工具来上传:

https://www.yunedit.com/ipasend

(五)在香蕉云编上传ipa到构建版本

登录香蕉云编,进入上传ipa到app store的功能菜单,点击上传后,出现这个界面:

在上传界面里,可以使用app store密钥或者专用密码两种方法上传,这里推荐使用app store密钥上传,因为专用密码有时候会失效,比如改了用户登录密码后,专用密码也会失效。

app store密钥的设置方法,可以参考上图红色字体的教程。

(六)等待苹果邮件

在香蕉云编上传成功后,还不一定能上传到构建版本里面去,因为你的APP还可能有问题,需要等半个小时,再查看苹果邮件,看看有没有报错信息。

(七)上架

受到苹果邮件后,假如提示上传成功,就可以在刚才选择构建版本的界面,点蓝色加号选择构建版本了。

选择完构建版本,填写完其他的资料,就可以上架啦,上架要等待苹果人工审核。

收起阅读 »

hbuilderx打包报证书过期,解决方案:使用香蕉云编重新生成

iOS证书

打包的时候,报遇到The certificate is expired这个错误,字面意思其实很明了,就是证书过期了。

管理证书的组好的方法,最好是亲自去苹果开发者开发者中心生成,这样可以充分了解ios证书过期的生命周期,也可以提前创建和管理证书,这里我推荐使用香蕉云编+苹果开发者中心来生成。

主要是在苹果开发者中心,删除旧的证书和profile文件,然后重新生成。

而因为在苹果开发者中心,生成证书的时候,由于需要提供csr这种文件,生成完证书后还需要导出成p12格式的私钥证书,因此需要香蕉云编作为辅助功能来做配合。工具:

https://www.yunedit.com/createcert

直接使用这个工具来生成即可,傻瓜式的可视化工具,假如流程有不懂,可以直接看工具里生成证书界面的教程。

继续阅读 »

打包的时候,报遇到The certificate is expired这个错误,字面意思其实很明了,就是证书过期了。

管理证书的组好的方法,最好是亲自去苹果开发者开发者中心生成,这样可以充分了解ios证书过期的生命周期,也可以提前创建和管理证书,这里我推荐使用香蕉云编+苹果开发者中心来生成。

主要是在苹果开发者中心,删除旧的证书和profile文件,然后重新生成。

而因为在苹果开发者中心,生成证书的时候,由于需要提供csr这种文件,生成完证书后还需要导出成p12格式的私钥证书,因此需要香蕉云编作为辅助功能来做配合。工具:

https://www.yunedit.com/createcert

直接使用这个工具来生成即可,傻瓜式的可视化工具,假如流程有不懂,可以直接看工具里生成证书界面的教程。

收起阅读 »

寻找有企业证书的小伙伴咨询洽谈,酬劳丰厚!

App打包 iOS打包 uni_app 上架

公司有项目需要上传,绝对正规且合规,需要跟由企业证书的小伙伴咨询一下相关事宜,酬劳丰厚(不低于几个月工资)!!qq290783040 .不用留言,请直接加我。万分感谢本平台能够提供交流的空间。

公司有项目需要上传,绝对正规且合规,需要跟由企业证书的小伙伴咨询一下相关事宜,酬劳丰厚(不低于几个月工资)!!qq290783040 .不用留言,请直接加我。万分感谢本平台能够提供交流的空间。

快速创建ios自有证书和profile文件的方法

iOS证书

在hbuilderx打包的时候,想放到发布平台去扫码测试,或者上架app store connect,需要使用自建证书打包,不能再使用数据线连接的方式安装到手机。

而创建ios证书的教程,提示我们需要使用mac电脑的钥匙串访问去申请证书,然而我的电脑却是windows电脑。

后来发现没有mac电脑能创建ios证书,可以使用香蕉云编来生成p12私钥证书,profile文件在苹果开发者中心就可以生成,不需要mac电脑。

创建的过程如下:

1)申请苹果开发账号,这个步骤最麻烦最消耗时间,可以参考下面的教程申请苹果开发账号。完成这步后,后面的步骤都很简单。假如你们公司已经有账号就不需要申请账号了。

https://juejin.cn/post/7529496810265575458

2)进入苹果开发者中心,点击证书功能,创建一个证书,创建证书的第一步,选择ios distribution类型的证书。

3) 创建证书的过程中,提示需要提供一个csr文件,提示需要在mac电脑申请这个文件。如下图所示:

4)这个步骤,可以不用mac电脑来申请,可以改用香蕉云编来代替:
https://www.yunedit.com/createcert

5)接着下一步,就生成证书文件了。在苹果开发者中心下载下来,证书是.cer后缀格式的,还不是hbuilderx所需的p12格式的证书。

6)接着使用香蕉云编,生成p12证书的功能,将cer转换成p12格式,生成p12证书前,是需要先上传刚才在苹果开发者中心生成的cer证书去香蕉云编先的,如下图所示:

完成上面6个步骤,p12私钥证书文件就创建完毕了。

还有profile文件需要创建。

7)登录苹果开发者中心,找到Identifiers模块,创建一个应用。
注意,创建应用的时候,填写的应用的APPID,需要填写一个java格式的包名,一般是com.xxname.xxapp这样的格式。
这个appId,是跟hbuilderx的云打包里面的包名对应的,需要一致。

8)创建profile文件,在苹果开发者中心,找到profile模块,就可以创建profile了。
在这里需要提醒的是,创建profile的时候,假如选择app store connect类型,就是创建上架类型的profile。
假如创建的是Ad hoc类型,就是真机测试类型,可以用来给团队其他成员安装测试的。生成ad hoc类型的话,可以放到香蕉云编或者蒲公英这种测试平台来扫码安装。

创建profile的过程还需要绑定APPID(应用)和绑定Certificate(证书)的,就是绑定前几个创建的应用和证书,假如你有多个应用或多个证书,可别选错了。

假如选择的是ad hoc类型,它提示还需要绑定测试设备的udid的,你还是提前获取到你团队的所有udid,再去创建测试类型的profile文件。因为添加了新成员,profile又需要重新创建的,重下下载profile文件的。

获取udid的最简单的方法是使用ios测试设备,扫描香蕉云编获取udid的工具,根据它的提示来获取udid:
https://www.yunedit.com/udid

好了,完成上面的8个步骤,证书和profile文件应该就创建完了。

继续阅读 »

在hbuilderx打包的时候,想放到发布平台去扫码测试,或者上架app store connect,需要使用自建证书打包,不能再使用数据线连接的方式安装到手机。

而创建ios证书的教程,提示我们需要使用mac电脑的钥匙串访问去申请证书,然而我的电脑却是windows电脑。

后来发现没有mac电脑能创建ios证书,可以使用香蕉云编来生成p12私钥证书,profile文件在苹果开发者中心就可以生成,不需要mac电脑。

创建的过程如下:

1)申请苹果开发账号,这个步骤最麻烦最消耗时间,可以参考下面的教程申请苹果开发账号。完成这步后,后面的步骤都很简单。假如你们公司已经有账号就不需要申请账号了。

https://juejin.cn/post/7529496810265575458

2)进入苹果开发者中心,点击证书功能,创建一个证书,创建证书的第一步,选择ios distribution类型的证书。

3) 创建证书的过程中,提示需要提供一个csr文件,提示需要在mac电脑申请这个文件。如下图所示:

4)这个步骤,可以不用mac电脑来申请,可以改用香蕉云编来代替:
https://www.yunedit.com/createcert

5)接着下一步,就生成证书文件了。在苹果开发者中心下载下来,证书是.cer后缀格式的,还不是hbuilderx所需的p12格式的证书。

6)接着使用香蕉云编,生成p12证书的功能,将cer转换成p12格式,生成p12证书前,是需要先上传刚才在苹果开发者中心生成的cer证书去香蕉云编先的,如下图所示:

完成上面6个步骤,p12私钥证书文件就创建完毕了。

还有profile文件需要创建。

7)登录苹果开发者中心,找到Identifiers模块,创建一个应用。
注意,创建应用的时候,填写的应用的APPID,需要填写一个java格式的包名,一般是com.xxname.xxapp这样的格式。
这个appId,是跟hbuilderx的云打包里面的包名对应的,需要一致。

8)创建profile文件,在苹果开发者中心,找到profile模块,就可以创建profile了。
在这里需要提醒的是,创建profile的时候,假如选择app store connect类型,就是创建上架类型的profile。
假如创建的是Ad hoc类型,就是真机测试类型,可以用来给团队其他成员安装测试的。生成ad hoc类型的话,可以放到香蕉云编或者蒲公英这种测试平台来扫码安装。

创建profile的过程还需要绑定APPID(应用)和绑定Certificate(证书)的,就是绑定前几个创建的应用和证书,假如你有多个应用或多个证书,可别选错了。

假如选择的是ad hoc类型,它提示还需要绑定测试设备的udid的,你还是提前获取到你团队的所有udid,再去创建测试类型的profile文件。因为添加了新成员,profile又需要重新创建的,重下下载profile文件的。

获取udid的最简单的方法是使用ios测试设备,扫描香蕉云编获取udid的工具,根据它的提示来获取udid:
https://www.yunedit.com/udid

好了,完成上面的8个步骤,证书和profile文件应该就创建完了。

收起阅读 »

ios打包企业证书申请指南

iOS证书

申请企业证书,打开这个官网网页申请:

https://developer-rno.apple.com/cn/programs/enterprise/

看清楚前面的申请说明,然后拉到最后,如下图所示:

需要选择“仅在我的组织内部使用的APP”,才能继续下一步申请。假如是选择的前两个商用APP的话,它还是会建议你申请个人/公司类型的苹果账号,使用ad hoc添加udid测试的方式的。

然后申请完下一步后,就可以去生成证书了。生成证书比较通用的方法是使用香蕉云编去生成:

https://www.yunedit.com/createcert

流程如下:
(1)使用香蕉云编,使用生成ios证书功能,先生成一个csr文件,然后将这个csr文件下载下来。

(2)登录苹果开发者中心,找到证书模块(假如登录的是英文版叫certificates),创建证书。
如下图所示:

创建证书的过程中,需要选择证书的类型,选择In house类型即可。选择完类型后点下一步,需要提供一个csr文件,选择我们刚才在香蕉云编生成的csr文件。下一步,即可完成证书的创建。

(3)点击创建完的证书,进入证书的详情页,可以下载证书,下载下来后,可以看到证书是.cer格式的。但还不是uni-app云打包需要的p12格式的私钥证书。

(4)回到香蕉云编,上传刚才的cer文件,就可以使用生成p12文件功能,生成p12证书了。如下图所示:

这样p12企业证书就完成创建了。

接着,需要创建证书的profile文件。

(1)登录苹果开发者中心,点击identifiers菜单, 创建应用的APPID, 以包名命名,比如com.xxx.helloapp
如下图:

(2)创建完APPID,就可以创建profile文件了,也是在苹果开发者中心,在刚才identifiers菜单的同一级,找到profile菜单,点击进去就可以创建profile文件了。

即可创建的时候选择In house类型,即可完成创建。

继续阅读 »

申请企业证书,打开这个官网网页申请:

https://developer-rno.apple.com/cn/programs/enterprise/

看清楚前面的申请说明,然后拉到最后,如下图所示:

需要选择“仅在我的组织内部使用的APP”,才能继续下一步申请。假如是选择的前两个商用APP的话,它还是会建议你申请个人/公司类型的苹果账号,使用ad hoc添加udid测试的方式的。

然后申请完下一步后,就可以去生成证书了。生成证书比较通用的方法是使用香蕉云编去生成:

https://www.yunedit.com/createcert

流程如下:
(1)使用香蕉云编,使用生成ios证书功能,先生成一个csr文件,然后将这个csr文件下载下来。

(2)登录苹果开发者中心,找到证书模块(假如登录的是英文版叫certificates),创建证书。
如下图所示:

创建证书的过程中,需要选择证书的类型,选择In house类型即可。选择完类型后点下一步,需要提供一个csr文件,选择我们刚才在香蕉云编生成的csr文件。下一步,即可完成证书的创建。

(3)点击创建完的证书,进入证书的详情页,可以下载证书,下载下来后,可以看到证书是.cer格式的。但还不是uni-app云打包需要的p12格式的私钥证书。

(4)回到香蕉云编,上传刚才的cer文件,就可以使用生成p12文件功能,生成p12证书了。如下图所示:

这样p12企业证书就完成创建了。

接着,需要创建证书的profile文件。

(1)登录苹果开发者中心,点击identifiers菜单, 创建应用的APPID, 以包名命名,比如com.xxx.helloapp
如下图:

(2)创建完APPID,就可以创建profile文件了,也是在苹果开发者中心,在刚才identifiers菜单的同一级,找到profile菜单,点击进去就可以创建profile文件了。

即可创建的时候选择In house类型,即可完成创建。

收起阅读 »

SDK version issue,app was built with the iOS 17.5 SDK,must iOS 18 SDK or later

关于iOS应用提交App Store提示SDK版本不兼容的解决方案(ITMS-90725错误)

问题现象:
使用HBuilder开发的UniApp项目通过提交后,提示:
"This app was built with the iOS 17.5 SDK. All iOS and iPadOS apps must be built with the iOS 18 SDK or later..."

或者使用蛋壳Uploader 上传报错, 验证失败:

Validation failed (409) SDK version issue. This app was built with the iOS 17.5 SDK. All iOS and iPadOS apps must be built with the iOS 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution

根本原因:
2024年6月苹果强制要求所有新提交应用必须使用Xcode 16(含iOS 18 SDK)构建。当前开发环境使用的SDK版本已不符合最新要求。

解决方案:
请按以下步骤升级开发环境:

  1. 升级基础开发工具

    • 安装最新Xcode 16(通过App Store或开发者官网下载)
    • 确保MacOS系统版本符合Xcode 16要求(建议Ventura 13.5或更高)
  2. 更新HBuilder开发环境

    • 打开HBuilderX
    • 导航至【帮助】→【检查更新】安装最新正式版(推荐3.9.10+)
    • 重启IDE使更新生效
  3. 更新UniApp依赖链
    在项目根目录执行:

    npx @dcloudio/uvm@latest

    该命令将自动更新以下关键组件:

    • uni-app编译器至最新稳定版
    • iOS平台特定依赖
    • 原生插件兼容层
  4. 重建生产包

    • 清理项目缓存:菜单【运行】→【清理项目缓存】
    • 重新生成iOS证书文件(建议更新为2024年签发的证书)
    • 使用【发行】→【原生App-云打包】生成新二进制文件

验证要点:
完成上述步骤后,通过HBuilder控制台检查构建日志,确认包含以下信息:

Using iOS SDK version: 18.0+
Xcode version: 16.0+

补充说明:
若使用自定义原生插件,需同步更新插件代码至适配iOS 18的版本。建议在真机调试阶段使用Xcode 16连接设备进行兼容性验证,避免因API变更导致的运行时异常。

更多讨论:

https://ask.dcloud.net.cn/article/41555

继续阅读 »

关于iOS应用提交App Store提示SDK版本不兼容的解决方案(ITMS-90725错误)

问题现象:
使用HBuilder开发的UniApp项目通过提交后,提示:
"This app was built with the iOS 17.5 SDK. All iOS and iPadOS apps must be built with the iOS 18 SDK or later..."

或者使用蛋壳Uploader 上传报错, 验证失败:

Validation failed (409) SDK version issue. This app was built with the iOS 17.5 SDK. All iOS and iPadOS apps must be built with the iOS 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution

根本原因:
2024年6月苹果强制要求所有新提交应用必须使用Xcode 16(含iOS 18 SDK)构建。当前开发环境使用的SDK版本已不符合最新要求。

解决方案:
请按以下步骤升级开发环境:

  1. 升级基础开发工具

    • 安装最新Xcode 16(通过App Store或开发者官网下载)
    • 确保MacOS系统版本符合Xcode 16要求(建议Ventura 13.5或更高)
  2. 更新HBuilder开发环境

    • 打开HBuilderX
    • 导航至【帮助】→【检查更新】安装最新正式版(推荐3.9.10+)
    • 重启IDE使更新生效
  3. 更新UniApp依赖链
    在项目根目录执行:

    npx @dcloudio/uvm@latest

    该命令将自动更新以下关键组件:

    • uni-app编译器至最新稳定版
    • iOS平台特定依赖
    • 原生插件兼容层
  4. 重建生产包

    • 清理项目缓存:菜单【运行】→【清理项目缓存】
    • 重新生成iOS证书文件(建议更新为2024年签发的证书)
    • 使用【发行】→【原生App-云打包】生成新二进制文件

验证要点:
完成上述步骤后,通过HBuilder控制台检查构建日志,确认包含以下信息:

Using iOS SDK version: 18.0+
Xcode version: 16.0+

补充说明:
若使用自定义原生插件,需同步更新插件代码至适配iOS 18的版本。建议在真机调试阶段使用Xcode 16连接设备进行兼容性验证,避免因API变更导致的运行时异常。

更多讨论:

https://ask.dcloud.net.cn/article/41555

收起阅读 »

最近更新的HBuilder,卡巴基斯频繁警报并删除Hbuilder

木马

事件: 检测到恶意对象
应用程序: HBuilder X
用户: X\xzm
用户类型: 活动用户
组件: 系统监控
结果说明: 检测到
类型: 木马
名称: PDM:Trojan.Win32.Generic
威胁级别: 高
对象类型: 进程
对象路径: d:\developertools\hbuilderx
对象名称: hbuilderx.exe
原因: 数据库
数据库发布日期: 昨天,2025/3/15 20:55:00

继续阅读 »

事件: 检测到恶意对象
应用程序: HBuilder X
用户: X\xzm
用户类型: 活动用户
组件: 系统监控
结果说明: 检测到
类型: 木马
名称: PDM:Trojan.Win32.Generic
威胁级别: 高
对象类型: 进程
对象路径: d:\developertools\hbuilderx
对象名称: hbuilderx.exe
原因: 数据库
数据库发布日期: 昨天,2025/3/15 20:55:00

收起阅读 »

vue3 + uniapp 可以直接开发鸿蒙啦!

uniapp

7 月 20 号,uniapp 官网上线了 uniapp 开发鸿蒙应用的文档,标志着 Vue3 + uniapp 开发鸿蒙应用时代的开启。

鸿蒙开发的支持与限制

鸿蒙开发仅支持 Vue3,不支持 Vue2 和 plus,
支持 nvue,nvue 编译到鸿蒙后非原生渲染。

开发环境要求

DevEco-Studio 5.0.3.400 以上 (DevEco-Studio 较大,达10G*)
鸿蒙系统版本 API 12 以上,HBuilderX-alpha-4.22 以上
Windows 系统使用模拟器需开启特定功能,且家庭版需升级。

配置鸿蒙离线 SDK 及相关操作
包括下载、解压、在 DevEco-Studio 中打开、启动模拟器或连接真机、配置签名等步骤。
启动鸿蒙模拟器
分为三步,包括下载、解压、等待 Sync 结束等,还涉及开发者申请。

<​当前缺个机会,缺份工作,想靠大厂外包过渡下的兄弟姐妹们,可以一起来共事,前、后端/测试年前捞人,待遇给的还可以,感兴趣可以来>

安装完模拟器后,点击启动按钮启动模拟器

启动模拟器成功后,如果提示需要先签名,则进行配置签名

连接鸿蒙真机

注意:真机需要鸿蒙系统版本 API 12 以上

打开鸿蒙手机开发者模式,开启USB调试,通过USB线连接电脑,在此处选择你的手机名称,再启动项目即可,如果提示需要先签名,则进行配置签名

配置 HBuilderX 吊起 DevEco-Studio:在 HBuilderX 中进行相关设置,填写 DevEco-Studio 启动路径。
创建 uni-app 工程:在 BuilderX 新建空白项目,选 vue3,在 manifest.json 文件中配置鸿蒙离线 SDK 路径。

配置签名

注意:配置签名需要先启动模拟器或连接真机后才能配置

配置 HBuilderX settings.json
需在 HBuilderX 中进行特定的设置操作

打开HBuilderX,点击上方菜单 - 工具 - 设置,在出现的弹窗右侧窗体新增如下配置
注意:值填你自己的 DevEco-Studio 启动路径

json 代码解读复制代码"harmony.devTools.path" : "D:/Huawei/DevEco Studio"

使用 uts 调用鸿蒙原生 API, 第三方API
调用鸿蒙原生 API
uni-app在Android和iOS平台,支持uts插件和App原生语言插件。目前App原生语言插件已经停止维护。uts插件是主推的扩展方式。
鸿蒙系统有很多原生API,可以通过uts插件方式接入,被uni-app调用。

uts插件介绍
uts插件鸿蒙开发专题

调用第三方 API
新增于 HBuilderX 4.25,有特定的使用流程和限制。
鸿蒙的包用法和npm包差不多,在鸿蒙项目里面用ohpm安装三方库后,在 /uni_modules/uts插件名/utssdk/app-harmony/index.uts 内即可直接 import
注意:只能在满足uts插件 /uni_modules//utssdk/app-harmony/.uts 的文件下使用,无法直接在项目的pages中使用
具体使用流程:在项目的pages引入uts插件,uts插件内再引入鸿蒙第三方库调用
发布鸿蒙应用
鸿蒙官方文档提供了如何发布鸿蒙应用,详见 文档

注意事项

移植已有的 uni-app 项目源码时,如有其他 npm 依赖,请自行安装
现阶段条件编译仅 APP-HARMONY、APP 可以命中鸿蒙平台
每次HBuilderX改动源码后,DevEco-Studio 内需要点重新运行才能生效
如果模拟器白屏了,尝试重启软件 DevEco-Studio,再重启项目
如果模拟器无法连接了,尝试重启电脑
在HBuilderX里运行后,需要再去鸿蒙 DevEco Studio里运行
在HBuilderX里修改代码后,需要去鸿蒙 DevEco Studio里重新运行
如果有多个uni-app项目要编译到鸿蒙,那么鸿蒙离线sdk需要放置多份,每个uni-app的manifest中配置不同的离线sdk地址,否则会冲突,鸿蒙设备上目前没有基座概念

总结
这样我们就有了一个初始的鸿蒙项目,并且可以在鸿蒙模拟器上运行。关于更多 uniapp 开发鸿蒙的 API,大家可以直接参考 uniapp 官方文档

——转载自作者:码上解忧铺

继续阅读 »

7 月 20 号,uniapp 官网上线了 uniapp 开发鸿蒙应用的文档,标志着 Vue3 + uniapp 开发鸿蒙应用时代的开启。

鸿蒙开发的支持与限制

鸿蒙开发仅支持 Vue3,不支持 Vue2 和 plus,
支持 nvue,nvue 编译到鸿蒙后非原生渲染。

开发环境要求

DevEco-Studio 5.0.3.400 以上 (DevEco-Studio 较大,达10G*)
鸿蒙系统版本 API 12 以上,HBuilderX-alpha-4.22 以上
Windows 系统使用模拟器需开启特定功能,且家庭版需升级。

配置鸿蒙离线 SDK 及相关操作
包括下载、解压、在 DevEco-Studio 中打开、启动模拟器或连接真机、配置签名等步骤。
启动鸿蒙模拟器
分为三步,包括下载、解压、等待 Sync 结束等,还涉及开发者申请。

<​当前缺个机会,缺份工作,想靠大厂外包过渡下的兄弟姐妹们,可以一起来共事,前、后端/测试年前捞人,待遇给的还可以,感兴趣可以来>

安装完模拟器后,点击启动按钮启动模拟器

启动模拟器成功后,如果提示需要先签名,则进行配置签名

连接鸿蒙真机

注意:真机需要鸿蒙系统版本 API 12 以上

打开鸿蒙手机开发者模式,开启USB调试,通过USB线连接电脑,在此处选择你的手机名称,再启动项目即可,如果提示需要先签名,则进行配置签名

配置 HBuilderX 吊起 DevEco-Studio:在 HBuilderX 中进行相关设置,填写 DevEco-Studio 启动路径。
创建 uni-app 工程:在 BuilderX 新建空白项目,选 vue3,在 manifest.json 文件中配置鸿蒙离线 SDK 路径。

配置签名

注意:配置签名需要先启动模拟器或连接真机后才能配置

配置 HBuilderX settings.json
需在 HBuilderX 中进行特定的设置操作

打开HBuilderX,点击上方菜单 - 工具 - 设置,在出现的弹窗右侧窗体新增如下配置
注意:值填你自己的 DevEco-Studio 启动路径

json 代码解读复制代码"harmony.devTools.path" : "D:/Huawei/DevEco Studio"

使用 uts 调用鸿蒙原生 API, 第三方API
调用鸿蒙原生 API
uni-app在Android和iOS平台,支持uts插件和App原生语言插件。目前App原生语言插件已经停止维护。uts插件是主推的扩展方式。
鸿蒙系统有很多原生API,可以通过uts插件方式接入,被uni-app调用。

uts插件介绍
uts插件鸿蒙开发专题

调用第三方 API
新增于 HBuilderX 4.25,有特定的使用流程和限制。
鸿蒙的包用法和npm包差不多,在鸿蒙项目里面用ohpm安装三方库后,在 /uni_modules/uts插件名/utssdk/app-harmony/index.uts 内即可直接 import
注意:只能在满足uts插件 /uni_modules//utssdk/app-harmony/.uts 的文件下使用,无法直接在项目的pages中使用
具体使用流程:在项目的pages引入uts插件,uts插件内再引入鸿蒙第三方库调用
发布鸿蒙应用
鸿蒙官方文档提供了如何发布鸿蒙应用,详见 文档

注意事项

移植已有的 uni-app 项目源码时,如有其他 npm 依赖,请自行安装
现阶段条件编译仅 APP-HARMONY、APP 可以命中鸿蒙平台
每次HBuilderX改动源码后,DevEco-Studio 内需要点重新运行才能生效
如果模拟器白屏了,尝试重启软件 DevEco-Studio,再重启项目
如果模拟器无法连接了,尝试重启电脑
在HBuilderX里运行后,需要再去鸿蒙 DevEco Studio里运行
在HBuilderX里修改代码后,需要去鸿蒙 DevEco Studio里重新运行
如果有多个uni-app项目要编译到鸿蒙,那么鸿蒙离线sdk需要放置多份,每个uni-app的manifest中配置不同的离线sdk地址,否则会冲突,鸿蒙设备上目前没有基座概念

总结
这样我们就有了一个初始的鸿蒙项目,并且可以在鸿蒙模拟器上运行。关于更多 uniapp 开发鸿蒙的 API,大家可以直接参考 uniapp 官方文档

——转载自作者:码上解忧铺

收起阅读 »