uni-app plus.runtime.arguments 获取启动参数问题

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

uni-app plus.runtime.arguments 获取启动参数问题

详细问题描述

贴一下我最终的解决方案。感谢官方技术解答

app.vuemethods 插入代码:

checkArguments() {  
    console.log('Shortcut-plus.runtime.launcher: ' + plus.runtime.launcher);  
    if (plus.runtime.launcher == 'shortcut') {  
        // 通过快捷方式启动,iOS平台表示通过3D Touch快捷方式,Android平台表示通过桌面快捷方式启动  
        try {  
            var cmd = JSON.parse(plus.runtime.arguments);  
            console.log('Shortcut-plus.runtime.arguments: ' + plus.runtime.arguments);  
            var type = cmd && cmd.type;  
            console.log(JSON.stringify( cmd ))  
        } catch (e) {  
            console.log('Shortcut-exception: ' + e);  
        }  
    }  
}

然后在 app.vueonLaunch 调用

this.checkArguments(); // 检测启动参数  

// 重点是以下: 一定要监听后台恢复 !一定要   
plus.globalEvent.addEventListener('newintent', (e)=>{  
    this.checkArguments(); // 检测启动参数  
});

IOS下

使用场景: 当我通过 3d touch 启动APP时,我是在 onshow 中监听 plus.runtime.arguments 参数,但是我发现 在 onshow 中 每次打开都会获取这个参数,能否清理掉?

最好能有直接清理的api

— 目前遇到的问题是,当我在 app.vueonshow 获取 应用启动的参数:plus.runtime.arguments 这个是可行的, 那么当我APP打开以后,我APP进入到后台然后再恢复到前台仍然会走一次 onshow 的生命周期 然后获取到 plus.runtime.arguments 中的参数,那么我这参数就是重复了。相当于我还会走一次 plus.runtime.arguments 获取到的参数的逻辑 这样肯定是不行的。

table
| 开发环境 | 版本号 | 项目创建方式 |
| -------- | ------ | ------------ |
| HBuilderX |  |  |

然后我把 获取 plus.runtime.arguments 放在 onLaunch 能解决重复获取的问题 但是当APP在后台恢复到前台的时候 这个生命周期肯定是不会生效的,毕竟这时候APP还在活跃,没有重启。

所以需求就是:

能不能手动清理 plus.runtime.arguments 中的参数呢?比如我 onshow 的时候获取 我 onhide 的时候我自己去清理一下 plus.runtime.arguments 这个参数。

或者有没有其它更好的方案可以解决?

![](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20190604/f9ef2d9b9d8d6a33f77f3770e2e54494.png)

