hookehuyr

refactor(nfcTest): 移除模拟扫描功能并改进NFC结果显示

- 删除开发调试用的模拟扫描按钮及相关逻辑
- 添加safe_stringify方法处理ArrayBuffer类型数据
- 改进NFC结果显示格式,包含原始数据和解析结果
- 调整样式增加卡片边距
......@@ -13,10 +13,6 @@
<nut-button v-if="isScanning" type="danger" size="large" @click="stopScan" style="margin-top: 40rpx;">
停止扫描
</nut-button>
<nut-button v-if="showMockButton" type="info" size="large" @click="mockScan" style="margin-top: 40rpx;">
模拟扫描 (开发调试)
</nut-button>
</view>
<view class="status-area">
......@@ -52,11 +48,36 @@ const isScanning = ref(false);
const status = ref('等待操作');
const result = ref('');
const error = ref('');
const showMockButton = ref(false);
const debugInfo = ref('');
let nfcAdapter = null;
const safe_stringify = (data) => {
try {
return JSON.stringify(
data,
(key, value) => {
if (value instanceof ArrayBuffer) {
return {
__type: 'ArrayBuffer',
hex: bufferToHex(value),
};
}
if (value && value.buffer instanceof ArrayBuffer) {
return {
__type: 'TypedArray',
hex: bufferToHex(value.buffer),
};
}
return value;
},
2
);
} catch (e) {
return String(data);
}
};
const startScan = async () => {
error.value = '';
result.value = '';
......@@ -74,30 +95,21 @@ const startScan = async () => {
const version = systemInfo && systemInfo.version ? systemInfo.version : '';
debugInfo.value = `env: ${envType}\nplatform: ${platform}\nsystem: ${system}\nmodel: ${model}\nSDKVersion: ${SDKVersion}\nversion: ${version}`;
if (platform === 'devtools') {
showMockButton.value = true;
} else {
showMockButton.value = false;
}
if (platform === 'ios') {
error.value = 'iOS 端微信小程序通常不支持 NFC(该能力主要在 Android 可用)';
status.value = '启动失败';
showMockButton.value = true;
return;
}
if (!Taro.getNFCAdapter) {
error.value = '当前环境不支持 NFC 接口';
status.value = '启动失败';
showMockButton.value = true;
return;
}
if (envType && Taro.ENV_TYPE && envType !== Taro.ENV_TYPE.WEAPP) {
error.value = '当前不是微信小程序环境,无法使用 NFC';
status.value = '启动失败';
showMockButton.value = true;
return;
}
......@@ -130,11 +142,9 @@ const startScan = async () => {
} else if (err.errCode === 13001) {
error.value = '系统 NFC 开关未开启';
} else if (err.errMsg && err.errMsg.includes('platform is not supported')) {
error.value = '开发者工具不支持 NFC,请使用真机调试或点击下方模拟按钮';
showMockButton.value = true;
error.value = '开发者工具不支持 NFC,请使用真机调试';
} else {
error.value = 'NFC 启动失败: ' + (err.errMsg || JSON.stringify(err));
showMockButton.value = true;
}
status.value = '启动失败';
}
......@@ -157,51 +167,9 @@ const startScan = async () => {
debugInfo.value = `${debugInfo.value}\n\ngetNFCAdapter error:\n${e && (e.errMsg || e.message || JSON.stringify(e))}`;
error.value = 'NFC 初始化失败(可能是设备/系统不支持,或不在可用环境)';
status.value = '错误';
showMockButton.value = true;
}
};
const mockScan = () => {
status.value = '模拟扫描成功';
error.value = '';
// 构造模拟数据
// 模拟一个包含 Text Record 的 NDEF 消息
const text = 'Hello NFC!';
const langCode = 'en';
const payload = new Uint8Array(1 + langCode.length + text.length);
payload[0] = langCode.length; // Status byte (simplified)
// 写入 lang code
for (let i = 0; i < langCode.length; i++) {
payload[1 + i] = langCode.charCodeAt(i);
}
// 写入 text
for (let i = 0; i < text.length; i++) {
payload[1 + langCode.length + i] = text.charCodeAt(i);
}
// 模拟 type 'T'
const type = new Uint8Array([84]); // 'T'
const mockRes = {
id: new Uint8Array([0x04, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0]).buffer,
techs: ['NFC-A', 'NDEF'],
messages: [
{
records: [
{
type: type.buffer,
payload: payload.buffer,
tnf: 1
}
]
}
]
};
handleNfcMessage(mockRes);
};
const stopScan = () => {
if (nfcAdapter) {
nfcAdapter.stopDiscovery({
......@@ -299,7 +267,7 @@ const handleNfcMessage = (res) => {
content += '\n(无 NDEF 消息)\n';
}
result.value = content;
result.value = `--- 原始数据 ---\n${safe_stringify(res)}\n\n--- 解析结果 ---\n${content}`;
};
onUnmounted(() => {
......@@ -368,6 +336,7 @@ onUnmounted(() => {
background: #fff;
border-radius: 24rpx;
padding: 40rpx;
margin: 10rpx auto;
box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.05);
.result-header {
......