You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic/Angular多号码短信发送实现问题求助

我来帮你解决这个问题,咱们一步步梳理清楚问题根源并给出修复方案:


问题分析

你的代码主要存在三个核心问题:

  1. 异步操作时序错误:getContact() 是基于 Promise 的异步方法,你调用它后立刻访问 mContacts,此时 Storage 的读取还未完成,拿到的还是初始值或 null。
  2. 数组结构访问错误:mContacts 是包含对象的数组,每个联系人对象的结构是 {id: ..., name: ..., number: ...},你用 mContacts[0][2] 完全不符合结构定义,自然拿不到号码。
  3. 未遍历所有联系人:当前代码只尝试给一个(错误位置的)号码发送,没有实现遍历所有联系人的需求。

修复方案

1. 先改造联系人组件的 getContact 方法

让它返回 Promise,这样我们可以在发送短信时等待联系人数据加载完成:

// 联系人组件中的 getContact 方法修改
getContact(): Promise<void> {
  return this.storage.get(this.key).then((val) => {
    console.log('Contact Name: ', val);
    if (val != null && val !== undefined) {
      this.mContacts = JSON.parse(val);
    }
  });
}

同时可以优化一下 mContacts 的初始结构,避免不必要的数组嵌套:

mContacts = [
  { id: 0, name: '', number: '' },
  { id: 1, name: '', number: '' },
  { id: 2, name: '', number: '' },
  { id: 3, name: '', number: '' },
  { id: 4, name: '', number: '' }
];

2. 重写 sendSMS 函数实现遍历发送

使用 async/await 处理异步逻辑,遍历所有联系人并逐个发送短信:

async sendSMS() {
  // 等待联系人数据从 Storage 加载完成
  await this.contactComponent.getContact();
  
  const message = "Hello World";
  const options = {
    replaceLineBreaks: false,
    android: {
      intent: 'INTENT' // 如需静默发送可改为空字符串 ''
    }
  };

  // 遍历所有联系人
  for (const contact of this.contactComponent.mContacts) {
    // 过滤掉没有有效号码的联系人
    if (contact.number?.trim()) {
      const targetNumber = contact.number.trim();
      console.log(`准备给 ${contact.name} 发送短信,号码:${targetNumber}`);
      try {
        await this.sms.send(targetNumber, message, options);
        console.log(`短信成功发送给 ${contact.name}`);
      } catch (error) {
        console.error(`发送给 ${contact.name} 的短信失败:`, error);
      }
    } else {
      console.log(`跳过联系人 ${contact.name}:无有效电话号码`);
    }
  }
}

额外注意事项
  • 确保已经正确配置 Ionic SMS Plugin 的平台权限:Android 需要在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.SEND_SMS" />;iOS 需要在 Info.plist 中添加短信相关权限描述。
  • 必须使用真实设备测试,模拟器无法正常发送短信。
  • 部分平台支持批量发送(直接传入号码数组,比如 this.sms.send([num1, num2], message, options)),可以根据插件文档调整,但逐个发送兼容性更好。

内容的提问来源于stack exchange,提问作者Mitchell Yuen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:31:34