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中的国际化

javascript 复制代码
"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

javascript 复制代码
{
    "pages": [
        {
        	"path": "pages/index/index",
        	"style": {
        		"navigationBarTitleText": "下拉刷新",
        		"enablePullDownRefresh": true
        	}
        }
    ]
}

index.vue

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

iOS 取消底部的空白区域

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

app蓝牙开锁

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

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

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

javascript 复制代码
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);

完整代码:

javascript 复制代码
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的内置插件会根据这个也进行国际化的切换

javascript 复制代码
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 插件市场

javascript 复制代码
<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>

未完待续... ...

相关推荐
腾讯TNTWeb前端团队1 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰4 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪4 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪4 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy5 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom6 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom6 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom6 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom6 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom6 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试