首页 > 原创文章 > 软件开发 > 查看文章

APP和小程序同步开发兼容性有哪些点需要注意

所属分类:软件开发 来源: 丁老师原创 更新时间:2026-09-15 08:19 浏览: 1382 IP属地: 深圳
安卓APP IOS应用 鸿蒙APP定制开发

现在用Uniapp做APP/小程序,是很快速、很成熟的方案了,除非是要求特别挑剔的项目,否则一般不会用Android/iOS原生开发。除了Uniapp,还有Taro、Rax、Flutter等工具,都是可以实现一套代码,多终端应用的生成。但是针对一套代码,能同时生成APP、小程序不假,可生成的产品,也不是说就能直接使用的。APP和小程序虽然都是运行在移动端,但他们的底层环境、前端显示、页面生命周期等架构参数并不相同,需要针对终端的不同做代码适配。也就是说,一套代码开发的APP和小程序,不能直接使用,还需要做兼容性适配。

今天丁老师就同步开发APP/小程序的兼容性适配做一下介绍,本文重点在于介绍APP和小程序同步开发前端部分的兼容性和解决方案。

一、页面顶部兼容处理
在微信小程序中,顶部有两部分和APP不同,一个是页面顶部的高度,一个是页面顶部的宽度。

页面顶部的高度:
APP和微信小程序关于页面顶部的高度(包含手机状态栏、电池电量等),都可以使用uni.getSystemInfoSync().statusBarHeight来获取。但是微信小程序包含右侧的胶囊按钮,无法去掉,并且该胶囊的尺寸根据不同手机屏幕大小而不同,高度位置都不固定,只能动态计算高度,如图:

379963949 拷贝副本.jpg

微信小程序页面顶部高度计算代码:

const menu = uni.getMenuButtonBoundingClientRect();
//标题栏(胶囊所在区域,不含状态栏)
const titleHeight = menu.height + (menu.top - statusBarHeight)*2;
//顶部总高度=状态栏 + 标题栏(你的navbar组件整体高度)
const customBar = statusBarHeight + titleHeight;

而APP则没有胶囊,可以将页面的导航栏高度固定为44px。
APP页面顶部高度的计算代码:

uni.getSystemInfoSync().statusBarHeight+44

兼容APP和小程序的页面顶部高度计算代码:

onLoad() {
	const systemInfo = uni.getSystemInfoSync();
	const statusBarHeight = systemInfo.statusBarHeight;
	let customBar = 0;
	
	//微信
	#ifdef MP-WEIXIN
		try{
			const menu = uni.getMenuButtonBoundingClientRect();
			const titleHeight = menu.height + (menu.top - statusBarHeight) * 2;
			customBar = statusBarHeight + titleHeight;
		}
		catch(e){
			customBar = statusBarHeight + 44;
		}
	// #endif
	
	//APP
	// #ifdef APP-PLUS
		customBar = statusBarHeight + 44;
	// #endif
	
	console.log('状态栏',statusBarHeight,'navbar总高度',customBar);

	this.statusBarHeight = statusBarHeight;
	this.customBar = customBar;
}

二、CSS兼容
关闭橡皮筋弹性回弹bounce
微信小程序的页面回弹靠是需要设置disableScroll:true,即关闭页面滚动,然后设置scroll-view的bounces="false"
APP的页面回弹在则是要在pages.json中设置,可针对全局,或单独页面设置app-plus: {bounce:"none"}。备注:安卓APP默认无bounce回弹。

背景图片
APP的css中,关于background-image,可以随意使用本地图片。而微信小程序则无法使用大于50kb的本地图片作为背景图,对于尺寸较大的图片只能使用远程图片。

rpx和px的像素兼容
微信小程序使用rpx作为像素单位,APP使用px作为像素单位,但在实际开发中,可以统一设置为以px为单位,只不过在生成应用后,部分小程序和APP的像素显示大小不会完全一致,需要进行兼容性区分处理。

注:APP和小程序CSS兼容性区分处理代码:

/* #ifdef APP-PLUS */
这里写APP的CSS代码
/* #endif */

/* #ifndef APP-PLUS-NVUE */
这里写APP NVUE页面的CSS代码
/* #endif */

/* #ifdef MP-WEIXIN */
这里写微信小程序的CSS代码
/* #endif */

注:以上区分代码,不用每个样式重复写,99%的样式可以不区分,写成公用样式,然后可以针对某个样式,单独区分APP和小程序重写。

