uniapp开发安卓跟ios所遇问题集合

Android平台配置CPU类型

一般勾选armeabi-v7a跟arm64-v8a就好了

  • armeabi-v7a 第7代及以上的ARM处理器(ARM32位),市面上大多数手机使用此CPU类型。
  • arm64-v8a 第8代、64位ARM处理器(ARM64位),最近两年新发的设备使用此CPU类型,可以兼容使用armeabi-v7a的so库。
  • x86 少部分平板使用x86,AS模拟器中选了intel x86时使用x86处理器,以及其它常用三方模拟器通常使用x86

您的应用目前的目标 API 级别为 29,但其目标 API 级别必须最低为 30,这样才能确保应用基于最新 API 而构建

应用配置文件,加 targetSdkVersion:"30"

文档地址:uni-app官网

文档地址:uni-app官网

IOS隐私信息访问的许可描述

Appstore审核要求App在调用如下涉及隐私的API时必须说明调用原因

IOS自定义开屏启动界面

官网示例:uni-app官网

直接使用uniapp模板文件(点击下载)中提供的相对常用的 storyboard 模板,可在这个文件的基础上进行自定义图片,已经一些文本内容

应用版本名称跟应用版本号

在ios跟谷歌中上架,版本号需要不停的加一,不然无法上传到市场中

app国际化默认语言设置

一定要在这里设置

let i18nConfig = {
	locale:  uni.getLocale(),
	messages
}

pages.json中设置 tabBar list中的国际化

"tabBar": {
		"height": "50rpx",
		// 配置选中颜色
		"selectedColor": "#42dfbf",
		"color": "#b0b3bf", // 设置为与背景颜色相同
		"backgroundColor": "white", // 设置为透明
		// list 每一项
		"list": [{
				"iconPath": "./static/img/tabbar/new.png",
				"selectedIconPath": "./static/img/tabbar/new_sel.png",
				"pagePath": "pages/message/message",
				"text": "%nav.1%"
			}
		]
	}

安卓跟ios下拉刷新效果

 pages.json

{
    "pages": [
        {
        	"path": "pages/index/index",
        	"style": {
        		"navigationBarTitleText": "下拉刷新",
        		"enablePullDownRefresh": true
        	}
        }
    ]
}

index.vue

export default {
	data() {
		return {
			text: '下拉刷新'
		}
	},
	onLoad: function (options) {
        //开始下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致
		uni.startPullDownRefresh();
	},
	onPullDownRefresh() {
       //一秒后停止刷新动画
		setTimeout(function () {
			uni.stopPullDownRefresh();
		}, 1000);
	}
}

iOS 取消底部的空白区域

"safearea" : {
            //安全区域配置,仅iOS平台生效  
            "bottom" : {
                // 底部安全区域配置  
                "offset" : "none" // 底部安全区域偏移,"none"表示不空出安全区域,"auto"自动计算空出安全区域,默认值为"none"  
            }
        }

app蓝牙开锁

官网相关文档:uni-app官网

先初始化蓝牙,然后开始搜寻蓝牙,开始搜寻后设置一个延时,超过一定时间取消搜寻 然后提示连接失败。如果找到了对应的设备,获取到设备信息,也关闭蓝牙搜寻。然后正式连接设备,连接成功设置uni.setBLEMTU 蓝牙最大传输单元,避免命令行太长无法传输到设备中。

最后获取蓝牙设备所有服务,然后获取蓝牙设备某个服务中所有特征值,然后就可以写入命令了,一般是要将字符串转为二进制数据,也就是字节数据,我在这个踩了很久,附上我转换成功的代码

function hexStringToArrayBuffer(str) {
				if (!str) {
					return new ArrayBuffer(0);
				}
				var buffer = new ArrayBuffer(str.length);
				let dataView = new DataView(buffer)
				for (let i = 0; i < str.length; i++) {
					// console.log('str.charAt(i).charCodeAt()', str.charAt(i).charCodeAt())
					dataView.setUint8(i, str.charAt(i).charCodeAt()) // 必须是Unicode 编码
				}
				return buffer;
			}

