uni-app 支付宝云 nvue 在部分 iOS 设备上初始化失败报错

发布于 1周前 作者 gougou168 来自 Uni-App

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 页面的 onLoadcreated 生命周期中,确保初始化代码逻辑正确,并添加错误处理。

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 设备上初始化失败的问题。如果问题依旧存在,建议查看具体的错误日志,或联系支付宝小程序的技术支持获取更专业的帮助。

回到顶部