uni-app 支付宝云 nvue 在部分 iOS 设备上初始化失败报错
uni-app 支付宝云 nvue 在部分 iOS 设备上初始化失败报错
操作步骤
部分iOS 设备
预期结果
正常
实际结果
不能正常工作
bug描述
自从 阿里云 切换到 支付宝云,就不断报错,有用户反馈打开就白屏,严重影响我们软件的 用户体验。
线上用户端报错:
[WX_KEY_EXCEPTION_WXBRIDGE] [undefined:2:1054] TypeError: undefined is not an object (evaluating 'e.apply') js stack: @
对应到编译后的代码
function Km(e) {
return function() {
try {
return e.apply(e, arguments)
} catch (t) {
console.error(t)
}
}
}
调用它的函数
function dc(e) {
let t = {};
for (let i in e) {
let a = e[i];
rc(a) && (t[i] = Km(a))
}
return t
}
调用了上面 dc
的两个函数
fr.init = function(e) {
e.env = e.spaceId;
let t = yD.call(this, e);
t.config.provider = "tencent", t.config.spaceId = e.spaceId;
let i = t.auth;
return t.auth = function(a) {
let n = i.call(this, a);
return ["linkAndRetrieveDataWithTicket", "signInAnonymously", "signOut", "getAccessToken",
"getLoginState", "signInWithTicket", "getUserInfo"
].forEach(s => {
var u;
n[s] = (u = n[s], function(o) {
o = o || {};
let {
success: l,
fail: c,
complete: h
} = dc(o);
if (!(l || c || h)) return u.call(this, o);
u.call(this, o).then(d => {
l && l(d), h && h(d)
}, d => {
c && c(d), h && h(d)
})
}).bind(n)
}), n
}, t.customAuth = t.auth, t
};
var s_ = {
tcb: Pl,
tencent: Pl,
aliyun: nD,
private: Hl,
dcloud: Hl,
alipay: AD
},
qe = new class {
init(e) {
let t = {},
i = s_[e.provider];
if (!i) throw new Error("未提供正确的provider参数");
return t = i.init(e), a_(t), RD(t),
function(a) {
let n = a.uploadFile;
a.uploadFile = function(s) {
return n.call(this, s)
}
}(t),
function(a) {
a.database = function(n) {
if (n && Object.keys(n).length > 0) return a.init(n).database();
if (this._database) return this._database;
let s = Yl(ha, {
uniClient: a
});
return this._database = s, s
}, a.databaseForJQL = function(n) {
if (n && Object.keys(n).length > 0) return a.init(n).databaseForJQL();
if (this._databaseForJQL) return this._databaseForJQL;
let s = Yl(ha, {
uniClient: a,
isJQL: !0
});
return this._databaseForJQL = s, s
}
}(t),
function(a) {
a.getCurrentUserInfo = GD, a.chooseAndUploadFile = XD.initChooseAndUploadFile(a), Object
.assign(a, {
get mixinDatacom() {
return Oc(a)
}
}), a.SSEChannel = hr, a.initSecureNetworkByWeixin = i_(a), a.setCustomClientInfo =
n_, a.importObject = QD(a)
}(t), ["callFunction", "uploadFile", "deleteFile", "getTempFileURL", "downloadFile",
"chooseAndUploadFile"
].forEach(a => {
if (!t[a]) return;
let n = t[a];
t[a] = function() {
return n.apply(t, Array.from(arguments))
}, t[a] = function(s, u) {
return function(o) {
let l = !1;
u === "callFunction" && (l = (o && o.type || ta.DEFAULT) !== ta
.DEFAULT);
let c = u === "callFunction" && !l,
h = this._initPromiseHub.exec();
o = o || {};
let {
success: d,
fail: p,
complete: g
} = dc(o), D = h.then(() => l ? Promise.resolve() : Ae(Be(u,
"invoke"), o)).then(() => s.call(this, o)).then(m => l ?
Promise.resolve(m) : Ae(Be(u, "success"), m).then(() => Ae(
Be(u, "complete"), m)).then(() => (c && Ue(me
.RESPONSE, {
type: wt.CLOUD_FUNCTION,
content: m
}), Promise.resolve(m))), m => l ? Promise.reject(m) : Ae(
Be(u, "fail"), m).then(() => Ae(Be(u, "complete"), m))
.then(() => (Ue(me.RESPONSE, {
type: wt.CLOUD_FUNCTION,
content: m
}), Promise.reject(m))));
if (!(d || p || g)) return D;
D.then(m => {
d && d(m), g && g(m), c && Ue(me.RESPONSE, {
type: wt.CLOUD_FUNCTION,
content: m
})
}, m => {
p && p(m), g && g(m), c && Ue(me.RESPONSE, {
type: wt.CLOUD_FUNCTION,
content: m
})
})
}
}(t[a], a).bind(t)
}), t.init = this.init, t
}
};
开发环境信息
项目 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Mac |
PC开发环境操作系统版本号 | 13.5 (22G74) |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.44 |
手机系统 | iOS |
手机系统版本号 | iOS 16 |
手机厂商 | 苹果 |
手机机型 | iPhone 12 |
页面类型 | nvue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
3 回复
nvue 不维护,也不要搞出错误,老项目怎么办
已解决,定义全局共享变量
针对您提到的 uni-app
支付宝云 nvue
在部分 iOS 设备上初始化失败报错的问题,这通常可能与设备兼容性、环境配置或代码实现有关。以下是一些可能帮助排查和解决问题的代码案例及检查点,请根据您的具体情况进行调整和测试。
1. 检查环境配置
确保 manifest.json
中支付宝小程序的配置正确无误,特别是 app-plus
下的相关配置。
{
"mp-alipay": {
"appid": "your-app-id",
"setting": {
"es6": true,
"enhance": true,
"postcss": true,
"compileType": "nvue"
}
}
}
2. 初始化代码检查
在 nvue
页面的 onLoad
或 created
生命周期中,确保初始化代码逻辑正确,并添加错误处理。
export default {
onLoad() {
try {
// 初始化代码,例如请求数据、设置UI等
this.initApp();
} catch (error) {
console.error('Initialization failed:', error);
// 可添加用户友好的错误提示或回退逻辑
uni.showToast({
title: '初始化失败,请重试',
icon: 'none'
});
}
},
methods: {
initApp() {
// 具体的初始化逻辑
console.log('App initialized successfully');
}
}
}
3. 条件编译与平台判断
使用条件编译来处理不同平台的特定代码逻辑,确保 iOS 设备的特定处理。
#ifdef MP-ALIPAY
if (uni.getSystemInfoSync().platform === 'ios') {
// 针对iOS设备的特定初始化代码
console.log('Running on iOS');
// 例如,检查特定iOS版本的兼容性
const iosVersion = uni.getSystemInfoSync().version.split('.').map(Number);
if (iosVersion[0] < 13) {
// 针对iOS 13以下版本的特殊处理
console.warn('iOS version is below 13, special handling needed');
}
}
#endif
4. 错误日志上报
为了更好地定位问题,可以在捕获到错误时上报错误日志到服务器。
function reportError(error) {
uni.request({
url: 'https://your-server.com/report-error',
method: 'POST',
data: {
error: JSON.stringify(error),
deviceInfo: JSON.stringify(uni.getSystemInfoSync())
},
success: (res) => {
console.log('Error reported successfully:', res.data);
},
fail: (err) => {
console.error('Failed to report error:', err);
}
});
}
在 catch
块中调用 reportError(error)
来上报错误。
通过上述步骤,您可以更系统地排查和解决 uni-app
支付宝云 nvue
在部分 iOS 设备上初始化失败的问题。如果问题依旧存在,建议查看具体的错误日志,或联系支付宝小程序的技术支持获取更专业的帮助。