2

2版

适配设备:Pro

作者:lor

下载量:15 · 点赞:2

可信源码风险提示:保存或下载前请阅读源码和权限声明。
SHA-256528a2007c39367aa1f8c1b5c93a21a5cf18474e80aa87850137527f559ead2bc
const GET_URL = 'https://httpbin.org/get';

function companionGet(url) {
  return new Promise((resolve, reject) => {
    if (!script.canUse('@system.interconnect.instance')) {
      reject(new Error('当前设备不支持 system.companion'));
      return;
    }
    const connect = system.companion.instance();
    connect.getReadyState({
      success: res => {
        if (res.status !== 1) {
          reject(new Error('手机未连接,请确保小米运动健康在后台运行'));
          return;
        }
        connect.send({
          data: { method: 'GET', url },
          success: () => console.log('请求已发送,等待手机回传…'),
          fail: (data, code) => reject(new Error(`发送失败 ${code}`))
        });
      },
      fail: () => reject(new Error('无法获取连接状态'))
    });

    connect.onmessage = event => {
      const msg = event.data;
      if (msg && msg.__result__ === 'get') {
        resolve(msg.body);
        connect.onmessage = null;
      }
    };
    connect.onerror = err => {
      reject(new Error('手机通信错误: ' + JSON.stringify(err)));
      connect.onerror = null;
    };
  });
}

async function main() {
  const canCompanion = script.canUse('@system.interconnect.instance');
  if (!canCompanion) {
    await dialog.alert({
      title: '无法联网',
      message: '8 Pro 不支持 FETCH 直连,且当前 JSLab 未暴露手机通信接口。',
      confirmText: '退出'
    });
    return;
  }

  const input = await dialog.text({
    title: '代理请求 URL',
    message: '手环将请求发给手机,由手机代为访问(需小米运动健康在后台)',
    value: GET_URL,
    placeholder: 'https://…',
    required: true
  });
  if (input.action !== 'confirm') return;

  script.toast('正在请求…', 2000);
  try {
    const body = await companionGet(input.value.trim());
    const preview = typeof body === 'string' ? body.slice(0, 300) : JSON.stringify(body).slice(0, 300);
    await dialog.alert({ title: '返回内容', message: preview, confirmText: '好' });
  } catch (err) {
    await dialog.alert({ title: '请求失败', message: err.message, confirmText: '知道了' });
  }
}
return main();