const inputString = `(${state.DeviceID},x,xxx,xxxx,xxxxx)`;
const bytes = hexStringToArrayBuffer(inputString);

完整代码: 

uni.openBluetoothAdapter({ //首先初始化蓝牙
							success(res) {
						        console.log('1')
								uni.startBluetoothDevicesDiscovery({ //这里是开启蓝牙搜寻
									success: (res) => {
										console.log('2')
										setTimeout(() => {
											unlockingTimeout.push(setInterval(()=>{
												exceptionPrompt('未搜尋到藍牙鎖,可嘗試重新打開藍牙')
												claerUnlockingTimeout()
												uni.stopBluetoothDevicesDiscovery({ //当找到匹配的蓝牙后就关掉蓝牙搜寻
													success(res) {
													}
												})
											}, 25000))
				                            state.progressSta = true
											drawCircle(item, index)
										}, 100)
										uni.onBluetoothDeviceFound((res) => { //这一步是监听返回的蓝牙设备 
										    uni.getBluetoothDevices({
										    	success: res => {
										    		console.log('2.5',res.devices)
										    		res.devices.forEach(device => { //这一步就是去筛选找到的蓝牙中
										    			if (device.name == item.imei) {
										    				uni.stopBluetoothDevicesDiscovery({ //当找到匹配的蓝牙后就关掉蓝牙搜寻
										    					success(res) {
										    					}
										    				})
										    				console.log('3',device.deviceId)
										    				state.DeviceID = device.deviceId 
										    				state.deviceName = item.imei
										    				uni.createBLEConnection({ //连接低功耗蓝牙设备
										    					deviceId: state.DeviceID, //传入刚刚获取的uuid  
										    					success(res) {
										    						console.log('4',state.DeviceID)
										    						setTimeout(function() {
										    							uni.setBLEMTU({
										    								deviceId: state.DeviceID,
										    								mtu: 300,
										    								success(res) {
										    									console.log('设置成功', res)
										    								},
										    								fail(err) {
										    									console.log('设置失败', err)
										    								}
										    							})
										    						}, 300)
										    						setTimeout(function() {
										    							uni.getBLEDeviceServices({ //获取蓝牙设备所有服务  
										    								deviceId: state.DeviceID,
										    								success(res) {
										    									console.log('5',res)
										    									if (uni.getSystemInfoSync().platform == "ios") {
										    										state.servicesList = res.services[0].uuid
										    									}else{
										    										state.servicesList = res.services[2].uuid
										    									}
										    									uni.getBLEDeviceCharacteristics({ //获取蓝牙设备某个服务中所有特征值  
										    										deviceId: state.DeviceID,
										    										serviceId: state.servicesList,
										    										success(res) {
										    											console.log('6')
										    											state.characteristicList = res.characteristics
										    											uni.notifyBLECharacteristicValueChange({
										    												state: true,
										    												deviceId: state.DeviceID,
										    												serviceId: state.servicesList,
										    												characteristicId: state.characteristicList[2].uuid,
										    												success(res) {
										    													console.log('连接成功', res)
										    													uni.onBLECharacteristicValueChange((res) => {
										    														console.log(`characteristic ${JSON.stringify(res)} has changed`)
										    														let hhh = ab2hex(res.value)
										    														console.log("监听成功", hexCharCodeToStr(hhh))
										    													})
										    													setTimeout(() => {
										    														sendInstruction(item)
										    													}, 500)
										    												},
										    												fail(res) {
										    													exceptionPrompt()
										    													console.log(JSON.stringify(res))
										    												}
										    											})
										    										},
										    										fail(res) {
										    											if (uni.getSystemInfoSync().platform == "ios") {
										    												if(res.code == '10012'){
										    													state.defeated = false
										    													state.progressSta = false
										    													state.progress = 0
										    													state.lockhead = true
										    													state.textSta = instance.proxy.$t('bluetooth.8')
										    												    messagePopup.value.showMessage('warn', '未找到設備,請重試')
										    												}
										    											}
										    											console.log(JSON.stringify(res))
										    										}
										    									})
										    								},
										    								fail(res) {
										    									exceptionPrompt()
										    									console.log(JSON.stringify(res))
										    								}
										    							})
										    						}, 1500)
										    				    },
										    					fail(res) {
										    						if(res.code == '10012'){
										    							state.defeated = false
										    							state.progressSta = false
										    							state.progress = 0
										    							state.lockhead = true
										    							state.textSta = instance.proxy.$t('bluetooth.8')
										    						    messagePopup.value.showMessage('warn', '連接超時,請重試')
										    						}
										    						console.log(res)
										    					}
										    				})
										    			}
										    		})
										    	},
										    	fail: e => {
										    		console.log(e)
										    	}
										    });
										})
									}
								})
							},
							fail(res) {
								if (res.code == 10001) {
									messagePopup.value.showMessage('warn', "藍牙是否打開")
								} else {
									messagePopup.value.showMessage('warn', res.errMsg)
								}
							}
						})

