uni-app plus.runtime.arguments 获取启动参数问题
uni-app plus.runtime.arguments 获取启动参数问题
详细问题描述
贴一下我最终的解决方案。感谢官方技术解答
在 app.vue
中 methods
插入代码:
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.vue
中 onLaunch
调用
this.checkArguments(); // 检测启动参数
// 重点是以下: 一定要监听后台恢复 !一定要
plus.globalEvent.addEventListener('newintent', (e)=>{
this.checkArguments(); // 检测启动参数
});
IOS下
使用场景: 当我通过 3d touch 启动APP时,我是在 onshow
中监听 plus.runtime.arguments
参数,但是我发现 在 onshow
中 每次打开都会获取这个参数,能否清理掉?
最好能有直接清理的api
— 目前遇到的问题是,当我在 app.vue
中 onshow
获取 应用启动的参数: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 | | |
这个问题我已经细看了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 我尝试下
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 细聊下
嗯 的确可以:
plus.globalEvent.addEventListener(‘newintent’, (e)=>{ this.checkArguments(); // 检测启动参数 });
回复 SimpleJalon: 请问您的这个问题解决了吗?
回复 FE_liyangyang: https://ext.dcloud.net.cn/plugin?id=2048
我再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 等)。
代码示例
- 在
App.vue
或main.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
});
}
}
}
- 在首页(
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.vue
的onLaunch
方法中获取启动参数,是因为这是应用启动时最早可以执行的生命周期方法。 - 如果需要在其他页面获取这些参数,可以通过全局状态管理(如 Vuex)或事件总线等方式进行传递。
通过上述代码,你可以在 uni-app
中轻松地获取并处理启动参数。