npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@bitstart/react-native-sms-sender

v0.2.1

Published

React Native SMS Sender - Android Native Module with TurboModules

Downloads

456

Readme

@bitstart/react-native-sms-sender

React Native SMS/MMS 管理插件,支持 Android TurboModules 新架构。

✨ 功能特性

📱 短信/彩信管理

  • ✅ 发送短信(直接发送 / 打开系统界面)
  • ✅ 发送彩信(通过系统 Intent)
  • ✅ 批量发送短信
  • ✅ 获取短信列表
  • ✅ 获取彩信列表
  • ✅ 获取会话列表
  • ✅ 搜索消息
  • ✅ 删除短信/彩信
  • ✅ 标记已读
  • ✅ 获取未读数量

📲 短信监听

  • ✅ 四重监听保障(BroadcastReceiver × 2 + ContentObserver + NotificationListener)
  • ✅ 验证码自动识别
  • ✅ 验证码自动复制到剪切板
  • ✅ 动态开关控制

🔋 保活机制

  • ✅ 前台服务(常驻通知)
  • ✅ 一像素保活(锁屏时激活)
  • ✅ 开机自启
  • ✅ 电池优化白名单

📶 SIM 卡支持

  • ✅ 获取 SIM 卡列表
  • ✅ 双卡设备支持
  • ✅ 指定 SIM 卡发送

📦 安装

npm install @bitstart/react-native-sms-sender
# 或
yarn add @bitstart/react-native-sms-sender
# 或
bun add @bitstart/react-native-sms-sender

🔧 配置

Android 权限

android/app/src/main/AndroidManifest.xml 中添加权限:

<manifest>
    <!-- 短信相关 -->
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_MMS" />

    <!-- 联系人(用于显示联系人名称) -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <!-- 电话状态(SIM 卡信息) -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <!-- 保活相关 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
</manifest>

📖 使用方法

初始化

import SmsSender from "@bitstart/react-native-sms-sender";

// 初始化 SDK
await SmsSender.initialize({
  smsListenerEnabled: true, // 启用短信监听
  autoCopyVerificationCode: true, // 自动复制验证码
  notificationEnabled: true, // 显示通知
  keepAliveEnabled: true, // 启用保活
  onePixelEnabled: true, // 启用一像素保活
});

发送短信

// 打开系统短信应用
await SmsSender.sendSms({
  phoneNumber: "10086",
  body: "Hello",
});

// 直接发送(需要权限)
await SmsSender.sendSms({
  phoneNumber: "10086",
  body: "Hello",
  skipConfirmation: true,
});

// 指定 SIM 卡发送
await SmsSender.sendSms({
  phoneNumber: "10086",
  body: "Hello",
  skipConfirmation: true,
  simSlotIndex: 0, // 第一张 SIM 卡
});

// 批量发送
const result = await SmsSender.sendBatchSms(["10086", "10010", "10000"], "Hello everyone!", { simSlotIndex: 0 });

发送彩信

await SmsSender.sendMms({
  phoneNumbers: ["10086"],
  body: "Hello with image",
  subject: "Test MMS",
  attachments: ["content://media/external/images/1"],
});

读取短信

// 获取短信列表
const { messages, total, hasMore } = await SmsSender.getSmsList({
  direction: "inbox", // 收件箱
  limit: 20,
  offset: 0,
});

// 获取未读短信
const unread = await SmsSender.getSmsList({
  unreadOnly: true,
});

// 获取某个联系人的短信
const contactMessages = await SmsSender.getSmsList({
  address: "10086",
});

// 按时间范围查询
const recent = await SmsSender.getSmsList({
  startDate: Date.now() - 7 * 24 * 60 * 60 * 1000, // 最近7天
  endDate: Date.now(),
});

读取彩信

// 获取彩信列表
const { messages } = await SmsSender.getMmsList({
  loadAttachments: true,
  limit: 20,
});

// 获取彩信附件
const attachments = await SmsSender.getMmsAttachments("mms_id");

获取会话列表

const { conversations } = await SmsSender.getConversations({
  limit: 30,
});

// 获取某个会话的消息
const { messages } = await SmsSender.getConversationMessages("thread_id", {
  limit: 50,
});

搜索消息

const { messages } = await SmsSender.searchMessages("验证码", {
  limit: 20,
});

删除消息

// 删除单条短信
await SmsSender.deleteSms("sms_id");

// 删除单条彩信
await SmsSender.deleteMms("mms_id");

// 批量删除
await SmsSender.deleteMessages(["id1", "id2", "id3"]);

// 删除整个会话
await SmsSender.deleteConversation("thread_id");

标记已读

// 标记单条已读
await SmsSender.markSmsAsRead("sms_id");
await SmsSender.markMmsAsRead("mms_id");

// 批量标记已读
await SmsSender.markMessagesAsRead(["id1", "id2"]);

// 标记整个会话已读
await SmsSender.markConversationAsRead("thread_id");

// 获取未读数量
const { sms, mms, total } = await SmsSender.getUnreadCount();

监听短信

// 监听所有短信
const unsubscribe = SmsSender.addSmsListener((event) => {
  console.log("收到短信:", event.sender);
  console.log("内容:", event.body);
  console.log("来源:", event.source); // sms_deliver / sms_received / content_observer / notification_listener

  if (event.isVerificationCode) {
    console.log("验证码:", event.verificationCode);
    console.log("已复制:", event.copiedToClipboard);
  }
});