其他蓝牙开锁文章:uni-app蓝牙开锁篇 - DCloud问答

uni-app使用蓝牙 - 伟衙内 - 博客园 (cnblogs.com)

app中绘制图表

uChar插件文档地址:uCharts官网 - 秋云uCharts跨平台图表库

app实现国际化功能

使用uni-hello-i18n,官方有示例

示例地址:hello-i18n 示例工程 - DCloud 插件市场

官方文档:uni-app官网 

补充,国际化的繁体、简体跟英文一定要设置为 zh-Hant、zh-Hans、en 因为uniapp的内置插件会根据这个也进行国际化的切换

import en from './en.json'
import zhHans from './zh-Hans.json'
import zhHant from './zh-Hant.json'
export default {
	en,
	'zh-Hans': zhHans,
	'zh-Hant': zhHant
}

app二维码

插件地址:uQRCode 全端二维码生成插件 支持nvue 支持nodejs服务端 - DCloud 插件市场

<uqrcode ref="uqrcode" canvas-id="qrcode" :value="qrcodeData" :options="{ margin: 10 }"></uqrcode>


<script>
	import {
		reactive,
		ref,
		toRefs,
		getCurrentInstance,
		onMounted
	} from 'vue';

	export default {
		setup() {
			let qrcodeData = ref('')
			let uqrcode = ref(null)

			function saveQRCode() {
				uqrcode.value.save({
					success: () => {
						messagePopup.value.showMessage('success', instance.proxy.$t('otherMy.9'))
					}
				})
			}
			return {
				...toRefs(state),
				qrcodeData,
				saveQRCode,
				uqrcode
			};
		}
	};
</script>

 未完待续... ...

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HBuilder是一款基于HTML5开发的跨平台集成开发工具,而Uniapp则是HBuilder的一个重要插件,用于开发跨平台应用程序。Uniapp允许开发者使用Vue.js进行开发,并将代码编译生成Android和iOS应用。 Uniapp提供了一整套的开发工具和组件,可以帮助开发者快速构建跨平台应用。首先,它提供了多个UI组件,如按钮、标签、表单等,可以在应用中快速集成和使用。其次,Uniapp还提供了丰富的API接口,包括网络请求、本地文件操作等功能,使开发者可以轻松地实现各种功能需求。而且,Uniapp还提供了一套完整的调试工具,方便开发者在开发过程中定位和解决问题。 使用HBuilder和Uniapp进行安卓iOS应用的开发具有很多优势。首先,开发者只需要编写一套代码,就可以同时生成安卓iOS应用。这样可以大大减少开发时间和成本。而且,Uniapp的代码结构简洁,易于维护和扩展。其次,因为是基于Vue.js开发的,所以开发者可以充分利用Vue.js的各种特性,如数据绑定、组件化等,大大提高开发效率。此外,HBuilder和Uniapp也提供了丰富的文档和教程,为开发者提供了详细的学习和参考资料。 总之,使用HBuilder和Uniapp进行安卓iOS应用的开发是一种高效和便捷的方式。开发者可以充分利用这些工具和平台提供的功能和资源,快速构建出高质量的跨平台应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自湖南的阿晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值