uni-app plus.runtime.arguments云打包之后获取参数异常

uni-app plus.runtime.arguments云打包之后获取参数异常

开发环境 版本号 项目创建方式
Mac 11.6 (20G165) HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Mac

PC开发环境操作系统版本号:11.6 (20G165)

HBuilderX类型:正式

HBuilderX版本号:3.2.9

手机系统:Android

手机系统版本号:Android 11

手机厂商:小米

手机机型:红米k20pro

页面类型:vue

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

```javascript
// #ifdef APP-PLUS
console.log(plus.runtime.launcher,"====启动来源")
console.log(plus.runtime.arguments,"参数接收")
try {
    const value = uni.getStorageSync('userinfo');
    if (value) {
        uni.showModal({
            title:'Shortcut-plus.runtime.arguments:1 ' + plus.runtime.arguments
        })
        if (plus.runtime.arguments&&uni.getSystemInfoSync().platform == 'android') {
            this.checkArguments();
        }
    }
    plus.globalEvent.addEventListener('newintent', (e)=>{
        uni.showModal({
            title:'后台运行' + plus.runtime.arguments
        })
        if (plus.runtime.arguments&&uni.getSystemInfoSync().platform == 'android') {
            this.checkArguments();
        }
    });
} else { 
}
} catch (e) { 
    // error 
}
// #endif

操作步骤:

APP先打开运行,然后再使用企业微信的jsdk调用起APP,APP使用plus.runtime.arguments获取不到参数

预期结果:

打包之后,APP后台运行时,被企业微信jsdk调起可以获取到参数

实际结果:

App先打开之后,被企业微信jsdk唤起,plus.runtime.arguments获取到的参数为"",App未打开的状态下被唤起,可以获取到参数

bug描述:

在自定义基座运行时被企业微信的jsdk调用,plus.runtime.arguments这个API在 应用没启动、应用在后台的时候都能获取到参数,但是打包之后应用运行在后台获取不到参数,直接就获取到""


更多关于uni-app plus.runtime.arguments云打包之后获取参数异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

16 回复

救救孩纸啊,为什么自定义基座正常,云打包之后的就异常了

更多关于uni-app plus.runtime.arguments云打包之后获取参数异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html


自定义基座也是云打包生成的才对。可以使用原生跳转测试一下plus.runtime.arguments

原生不会呀,尴尬了,我使用plus.runtime.arguments 需要在manifest.json配置东西吗?

回复 c***@163.com: 不需要 plus.runtime.arguments 它主要存储原生启动传递的参数

你可以提供具体的测试环境给我们 我们复现一下

回复 DCloud_Android_ST: 环境没办法提供,但是我可以提供操作视频给到你们这边方便的话加QQ聊吗

回复 DCloud_Android_ST: 使用了let intent = plus.android.importClass(“android.content.Intent”); intent = plus.android.runtimeMainActivity().getIntent(); let cmd = intent.getStringExtra(“launchParam”); 原生类来接收 依旧是自定义基座正常 打包之后异常

搞了一晚上,还是打包之后就异常,非常无奈

你现在的问题是应用未启动 ,启动后可以获取到arguments 如果已经启动了在执行则获取不到。换个手机试下呢

回复 DCloud_Android_ST: 换了一台华为也是一样的效果,在未启动的时候就能接收到参数并且跳到指定页面,运行中就不行了

回复 c***@163.com: 你打一个自定义基座 把日志都打印出来 我这边测试看看 appid记得提供一下

回复 DCloud_Android_ST: 自定义基座没有异常,自定义基座的日志指的是console么,打包之后的能打出日志么?UNID745DF4 这个是APP的id

回复 DCloud_Android_ST: 问了相关的安卓大哥,他们说是onNewIntent里面没处理参数,但是自定义基座表现又是正常的

回复 DCloud_Android_ST: 能复现这个问题吗

回复 c***@163.com: 没复现 写demo云打包然后通过原生intent跳转测试 不管是首次启动还是二次启动都可以 你可以试下 https://bdpkg-tencent.dcloud.net.cn/20211014/21299450-2ccd-11ec-88a2-6173f7fbc455/Pandora.apk 原生代码Intent intent = new Intent(); intent.setClassName(“uni.UNI4F35899”, “io.dcloud.PandoraEntry”); intent.putExtra(“test”, “aaabbb”); startActivity(intent);

根据你的描述,这是一个典型的Android应用后台运行时Intent参数传递问题。在uni-app中,plus.runtime.arguments 获取的是启动应用的Intent中的extra数据。

问题分析:

  1. 应用未启动时:通过企业微信JS-SDK调起应用,系统会创建新的任务栈并传递Intent参数,此时plus.runtime.arguments能正常获取参数。
  2. 应用已在后台运行:Android系统默认的launchMode可能导致Intent被重用或忽略。当应用已在后台时,通过JS-SDK调起可能会触发onNewIntent()而非创建新实例,但云端打包后可能未正确处理此场景。

解决方案:

  1. 修改Android原生配置(关键步骤): 在manifest.json中配置Android的launchMode:

    {
        "app-plus": {
            "android": {
                "launchMode": "singleTask"
            }
        }
    }
    

    singleTask模式确保应用只有一个实例,并通过onNewIntent()接收新的Intent参数。

  2. 完善事件监听: 确保在应用启动时和newintent事件中都监听参数:

    // App.vue 的 onLaunch 中
    onLaunch: function() {
        // #ifdef APP-PLUS
        this.handleArguments(plus.runtime.arguments);
        
        // 监听新的Intent事件
        plus.globalEvent.addEventListener('newintent', (e) => {
            this.handleArguments(plus.runtime.arguments);
        });
        // #endif
    },
    
    methods: {
        handleArguments(args) {
            if (args) {
                console.log('收到参数:', args);
                // 处理参数逻辑
                this.checkArguments(args);
            }
        }
    }
    
  3. 检查企业微信配置: 确保企业微信JS-SDK调起时正确传递了参数:

    wx.invoke('launchApplication', {
        appid: '你的应用包名',
        parameter: 'your_params_here'  // 确保参数正确传递
    });
回到顶部