l***@qq.com
l***@qq.com
  • 发布:2019-06-20 10:34
  • 更新:2019-07-11 16:28
  • 阅读:2054

【报Bug】ios app createBLEConnection和getBluetoothAdapterState的问题

分类:uni-app

详细问题描述

BUG1: ios app调用getBluetoothAdapterState不回调
BUG2:ios app 调用createBLEConnection立即失败

[内容]

BUG1重现步骤

[步骤]
未调用openBluetoothAdapter而直接调用getBluetoothAdapterState,将导致getBluetoothAdapterState一直等待不执行回调函数(其他平台直接调用fail或complete)
[结果]
fail和complete函数都不立即回调,需要等到执行openBluetoothAdapter或者再次调用getBluetoothAdapterState才执行回调
[期望]
立即回调,并返回相应错误(微信与安卓app下的响应均是如此)

BUG2重现步骤

[步骤]

  1. openBluetoothAdapter
  2. 调用createBLEConnection(失败)
    [结果]
    返回错误fail no device
    [期望]
    能正常建立连接。
    PS:
  3. 传入的deviceId之前已经通过discovery接口获取到了,重新启动app时才会出现该问题。
  4. 如果在调用createBLEConnection之前,调用discovery接口搜索到设备则不会出现该问题。
  5. 因为我们的设备会将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

2019-06-20 10:34 负责人:无 分享
已邀请:
CLP

CLP

你的第二个问题,第一次搜索到要链接的deviceid 之后,在链接deviceid的蓝牙设备 不需要再搜索。除非你退出 或者关闭蓝牙了

  • 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

DCloud_App_Array

DCloud_App_Array

HBuilderX alpha(2.0.5)已修复此问题

该问题目前已经被锁定, 无法添加新回复