fix:小程序获取wifi兼容iso设备

This commit is contained in:
2026-06-01 18:10:17 +08:00
parent c9ea368a19
commit 27d11a8129

View File

@@ -1,5 +1,6 @@
<script setup> <script setup>
import { ref, computed, onMounted, onUnmounted } from "vue"; import { ref, computed, onMounted, onUnmounted } from "vue";
import { onShow } from "@dcloudio/uni-app";
import Container from "@/components/Container.vue"; import Container from "@/components/Container.vue";
const STATES = { const STATES = {
@@ -52,13 +53,76 @@ const showWifiPermissionDeniedModal = () => {
}); });
}; };
// 启动小程序 WiFi 能力并监听真实 WiFi 列表 // 将 iOS 当前手机连接的 WiFi 写入候选列表,供用户继续填写设备连接密码
const applyIOSConnectedWifi = (wifi) => {
const ssid = wifi?.SSID;
if (!ssid) {
wifiList.value = [];
currentState.value = STATES.LIST;
return;
}
wifiList.value = [
{
...wifi,
SSID: ssid,
secure: wifi.secure !== false,
fromCurrentWifi: true,
},
];
currentState.value = STATES.LIST;
};
// 获取 iOS 当前手机连接的 WiFi并把它作为可选网络展示。
const syncIOSConnectedWifi = () => {
wx.getConnectedWifi({
success(res) {
console.log("[OTA WiFi] wx.getConnectedWifi success:", res);
applyIOSConnectedWifi(res.wifi || res);
},
fail(err) {
console.warn("[OTA WiFi] wx.getConnectedWifi fail:", {
errCode: err?.errCode,
errMsg: err?.errMsg,
err,
});
wifiList.value = [];
currentState.value = STATES.LIST;
},
});
};
// 启动 iOS WiFi 能力iOS 只用当前手机连接的 WiFi 作为候选网络。
const startIOSScanning = () => {
wx.startWifi({
success(res) {
console.log("[OTA WiFi] wx.startWifi success:", res);
syncIOSConnectedWifi();
},
fail(err) {
console.error("[OTA WiFi] wx.startWifi fail:", {
errCode: err?.errCode,
errMsg: err?.errMsg,
err,
});
if (err.errCode === 12005) showWifiBanner.value = true;
currentState.value = STATES.LIST;
},
});
};
// 启动小程序 WiFi 能力并按平台获取可用网络。
const startScanning = () => { const startScanning = () => {
currentState.value = STATES.SCANNING; currentState.value = STATES.SCANNING;
wifiList.value = []; wifiList.value = [];
showWifiBanner.value = false; showWifiBanner.value = false;
connectError.value = ""; connectError.value = "";
if (isIOS) {
startIOSScanning();
return;
}
wx.startWifi({ wx.startWifi({
success(res) { success(res) {
console.log("[OTA WiFi] wx.startWifi success:", res); console.log("[OTA WiFi] wx.startWifi success:", res);
@@ -144,30 +208,27 @@ const wifiListScrollHeight = computed(() => {
return `${Math.min(itemCount * 92, maxHeight)}rpx`; return `${Math.min(itemCount * 92, maxHeight)}rpx`;
}); });
// 提交 WiFi 配置给游戏设备;后端接口未接入前只提示占位信息并停留在弹窗。
const submitDeviceWifiConfig = ({ ssid, password }) => {
console.log("[OTA WiFi] submit device wifi config pending:", {
ssid,
hasPassword: !!password,
});
connectError.value = "设备连接接口待接入";
uni.showToast({
title: "设备连接接口待接入",
icon: "none",
});
};
// 校验用户输入并提交 WiFi 配置,不再把手机连接结果当作设备连接成功。
const joinNetwork = () => { const joinNetwork = () => {
if (joinDisabled.value) return; if (joinDisabled.value) return;
connectError.value = ""; connectError.value = "";
const ssid = connectInput.value.ssid; const ssid = connectInput.value.ssid;
const password = connectInput.value.password; const password = connectInput.value.password;
wx.connectWifi({ submitDeviceWifiConfig({ ssid, password });
SSID: ssid,
password,
success() {
connectedWifi.value = { SSID: ssid, secure: !!password };
currentState.value = STATES.CONNECTED;
},
fail() {
connectError.value = `无法查找到网络"${ssid}",请检查网络名称与设置!`;
},
});
setTimeout(() => {
if (currentState.value === STATES.CONNECTING && !connectError.value) {
connectedWifi.value = { SSID: ssid, secure: !!password };
currentState.value = STATES.CONNECTED;
}
}, 1000);
}; };
const startUpdate = () => { const startUpdate = () => {
@@ -233,6 +294,13 @@ onMounted(() => {
startScanning(); startScanning();
}); });
// iOS 从系统 WiFi 设置返回小程序后,同步当前手机连接的 WiFi。
onShow(() => {
if (isIOS && currentState.value === STATES.LIST) {
syncIOSConnectedWifi();
}
});
onUnmounted(() => { onUnmounted(() => {
clearInterval(progressTimer); clearInterval(progressTimer);
clearTimeout(timeoutTimer); clearTimeout(timeoutTimer);
@@ -262,8 +330,8 @@ onUnmounted(() => {
</text> </text>
<text v-if="currentState !== 'CONNECTED'" class="page-subtitle">网络名称仅支持英文字符及数字</text> <text v-if="currentState !== 'CONNECTED'" class="page-subtitle">网络名称仅支持英文字符及数字</text>
<view v-if="isIOS && currentState === 'SCANNING'" class="ios-guide"> <view v-if="isIOS && currentState !== 'CONNECTED'" class="ios-guide">
<text class="ios-guide-text">在设备 WiFi 设置中完成扫描后返回</text> <text class="ios-guide-text">先在系统 WiFi 设置中连接目标网络返回后选择当前 WiFi 并填写密码</text>
</view> </view>
<!-- 已连接网络卡片 --> <!-- 已连接网络卡片 -->