详细问题描述
BUG1: ios app调用getBluetoothAdapterState不回调
BUG2:ios app 调用createBLEConnection立即失败
[内容]
BUG1重现步骤
[步骤]
未调用openBluetoothAdapter而直接调用getBluetoothAdapterState,将导致getBluetoothAdapterState一直等待不执行回调函数(其他平台直接调用fail或complete)
[结果]
fail和complete函数都不立即回调,需要等到执行openBluetoothAdapter或者再次调用getBluetoothAdapterState才执行回调
[期望]
立即回调,并返回相应错误(微信与安卓app下的响应均是如此)
BUG2重现步骤
[步骤]
- openBluetoothAdapter
- 调用createBLEConnection(失败)
[结果]
返回错误fail no device
[期望]
能正常建立连接。
PS: - 传入的deviceId之前已经通过discovery接口获取到了,重新启动app时才会出现该问题。
- 如果在调用createBLEConnection之前,调用discovery接口搜索到设备则不会出现该问题。
- 因为我们的设备会将deviceId保存起来,因此每次搜索将导致连接速度极速下降
IDE运行环境说明
[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明]
HBuilderX 2.0.1.20190614
[IDE版本号]
2.0.1.20190614
[windows版本号]
win10 1809 17763.529
[mac版本号]
无
uni-app运行环境说明
[手机端hbuilder调试环境]
{"brand":"","model":"iPhoneX","pixelRatio":3,"screenWidth":375,"screenHeight":812,"windowWidth":375,"windowHeight":724,"statusBarHeight":44,"language":"zh-Hans-CN","system":"12.3.1","version":"1.9.9.64805","fontSizeSetting":"","platform":"ios","SDKVersion":"2.6.1","windowTop":0,"windowBottom":0}
[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]
通过hbuilderX创建的
[编译模式是老模板模式还是新的自定义组件模式?]
新的自定义组件模式
App运行环境说明
[iOS版本号]
12.3.1
[手机型号]
iphoneX
附件
<template>
<view>
<page-head :title="title"></page-head>
<view class="uni-padding-wrap uni-common-mt">
<view>
BUG反馈<br/>
测试环境:<br/>
系统:iphoneX ios12.3.1<br/>
hbuilderX:2.0.1.20190614<br/>
hbuilder app真机调试<br/>
</view>
<view class="uni-btn-v">
<view>
BUG1:未调用openBluetoothAdapter而直接调用getBluetoothAdapterState,将导致getBluetoothAdapterState一直等待不执行回调函数(其他平台直接调用fail或complete)
</view>
<button type="primary" @click="bug1">
BUG1测试
</button>
<view>
BUG2:调用createBLEConnection报错
</view>
<button type="primary" @click="bug2">
BUG2测试
</button>
<button type="primary" @click="scanDevice">
扫描设备
</button>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
title: 'bluetooth',
};
},
onLoad() {
console.log("蓝牙测试页面启动aa")
},
methods: {
async bug1() {
let status = await this.uniFunAsync("getBluetoothAdapterState")
console.log("ios app下这里的代码在没有调用初始化adapter或重新调用getState之前永远也不会执行")
},
async bug2() {
try {
//之前搜索到的deviceId
let deviceId = "7C783C7A-CCB7-9D6D-2C1F-910A7A766AB0"
//deviceId = "B5:71:6A:8F:E3:FE"
await this.uniFunAsync("openBluetoothAdapter")
await this.uniFunAsync("createBLEConnection", {deviceId})
console.log("其他平台均可以直接调用createBLEConnection,而不需要先搜索到设备")
} catch (e) {
console.log("ios app下报错")
}
},
async scanDevice() {
await this.uniFunAsync("openBluetoothAdapter")
uni.onBluetoothDeviceFound(res => {
console.log("找到设备: res = ", res)
})
await this.uniFunAsync("startBluetoothDevicesDiscovery", {
services: [],
allowDuplicatesKey: false,
interval: 0,
timeout: 15000,
deviceName: '',
containName: ''
})
},
/**
* 将蓝牙的接口生成promise调用
* @param fname
* @param options
* @returns {Promise<any>}
*/
uniFunAsync(fname, options = {}) {
const startTime = Date.now()
console.log("[", fname, "] 开始")
return new Promise((resolve, reject) => {
let params = {
fail(res) {
console.log(`[fail][${fname}] 失败,耗时[${Date.now() - startTime}]ms,err = `, res)
reject(res)
},
success(res) {
console.log(`[success][${fname}] 成功,耗时[${Date.now() - startTime}]ms`)
resolve(res)
}
}
if (options) {
params = Object.assign(params, options);
}
let func = uni[fname]
if (func) {
func(params);
} else {
reject(new Error("非法的api"));
}
})
},
}
}
</script>
<style>
.uni-title {
/ width: 100%; /
/ height: 80upx; /
text-align: center;
}
</style>
联系方式
[QQ]
516435871
l***@qq.com (作者)
这个底层能优化一下吗?小程序的蓝牙是只要你搜索到过deviceId后,以后的连接都不需要再重新搜索了。这个功能对于蓝牙体验特别重要。
2019-07-01 11:50
l***@qq.com (作者)
微信小程序是否将搜索到的信息保存到了flash上,下次直接加载就不需要搜索了?
2019-07-01 11:51
CLP
回复 l***@qq.com: 以后的连接都不需要再重新搜索了? 你是说杀调app也不需要重新搜索了??
2019-07-01 16:57
l***@qq.com (作者)
回复 CLP: 是的,微信ios版本杀掉后也不要的。直接传递deviceId即可连接成功。
2019-07-02 10:39
l***@qq.com (作者)
回复 CLP: 方便的话可以加我微信私聊:liyuan2087
2019-07-02 10:46
CLP
回复 l***@qq.com: 有qq吗
2019-07-02 17:27
l***@qq.com (作者)
回复 CLP: 516435871
2019-07-02 18:04
1***@qq.com
回复 l***@qq.com: 请问第二个问题解决了吗?
2023-03-13 11:53