1. 扫码获取不到url参数
需求背景:
支付宝上我们开发的某xxx小程序中会有一个推广码,这个推广码是一个带参数的url转成的二维码,另一个用户用支付宝的扫一扫打开后,会进入该小程序的指定页面
问题:
新用户通过扫码进入该指定页面时获取不到url上的参数,直接使用qs.parse(window.location.search)获取不到启动参数
解决:
1. 冷启动获取
冷启动会触发小程序的onLaunch,需要在@/app.tsx的useLaunch里面回调参数里拿到,这里是options,然后存到taroGlobalData里了
只能在app.tsx里面拿

image.png
这个options的结构大概是这样

image.png
App一定是先于页面启动,此时存入后,用到的页面直接取options.query.qrCode即可
然后手动parse一下获取到?后面的参数
可以尝试Taro.getLaunchOptionsSync()方法取获取,应该是和useLaunch获取到的一致,没试过
2. 热启动获取
热启动时,不会触发onLaunch方法,也就无法从useLaunch里获取到,需要在onShow里面获取

image.png
3. 获取本次启动参数
// 本次启动参数(热启动+冷启动+安卓某些机型最小化到后台另开支付宝扫码)
const options = Taro.getEnterOptionsSync();
该方法能获取冷启动+热启动+安卓骚操作唤起的落地页参数,目前没遇到问题,推荐直接用这个
针对某些页面,既可以通过扫码唤起,又可以通过支付宝分享唤起,又可以通过正常途径进入,所以封装了一个hook,useRouter,全部获取到
import qs from 'qs';
import Taro from '@tarojs/taro';
import { useState } from 'react';
// import { isEmpty } from '@/utils/common';
const useRouter = () => {
const [routerParams] = useState<Record<string, any>>(() => {
let params = {};
try {
// // 本次启动参数(热启动+冷启动+安卓某些机型最小化到后台另开支付宝扫码)
const options = Taro.getEnterOptionsSync();
const url = options?.query?.qrCode || '';
const qrCodeUrlparams = qs.parse(url.split('?')[1]);
// 当前页面url参数
const urlParams = qs.parse(window.location.search, { ignoreQueryPrefix: true });
console.log(qrCodeUrlparams, 'qrCodeUrlparams');
console.log(urlParams, 'urlParams');
// 把二维码扫码的url参数和当前url参数合并
params = {
...qrCodeUrlparams,
// 优先用页面url参数覆盖同名qrCode参数
...urlParams,
};
} catch (error) {
params = {};
}
return params || {};
});
return { params: routerParams };
};
export default useRouter;
2. 扫一扫拉起的是线上小程序
能配置扫一扫功能,必定是先发第一版正式的小程序,再去支付宝小程序后台配置,二维码url,但是配置完成后,扫一扫唤起的却是线上正式版的小程序
在测试,联调阶段,我们需要唤起的是体验版或者开发版小程序
解决:
先打开一版开发版的小程序,(用支付宝开发者工具的预览码即可),小程序右上角有一个定位图标,点开

image.png
点开后底下有一个联调设置

image.png
把这个给勾上

image.png
后续扫码打开的就是这个开发版的小程序了,如果后续代码改动了,可能要重新进入一次,重新勾选这个联调扫码版本的checkbox