// 取消监听
unsubscribe();

// 只监听验证码
const unsubscribeCode = SmsSender.addVerificationCodeListener((code, event) => {
  console.log("收到验证码:", code);
  console.log("来自:", event.sender);
});

保活服务

// 启动保活
await SmsSender.startKeepAlive();

// 停止保活
await SmsSender.stopKeepAlive();

// 获取保活状态
const status = await SmsSender.getKeepAliveStatus();
console.log("前台服务:", status.foregroundServiceRunning);
console.log("一像素保活:", status.keepAliveActivityAlive);
console.log("ContentObserver:", status.contentObserverRegistered);
console.log("通知监听:", status.notificationListenerConnected);

// 请求电池优化白名单
await SmsSender.requestIgnoreBatteryOptimization();

SIM 卡管理

// 获取 SIM 卡列表
const { sims, defaultSmsSlot } = await SmsSender.getSimCards();

sims.forEach((sim) => {
  console.log(`卡槽 ${sim.slotIndex}: ${sim.displayName}`);
  console.log(`  运营商: ${sim.carrierName}`);
  console.log(`  电话号码: ${sim.phoneNumber || "未知"}`);
  console.log(`  是否默认: ${sim.isDefaultSms}`);
});

动态配置

// 修改配置
await SmsSender.setConfig({
  autoCopyVerificationCode: false, // 关闭自动复制
  smsListenerEnabled: false, // 关闭短信监听
});

// 获取当前配置
const config = await SmsSender.getConfig();

// 单独设置
await SmsSender.setSmsListenerEnabled(true);
await SmsSender.setAutoCopyEnabled(true);

权限管理

// 检查发送权限
const hasSendPermission = await SmsSender.hasPermission();

// 请求发送权限
const granted = await SmsSender.requestPermission();

// 请求读取权限
const readGranted = await SmsSender.requestReadPermission();

// 检查设备支持
const available = await SmsSender.isAvailable();

剪切板操作

// 复制到剪切板
await SmsSender.copyToClipboard("123456");

// 读取剪切板
const text = await SmsSender.getClipboardText();

📊 数据类型

SmsMessage

interface SmsMessage {
  id: string; // 消息 ID
  type: "sms";
  threadId: string; // 会话 ID
  address: string; // 电话号码
  contactName?: string; // 联系人名称
  body: string; // 消息内容
  date: number; // 时间戳(毫秒)
  direction: MessageDirection;
  read: boolean;
  seen: boolean;
  simSlotIndex?: number;
}

MmsMessage

interface MmsMessage {
  id: string;
  type: "mms";
  threadId: string;
  addresses: string[]; // 收件人列表
  contactNames?: string[];
  subject?: string;
  body?: string; // 文本内容
  date: number;
  direction: MessageDirection;
  read: boolean;
  seen: boolean;
  attachments: MmsAttachment[];
  size?: number;
}

Conversation

interface Conversation {
  threadId: string;
  address: string;
  contactName?: string;
  snippet: string; // 最后一条消息
  date: number;
  messageCount: number;
  unreadCount: number;
  hasMms: boolean;
}

SimInfo

interface SimInfo {
  slotIndex: number;
  subscriptionId: number;
  carrierName: string;
  displayName: string;
  phoneNumber?: string;
  iccId?: string;
  isDefaultSms: boolean;
  countryIso?: string;
}

🔐 权限说明

| 权限 | 用途 | | -------------------------------------- | --------------- | | SEND_SMS | 发送短信 | | READ_SMS | 读取短信/彩信 | | RECEIVE_SMS | 接收短信广播 | | RECEIVE_MMS | 接收彩信广播 | | READ_CONTACTS | 获取联系人名称 | | READ_PHONE_STATE | 获取 SIM 卡信息 | | FOREGROUND_SERVICE | 前台保活服务 | | RECEIVE_BOOT_COMPLETED | 开机自启 | | REQUEST_IGNORE_BATTERY_OPTIMIZATIONS | 电池优化白名单 | | SYSTEM_ALERT_WINDOW | 一像素保活 |

⚠️ 注意事项

  1. 删除/修改短信:需要应用成为默认短信应用才能生效
  2. 直接发送短信:需要 SEND_SMS 权限
  3. 一像素保活:需要 SYSTEM_ALERT_WINDOW 悬浮窗权限
  4. 通知监听:需要用户手动在设置中授权
  5. 彩信发送:只能通过系统 Intent,无法直接发送

📝 更新日志

v0.2.0

  • ✨ 新增:获取短信/彩信列表
  • ✨ 新增:获取会话列表
  • ✨ 新增:删除短信/彩信/会话
  • ✨ 新增:标记已读功能
  • ✨ 新增:搜索消息
  • ✨ 新增:获取 SIM 卡信息
  • ✨ 新增:批量发送短信
  • ✨ 新增:发送彩信(Intent)
  • ✨ 新增:获取未读数量

v0.1.1

  • ✨ 新增:验证码自动复制
  • ✨ 新增:动态配置开关
  • 🐛 修复:配置持久化

v0.1.0

  • 🎉 初始版本
  • ✨ 短信发送(直接/Intent)
  • ✨ 四重短信监听
  • ✨ 验证码识别
  • ✨ 保活机制

📄 License

MIT