```mermaid
table
| 开发环境 | 版本号 | 项目创建方式 |
| -------- | ------ | ------------ |
| HBuilderX |  |  |


57 回复

这个问题我已经细看了5+的那个例子,这个问题在5+中是不会出现的 因为也可以监听pluready 但是uniapp是没有的,所以导致我放在 onLaunch 的时候 只有应用启动的时候可以获取到,当应用进入到后台(此时并没有销毁) 下次再从桌面的 shortcut 打开APP 就不会执行 onLaunch 了,因为( onLaunch 当uni-app 初始化完成时触发(全局只触发一次))。 所以 我就放在onShow 那么放在 onShow 的问题就是1.每次可以获取到参数,但是假设这时候 用户做APP后台进入 并没有其它操作 那么 plus.runtime.arguments 依然获取的是 上一次的参数。 然后根据上述反馈 使用 plus.runtime.arguments = null 但是我发现 设置为null 以后 下次 再从桌面的 shortcut 菜单启动 获取的参数一直是null, 你可以直接创建个例子 试试UNI-APP的就知道了。希望及时关注并且回复 不然 shortcut 在UNI-APP就没啥用了。


plus.runtime.arguments = null;和plus.runtime.arguments = ‘’一起用就清掉了啊

回复 jantho: 不是这个问题你没看到吗?清是能清掉,但是后面再拉起APP就都没值了

这个问题我解决了,在App.vue中 onShow中监听plus.runtime.arguments,但需要延时处理,不延时会出现不能正确获取plus.runtime.arguments值 onHide中清除plus.runtime.arguments值 做了这2件事,其他都不需要做

plus.runtime.arguments 在ios环境真是绝了,始终拿到的是上一次数据。清空arguments 还不能在拿到之后立即清空。

回复 1***@qq.com: 延时就能拿到最新一次的,要在onHide中清空

plus.runtime.arguments获取到的数据是上一次进来传递的是什么情况

感谢老铁,帮大忙了

回复 3***@qq.com: 我也遇到这个问题了,请问解决了吗

4年了 居然没有决绝

百分百必现的 bug,5 年了,还没有修复,这就是 UniApp 吗

混合开发就是这样的,变量太多了

可通过plus.runtime.launcher判断启动方式,值为"shortcut"在iOS平台表示通过3D Touch快捷方式: if(plus.runtime.launcher==‘shortcut’){
// 表示通过快捷方式启动
}

老哥 你没明白我的意思 建议在多看看我反馈的问题点哦

回复 SimpleJalon: 通过plus.runtime.launcher就可以分辨出是从快捷方式启动(shortcut)还是点击桌面图标启动(default)。点击桌面启动时直接忽略plus.runtime.arguments参数即可

回复 SimpleJalon: 切换到前后台不会修改launcher 和arguments 的值,你读完之后可以直接将plus.runtime.arguments置空

回复 DCloud_IOS_XTY: 对 我想知道的就是如何置空

plus.runtime.arguments = null

回复 DCloud_IOS_XTY: OK 我尝试下

回复 DCloud_IOS_XTY: 你这个办法,可以清理,但是当APP 第二次从页面的3D touch 点进去后 是不会执行的 而且值是NULL

Shortcut-plus.runtime.launcher: shortcut at App.vue:68 23:14:40.368 Shortcut-plus.runtime.arguments: null at App.vue:73 23:14:40.389 null

回复 SimpleJalon: 回复 DCloud_IOS_XTY: 第二次进入的时候 APP并没有销毁 只是 进入后台了。

回复 DCloud_IOS_XTY: 你qq 多少 或者加下我的qq 615773740 我直接qq 消息和你反馈吧。

回复 DCloud_App_Array: 那样我如何根据点的是哪个菜单 判断启动哪个页面昵?

回复 DCloud_IOS_XTY: =null不管用的,你把if(plus.runtime.launcher==‘shortcut’){这个判断放开试试,根本就没清掉,只是有这个判断在,误以为清掉了而已。

用hbuilder2.9.8打包后,从微信小程序打开app, plus.runtime.launcher 的值 从以前的 miniProgram 变成了 scheme ,麻烦检查下哈。。。这个问题不解决,不敢发布新版本了

回复 风云杭州: +1

如果切到后台在点击shortcut进去是会更新plus.runtime.arguments 的, 并触发名为newintent 的globalevent

加下qq 细聊下

是不是可以这样: 在 onLaunch 扑获 plus.runtime.arguments 并且监听 newintent 然后下次从后台恢复的时候就会触发:newintent 了?

嗯 的确可以:

plus.globalEvent.addEventListener(‘newintent’, (e)=>{ this.checkArguments(); // 检测启动参数 });

回复 SimpleJalon: 请问您的这个问题解决了吗?

我再onshow接收参数,在app隐藏时清空,但下次拿到的还是清空的数据是为什么

这个问题 麻烦了。 我也碰到了

请教app分享微信小程序,再由微信小程序 打开app ,这个时候app该怎么监控?

遇到同样问题,等下测试下试试

按照这个方法确实可以,不错的

请问你这个最后怎么解决的,我现在遇到的问题是,app 第一次安装启动,在微信里唤醒打开app, plus.runtime.arguments 是没有参数的,必须要先杀掉app,这时候在打开就能获取到参数了

launcher是miniProgram 吗?

回复 风云杭州: 不是,我launcher 打出来是‘default’

回复 风云杭州: 我安卓微信是miniProgram,IOS微信是scheme且没有值。

回复 kinnet: 现在的hbuilder版本有bug,官方已经确认,具体可以看我相关的帖子。下个hbuilder版本会修复这个bug。因为这个bug,我已经一个月没法发布新版本了

回复 风云杭州:好,希望下个版本解决问题。

回复 kinnet: hbuilder新版本还是没更新呢?!郁闷死 。。。按理这个是影响相当大的bug哈,社区里其他人没发现吗?

回复 风云杭州: 随时关注吧,等着解决办法。

请问下解决了么?newintent不触发

回复 近水楼台: 请问你解决了吗,我也是newintent不触发

问题解决没?第一次启动APP之后成功跳转,APP保持在后台,然后再进APP就不跳转了

你好解决了吗?我也遇到了

回复 百倍: +1

你们解决了吗 一年多了 还没有修复。。。

回复 f***@gmail.com: 没解决。。。。

不知道是不是因为缓存的原因,所以我在启动的参数里都加个最新的时间戳,经过测试是可以成功解决这个问题!你们也可以试试看

uni-app 中,plus.runtime.arguments 是用于获取应用启动参数的一个非常重要的接口。特别是在处理来自其他应用、系统启动参数,或者是在应用间传递数据时,这个接口显得尤为重要。下面我将展示如何通过 plus.runtime.arguments 获取启动参数,并给出相关的代码示例。

示例场景

假设我们需要从启动参数中获取一个名为 param1 的值,并在页面加载时显示出来。

前提条件

  • 确保你的项目已经正确配置并使用了 uni-app
  • 确保你的应用已经打包并运行在支持 plus API 的环境中(如 HBuilderX 模拟器、5+ App 等)。

代码示例

  1. App.vuemain.js 中监听应用启动事件
// App.vue 或 main.js
export default {
  onLaunch: function (options) {
    // 获取启动参数
    const launchArgs = plus.runtime.arguments;
    
    // 解析启动参数(假设参数是 URL 形式)
    const params = new URLSearchParams(launchArgs);
    
    // 获取名为 param1 的值
    const param1 = params.get('param1');
    
    // 将参数传递给页面(这里假设传递给首页)
    const pages = getCurrentPages();
    if (pages.length && pages[0].route === 'pages/index/index') {
      pages[0].setData({
        param1: param1
      });
    }
  }
}
  1. 在首页(pages/index/index.vue)中显示参数
<template>
  <view>
    <text>启动参数 param1: {{ param1 }}</text>
  </view>
</template>

<script>
export default {
  data() {
    return {
      param1: ''
    };
  },
  onLoad() {
    // 可以在 onLoad 中再次确认参数是否已设置
    console.log('页面加载时 param1:', this.param1);
  }
}
</script>

注意事项

  • plus.runtime.arguments 返回的启动参数是一个字符串,通常是以 URL 查询字符串的形式存在,因此需要使用 URLSearchParams 或其他解析方法进行处理。
  • App.vueonLaunch 方法中获取启动参数,是因为这是应用启动时最早可以执行的生命周期方法。
  • 如果需要在其他页面获取这些参数,可以通过全局状态管理(如 Vuex)或事件总线等方式进行传递。

通过上述代码,你可以在 uni-app 中轻松地获取并处理启动参数。

回到顶部