三、API兼容处理
uni.getMenuButtonBoundingClientRect()
这个方法是获取菜单按钮(就是小程序右上角胶囊按钮)的布局位置信息。微信小程序有这个方法,APP则没有。

uni.getPrivacySetting
微信小程序的方法,显示隐私协议,小程序上架时必须使用。APP则没有这个方法。

uni.getStorage
微信小程序最多存储10mb,APP无限制。

plus.nativeUI
APP的本地API方法,小程序没有这种方法。

分享
微信小程序使用onShareAppMessage实现页面分享,APP则使用uni.share方法实现分享功能。

@tap.stop
微信小程序支持@tap.stop方法,APP则不支持。

四、其他兼容处理
微信支付
微信小程序使用uni.requestPayment,而APP的微信支付则需要使用APP端微信SDK,并且支付签名、预下单参数、openid获取逻辑完全不同。

页面层级
比如video组件,APP的video组件层级最高,上边无法放覆盖物,复杂的业务需要使用NVUE才可以实现。而微信小程序的video组件上则可以放其他覆盖物。

Picker
主要是指地区三级联动选择,微信小程序可以使用region自动显示地区三级且联动,而APP则需要自己加载地区数据,自己写联动方法(需后端配合)。

五、全文总结
上述内容就是丁老师,根据实际开发经验而总结的、一些需要区分APP和小程序兼容的地方。当然这篇文章肯定还有很多地方没有提及,写的也不是很到位,只不过目前丁老师能想到的就是这些,基本上涉及到多端应用的兼容性开发都涉及。

写这篇的文章的目的就是作为备用,现在同步开发APP和小程序的人越来越多了,并且随着鸿蒙系统的普及,鸿蒙的兼容性也要单独处理(关于鸿蒙的兼容性以后另开一篇文章介绍)。如果你有幸看到这篇文章,同时也在开发APP或小程序,涉及兼容性处理,欢迎联系丁老师交流和探讨,丁老师如果有写的不对的地方,也欢迎联系丁老师进行批评和指正。

六、相关服务

相关文章

最新微信小程序定制开发报价明细(附避坑指南)

一、开发前期基础费用(一)认证费用微信官方收取小程序认证费用,企业主体为300元/年。若已有认证过的公众号,可免费复用资质进行小程序认证。个人主体认证费用为30元/年,但个人开发者在小程序功能和应用场景上存在较多限制,如无法开通微信支付...

Mui的toast修改位置居中

mui的toast默认是在底部的,并且没有参数设置位置,经过研究发现可以通过修改css的方式设置位置,具体方法如下:1.mui toast设置type为divmui.toast('hello', { type: '...

Uniapp picker 多列数据更新后不...

在uniapp中,使用picker multiSelector多列联动选择时,单独更新某列数据后,在前端没有显示,之前的写法:this.data_list[1]=[]; var aaa=[]; aaa.push(1); aaa.push...

小程序想升级,是二次开发好还是重做划算?

有同学咨询丁老师,他们公司之前开发的微信小程序,已经运行了四年多,不管是从UI界面上来说,还是功能使用上,都不太理想,想对小程序进行升级改造,那么是对小程序进行二次开发好呢,还是重新做好呢?今天丁老师针对这个问题,从小程序升级所涉及的开...

推荐文章

IDEA IDE换行自动显示的}括号如何去掉

在使用idea旗下的产品,如intellij idea,php storm,web storm时,有的时候编辑前端页面JS,在换行时经常会自动出现个}大括号,这一点程序不是很智能,其实后边都已经有括号了。比如下图这样:那么如何解决这个问题呢...

宝塔面板phpmyadmin数据库表导航树禁...

宝塔面板的phpmyadmin,默认数据库表导航树是每30个一页,非常的不直观,可以通过修改宝塔phpmyadmin配置文件的方式来禁止他分页。修改方法:1.进入服务器/www/server/phpmyadmin/phpmyadmin_随机...

如何删除idea软件搜索时的find mas...

在使用idea系列的配套软件时,如intellij idea、Php Storm、Web Strom时,在搜索文件时,右上角的file mask可以筛选指定类型的文件。但是有时候可能会输入错误,产生多个记录,而且没办法删除,在以后的开发中经...

Hbuilder开发APP时,找不到真机的解...

正确的USB连线,其次打开开发者选项、USB调试,这些都是老生常谈,就不说了。在确保以上操作无误后,如果还找不到真机,关闭IDE,然后去adb的目录下,即HBuilderX\plugins\launcher\tools\adbs,把adb....