欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。
这个问题是 uni-app x 在 iOS 平台上处理 Promise reject 时的一个已知行为差异。
在 uts 插件中使用 reject(new UniError("dh-storekit", 9020009, "恢复购买失败")) 返回错误对象,但在 vue 页面中通过 catch 捕获时,iOS 平台会将 UniError 对象转换为字符串,并且中文字符会被编码为 Unicode 转义序列(如 \u6062\u590d\u8d2d\u4e70\u5931\u8d25)。
根据知识库中 ISSUE 系统的信息,Promise.reject 在 uni-app x 中存在类型推导和跨平台行为差异的问题。参考 Promise.reject 引发的类型推导编译报错 这个已确认的问题,临时解决方案是指定 Promise 的泛型类型。
针对你遇到的情况,建议采用以下方式处理:
方案一:在 catch 中处理 Unicode 编码
在 vue 页面中接收到字符串类型的错误后,手动解码 Unicode:
restorePurchases().then(res => {
// 处理成功
}).catch((err) => {
let errMsg = '';
if (typeof err === 'string') {
// 解码 Unicode 转义序列
errMsg = unescape(err.replace(/\\u/g, '%u'));
} else if (err instanceof UniError) {
errMsg = err.errMsg;
}
console.log('错误信息:', errMsg);
});
本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码
方案二:修改 reject 方式,传递字符串
在 uts 插件中直接 reject 字符串,避免跨平台对象序列化问题:
reject(JSON.stringify({
errSubject: "dh-storekit",
errCode: 9020009,
errMsg: "恢复购买失败"
}));
本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码
然后在 vue 页面中解析:
.catch((err) => {
let errorObj;
if (typeof err === 'string') {
try {
errorObj = JSON.parse(err);
} catch(e) {
errorObj = { errMsg: err };
}
}
console.log(errorObj.errMsg); // 正常显示中文
});
本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码
方案三:使用泛型明确 Promise 类型
参考 ISSUE 系统中的建议,在 uvt 文件中明确指定 Promise 的泛型类型:
export function restorePurchases(): Promise<TransactionsResult> {
return new Promise<TransactionsResult>((resolve, reject) => {
native().restorePurchases((json: string) => {
const res: TransactionsResult = { transactions: txListFromJson(json) }
resolve(res)
}, (msg: string) => {
reject(new UniError("dh-storekit", 9020009, "恢复购买失败"))
})
})
}
本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码
这个问题在 iOS 平台上表现尤为明显,主要是由于不同平台对 UniError 对象序列化处理方式的差异导致的。建议在跨平台开发时,对错误处理进行统一的兼容性处理。
2 个回复
Ask小助手
这个问题是 uni-app x 在 iOS 平台上处理 Promise reject 时的一个已知行为差异。
在 uts 插件中使用
reject(new UniError("dh-storekit", 9020009, "恢复购买失败"))返回错误对象,但在 vue 页面中通过catch捕获时,iOS 平台会将 UniError 对象转换为字符串,并且中文字符会被编码为 Unicode 转义序列(如\u6062\u590d\u8d2d\u4e70\u5931\u8d25)。根据知识库中 ISSUE 系统的信息,Promise.reject 在 uni-app x 中存在类型推导和跨平台行为差异的问题。参考 Promise.reject 引发的类型推导编译报错 这个已确认的问题,临时解决方案是指定 Promise 的泛型类型。
针对你遇到的情况,建议采用以下方式处理:
方案一:在 catch 中处理 Unicode 编码
在 vue 页面中接收到字符串类型的错误后,手动解码 Unicode:
方案二:修改 reject 方式,传递字符串
在 uts 插件中直接 reject 字符串,避免跨平台对象序列化问题:
然后在 vue 页面中解析:
方案三:使用泛型明确 Promise 类型
参考 ISSUE 系统中的建议,在 uvt 文件中明确指定 Promise 的泛型类型:
这个问题在 iOS 平台上表现尤为明显,主要是由于不同平台对 UniError 对象序列化处理方式的差异导致的。建议在跨平台开发时,对错误处理进行统一的兼容性处理。
梅竹生辉 (作者) - 随缘而来乘风而去
主要是有两个问题
1:catch里面err类型错误,应该是object类型,变成了string类型
2:返回的汉字编码错误,变成了Unicode字符
要回复问题请先登录或注册
公告
更多>相关问题