2023.02.16 移动端问题汇总

文章讲述了在uniapp套壳h5项目中遇到的滚动、打包、运行、导航栏自定义、状态栏高度获取、条件编译、返回事件处理以及下载问题等技术问题,并提供了详细的解决办法。例如,通过监听touchmove事件处理滚动问题,通过uniapp的条件编译处理平台兼容性,以及在返回事件中判断是否退出app等。
摘要由CSDN通过智能技术生成

这是一个uniapp套壳h5项目

1. overflow: scroll 触摸屏无法滚动,但鼠标可以。

是因为不知道哪里的代码禁掉了touchmove事件,在相应页面打开

  mounted() {
    let list = document.querySelector('.wf-form')
    list.addEventListener('touchmove', e => e.stopPropagation(), false)
  },

2. 如何使用Hbiulder 将uniapp项目打包成应用

https://juejin.cn/post/6938210257504043044?share_token=a6ed53b6-eea0-4f89-a566-e43279d9764f

3. 如何在浏览器运行uniapp项目(开发时调试用)

运行uniapp的多种方式

4. 如何自定义app顶部导航栏

(h5页面无法获取手机状态栏高度,一开始的思路是 考虑在uniapp项目中获取,再通过传参传给vue网页,再给网页项目设置一个头部高度作为自定义状态栏。但在使用url后缀的方式传参时(用的外链,非本地连接),app出现了白屏现象,于是采用了以下方法在uniapp直接写自定义状态栏。)

uniapp: webview全屏遮挡住状态栏的解决方案

// webview沉浸式自定义状态栏 在uniapp项目

		onLoad() {
			// #ifdef APP-PLUS
			let height = 0; //定义动态的高度变量
			let statusbar = 0; // 动态状态栏高度
			uni.getSystemInfo({ // 获取当前设备的具体信息
				success: (sysinfo) => {
					statusbar = sysinfo.statusBarHeight;
					height = sysinfo.windowHeight;
				}
			});
	
			let currentWebview = this.$scope.$getAppWebview() || (this.$parent && this.$parent.$scope.$getAppWebview()); //获取当前web-view
			setTimeout(function() {
				var wv = currentWebview.children()[0];
				wv.setStyle({ //设置web-view距离顶部的距离以及自己的高度,单位为px
					top: statusbar, //此处是距离顶部的高度,应该是你页面的头部
					height: height - statusbar, //webview的高度
				})
			}, 200); //如页面初始化调用需要写延迟
			// #endif
		}

5. uniapp的条件编译

// #ifdef APP-PLUS
// #endif

uniapp的条件编译,用于各种兼容的问题解决

6. 点击返回(物理键),直接退出app的问题

  • 在app里点击返回按钮(物理返回或全面屏侧滑),都默认退回一页(uni中的路由goback),由于本项目是套壳h5,退无可退。
  • 需要在返回事件中禁用默认操作,并传值告诉h5项目,让其返回一页。

在uni项目中pages/index.vue

<template>
	<view>
		<web-view :src="targetUrl" @message="handleMessage"></web-view> //@message 接收子项目传来的信息,用于判断当前页面是否为首页
	</view>
</template>
		data() {
			return {
				targetUrl: 'http://...',
				isHomePage: '2' // 记录是否为首页
			}
		},
		methods: {
			handleMessage(res) {
				const {
					isHomePage
				} = res.detail.data[0] // 接收子项目传来的信息,用于判断当前页面是否为首页
				this.isHomePage = isHomePage
			}
		},
		onBackPress(options) { // 监听返回事件
		  // 触发返回就会调用此方法,这里实现的是禁用物理返回(包括侧滑),顶部导航栏的自定义返回 uni.navigateBack 仍可使用
		  if (options.from == 'backbutton') {
		  
		  	   if(this.isHomePage === '1') { // 如果是首页或登录页,点击返回直接退出app。
		  	   
				  return false; // 默认操作:直接退出app
				  
			  } else {

				  const vw = this.$scope.$getAppWebview().children()[0]
				  vw.evalJS("sendParentData({msg: 'back'})")   // 返回时给h5页面传值
				  return true;   //禁用默认操作
				  
			  }
			  
		  } else if (options.from == 'navigateBack') {
		    return false;
		  }
		},

在h5端

  • 在view.vue首页用window.sendParentData监听了父级发出的事件,并返回一页
  created () {
    window.sendParentData = (res) => {
      this.$router.go(-1)
    };
    this.getTodoList();
    this.getUnreadList()
  },

在main.js的全局路由守卫,每当路由变更时,都判断是否为首页,并传给父级项目

import * as uni from './utils/uni.webview.1.5.2.js'  // 引入uni

document.addEventListener("UniAppJSBridgeReady", function() {
  Vue.prototype.myUni = uni
});
  // 向uni传值(用于判断点击物理键返回按钮后 当前页面返回或退出app)
  uni.webView.postMessage({
    data: {
      isHomePage: ((to && to.fullPath === '/index') || (to && to.path === '/login') || (to && to.fullPath === '/my')) ? '1' : '2'
    },
  });

7. app内下载的附件无法打开。并提示以下信息

  • 可能由于某些浏览器不兼容下载写法,于是改成了a标签直接赋值下载地址的方法(之前是下载返回数据转为blob格式再赋值给href)在这里插入图片描述
    在这里插入图片描述

  • 打不开,同时强行文本打开报code不可用。原因是有些人手机上下载了多个浏览器。点击 下载的时候,多个浏览器都会运行下载功能。这个时候,代码里只申请了一个code,重复使用就报错。于是将code验证去掉了(替换了接口)。
    检测文件上传验证码失败 code:500

8. app内下载的附件无法打开,但在文件管理中可以找到

manifest.json中,“app-plus”/“distribute”/“android”/"permissions"配置

				"permissionPhoneState": {
				  "request": "always",  
				  "prompt": "为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。"  
				}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值