uni-app跨端开发注意事项
- H5正常但App异常的可能性
(1) css异常:
(2) 不支持的选择器非H5端不支持 * 选择器;body的元素选择器请改为page,同样,div和ul和li等改为view、span和font改为text、a改为navigator、img改为image等等。
(3) webview浏览器兼容性。vue页面在App端是被系统的webview渲染的(不是手机自带浏览器,是rom的webview),在较老的手机上,比如Android4.4、5.0或iOS8,很多css是不支持的,所以不要使用太新的css,会导致界面异常。
注意这不意味着不能使用flex,Android4.4也支持flex,只是不要使用太新的css。
可以找Android4.4手机或使用pc模拟器实际测试下,大多数国产Android模拟器都是4.4或5.0。
小程序不存在此情况。所以如果你的H5和小程序界面正常,而App界面异常,大多是因为css兼容性。解决这类问题,可以在caniuse查询,也可以使用一个较低版本的chrome浏览器在H5端测试。
Android4.4对应的webview是chrome37,如找不到老版chrome,也可以下载老版HBuilder(在HBuilderX下载页面底部有“上一代HBuilder下载”),在老HBuilder的右上角边改边看模式里是chrome37内核,可以把uni-app的H5版运行起来,将url粘贴到边改边看的浏览器中,点右键可以审查元素,排查不支持的css。
(4) 原生组件层级问题。H5没有原生组件概念问题,非H5端有原生组件并引发了原生组件层级高于前端组件的概念,要遮挡video、map等原生组件,可以使用cover-view组件。
(5) 使用了非H5端不支持的API,比如document、xmlhttp、cookie、window、location、navigator、localstorage、websql、indexdb、webgl等对象。如果你的代码没有直接使用这些,那很可能是引入的三方库使用了这些。如果是后者,去插件市场搜索替代方案。要知道非H5端的js是运行在一个独立的js core或v8下,并不是运行在浏览器里。
(6) 使用了非H5端不支持的vue语法,比如v-html指令、受小程序自定义组件限制的写法.
(7) 引用组件时,不要在引用组件的地方,也就是在组件属性上直接写 style="xx",要在组件内部写样式。
(8) 不能使用url(//alicdn.net)等路径,如果要使用,改为url(https://alicdn.net),因为在App端//是file协议。
(9)很多人在H5端联网时使用本地测试服务地址(localhost或127.0.0.1),这样的联网地址在手机端肯定是无法访问的,它会提示你使用手机可以访问的IP进行联网。
(10) 组件和页面样式相互影响。非H5端默认并没有启用 scoped,如果需要隔离组件样式可以在 style 标签增加 scoped 属性,H5端为了隔离页面间的样式默认启用了 scoped。
- H5正常但小程序异常的可能性
(1) 使用了非H5端不支持的API,比如document、window、navigator、cookie,或者引入的三方库使用了这些不支持的API,此时要更换适合跨端的三方库。
(2) 使用了非H5端不支持的vue语法,比如v-html指令,在h5和app-vue(v3编译模式)均支持,但小程序不支持。
(3) 小程序要求连接的网址都要配白名单
- 小程序正常但App异常的可能性
vue页面在App端的渲染引擎默认是系统webview,但要注意的是,它不是手机自带的浏览器,而是rom的webview。在较老的手机上,比如Android4.4、5.0或iOS8,一些新出的css语法是不支持的。但这并不是说不能使用flex,因为Android4.4也支持flex,只是不要使用太新的css。可以找Android4.4手机或使用pc模拟器实际测试下,大多数国产Android模拟器都是4.4或5.0。
小程序不存在浏览器兼容问题,它内置了几十M自己的定制webview。所以如果你的H5和小程序界面正常,而App界面异常,大多是因为css兼容性。
我们可以使用一下几种方法来解决这类CSS兼容性的问题:
(1) 放弃老款手机支持
(2) 不用使用太新的css语法,可以在caniuse查询
(3)从 uni-app 2.5.3 起,Android端支持引入腾讯x5浏览器内核,可以抹平低端Android的浏览器兼容性问题。
(1)在 uni-app 2.4.7 以前,H5端不支持微信小程序自定义组件,即wxcomponets下的组件,它可能产生兼容问题。但是,从 2.4.7 起,H5也支持微信自定义组件,不再存在这方面兼容问题。
(2)App端使用了App特有的API和功能,比如plus、Native.js、subNVue、原生插件等
(4)使用了小程序专用的功能,比如微信卡卷、小程序插件、微信小程序云开发。对于云开发,建议使用可跨端的uniCloud。
使用了App端特有的plus、Native.js、原生插件等功能。