微信上使用的操作设备很普遍,但其中的技巧可不少。首先,我们要明白两个不同的概念:微信的js - sdk是一个通用的API,面向所有开发者,适用于各种场景。而微信硬件jsapi则是专门为微信硬件设计的,这一点容易让人搞混,理解起来也有些困难。这就像你在商场购物时,有的优惠券可以用于所有商品,有的则只能用于特定的商品一样。
概念区分
微信的JavaScript SDK适用于大多数开发者。比如,开发微信小程序的基础功能时,它就非常有用。但微信硬件JS API就不同了,它是专门针对硬件操作设计的。有开发者尝试将普通微信功能与硬件JS API结合,但无论如何尝试,都无法成功。另外,若要在微信上操控设备,设备必须与微信建立连接。在苹果iOS系统的微信公众号中,连接状态会显示为“已连接”,而在安卓系统中,则会显示“已连接1个设备”。没有连接,后续的操作就无法进行。
设备连接方面,还有一点需要注意,那就是不同系统连接后的显示效果可能不同,这可能导致误解。举例来说,新开发者可能会因为看到安卓系统的显示方式而误以为设备未连接,于是反复尝试重新连接,结果徒劳无功,浪费了时间。
js库的引入
微信平台提供了一款js库,若要使用微信的js接口,就必须引入这个库。我们团队里有个新成员,他依照微信设备功能手册来开发项目,却因为手册中遗漏了引入这个库的说明,导致项目进展缓慢,十分焦虑。微信手册在这方面确实对新手不太友好。因此,从事相关开发的朋友们需要特别留意这一点,否则在项目初期就可能遇到障碍,后续的工作将难以进行。
此外,这个库对于微信硬件jsapi等后续功能的实现至关重要。若未引入,后续功能的代码即便编写完成,也无法正常运行。如此一来,将造成人力和时间的极大浪费。
wx.config({
beta: true, // 开启内测接口调用,注入wx.invoke方法,非常重要!!必须有这个
debug: true,//开启调试接口,alert运行结果
appId: '',//必填,公众号的唯一标识,
timestamp: '',//必填,生成签名的时间戳
nonceStr: '',//必填,生成签名的随机串
signature: '',//必填,签名,见附录1
jsApiList: []//要调用的js函数,必须把函数名字写入数组
});
config的配置
使用微信硬件jsapi时,在config配置中必须设置beta为true,这是一个至关重要的选项,但奇怪的是,官方的开发手册中并未提及。我的一位朋友在初次进行这个项目时,就因为这一步而陷入了困境。此外,jsApiList数组也需要留意,必须将所需的函数名称添加进去,比如初始化的openWXDeviceLib和发送数据的sendDataToWXDevice等。这就像你去图书馆找书,却没人告诉你具体的书架位置,只能自己四处寻找,非常麻烦。
wx.ready(function(){
// 初始化设备库函数
wx.invoke('openWXDeviceLib', {}, function(res){
// alert(res.err_msg);
});
});
不仅如此,若配置出现错误或遗漏,后续设备操作将无法进行。同时,查找问题所在变得极为困难,可能会花费大量时间检查与问题无关的代码。
函数调用的要点
var data={"deviceId": '微信给你的设备id',"base64Data": '你要发送的数据'};
调用openWXDeviceLib是初始化库的必要步骤,而getWXDeviceInfos和sendDataToWXDevice的操作则有所不同。getWXDeviceInfos不需要在ready阶段调用,而sendDataToWXDevice则需在业务逻辑中准备数据包时调用。这就像制作蛋糕,原料的准备顺序不同,最终蛋糕的品质和成败也会受到影响。
有个开发者曾尝试在ready状态下调用sendDataToWXDevice,结果引发了一系列错误,导致数据无法成功发送。这是因为操作不符合规定的调用顺序,使得调试工作徒劳无功,浪费了大量的时间和精力。
数据编码
var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function base64encode(str) {
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while(i < len) {
c1 = str.charCodeAt(i++) & 0xff;
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt((c1 & 0x3) << 4);
out += "==";
break;
}
c2 = str.charCodeAt(i++);
if(i == len)
{
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt((c2 & 0xF) << 2);
out += "=";
break;
}
c3 = str.charCodeAt(i++);
out += base64EncodeChars.charAt(c1 >> 2);
out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
out += base64EncodeChars.charAt(c3 & 0x3F);
}
return out;
}
data函数接收两个值,首先是一个设备标识符,其次是需发送的消息内容。注意,消息内容必须经过base64编码处理,否则设备将无法正确解析。以下是我用javascript编写的base64编码函数,供大家使用,以简化操作过程。曾经有一个项目因为忽略了这一编码步骤,导致设备始终无法接收数据。我们一度怀疑是设备或传输出了问题,经过一番排查才找到原因。
这个编码虽是细微的一步,却常被人忽视。若忽视它,便会干扰设备接收数据的核心环节,导致微信操作设备无法顺利进行。
数据接收与监听
// 发送设置命令
wx.invoke('sendDataToWXDevice', data, function(res){
//回调
});
在onReceiveDataFromWXDevice函数里,可以监听设备传回的数据。当页面初次展示设备信息时,这个函数特别有用。若数据接收或监听出现故障,可能是公众号缺少jsapi的使用权限,或是后台未开启硬件设备功能。这种情况很常见,许多人遇到后不知如何排查,常常花费大量时间寻找原因。
之前有一个公众号的开发项目遇到了问题,数据接收方面出了故障。开发团队起初认为是代码出了差错,经过几天的排查,最终发现是由于缺少jsapi的使用权限,这导致事情延误了不少。
wx.on('onReceiveDataFromWXDevice', function(argv) {
var obj=eval("("+JSON.stringify(argv)+")");
//这里的obj就是你收到的数据对象
//这里你要对数据再做一次解码
})
看了这么多微信使用技巧和潜在问题,操作时大家是否遇到了一些稀奇古怪的问题?欢迎分享给大家,共同探讨学习。记得点赞或转发这篇文章。