Flutter获取SIM卡列表实现双SIM手机用户选卡发送短信
Flutter双SIM卡场景下支持用户自主选卡发送短信实现方案
你提到的现有短信插件仅支持代码层预设SIM卡槽、不支持用户选卡的问题,核心原因是插件没有对接系统原生的SIM枚举、选卡相关API,可按业务场景选择以下两种落地方式:
方案1:调起系统短信发送组件(适配成本最低,合规性最高)
不需要申请敏感短信权限,直接复用系统能力即可自动支持选卡:
- Android端:构造标准短信协议URI调起系统默认短信应用,双SIM机型下用户点击发送按钮时,系统会自动弹出SIM卡选择弹窗,用户选卡后自动完成发送,不需要额外做适配
- iOS端:系统自带的短信发送视图
MFMessageComposeViewController原生支持双SIM切换,调起后用户可自行选择发送号码,不需要额外处理选卡逻辑 - Flutter层实现:直接通过通用跳转插件构造
sms:目标手机号?body=短信内容格式的URI发起跳转即可,不需要依赖专门的短信插件。
方案2:应用内自实现选卡+发送(适合不需要跳转系统应用的场景)
通过MethodChannel桥接原生能力实现全流程在应用内完成,步骤如下:
- 权限配置:Android端按需申请短信发送权限、SIM卡信息读取权限,注意安卓13及以上版本需要用
READ_PHONE_NUMBERS权限替代旧版的READ_PHONE_STATE权限,否则无法读取完整SIM信息;iOS端不支持应用内静默发送短信,必须走系统短信组件,无额外权限配置 - 原生层逻辑:
- Android端通过系统
SubscriptionManager类枚举当前设备所有可用SIM卡,返回每张卡的运营商名称、卡槽标识、订阅ID(SubscriptionId)给Flutter层 - Flutter层拿到SIM卡列表后,弹出自定义选择弹窗让用户选定目标SIM卡
- 用户确认发送后,将手机号、短信内容、选中卡的订阅ID传回原生层,调用
SmsManager.getSmsManagerForSubscriptionId(订阅ID)实例完成短信发送
- Android端通过系统
避坑提示
- iOS系统出于隐私安全限制,不允许第三方应用在不弹出系统短信界面的情况下静默发送短信,所有号称支持iOS后台静默发短信的插件都不符合苹果商店审核规则,上架会被拒
- 不建议自行实现完全脱离系统规则的后台短信发送能力,国内部分厂商ROM对非系统默认短信应用的后台发短信行为有严格拦截,容易出现发送失败、合规风险
- 不要硬编码卡槽索引0/1作为发送依据,不同厂商ROM的卡槽序号和系统分配的订阅ID不是固定映射关系,必须以系统返回的订阅ID为准,否则会出现选错卡、发送失败的问题
- 如果不想自行编写MethodChannel桥接代码,可以选择支持SIM卡列表枚举、支持传入订阅ID发送的维护中短信插件,优先选择近1年有版本更新、适配了安卓14、iOS17的版本即可,避免使用停止维护的老旧插件。
内容的提问来源于stack exchange,提问作者HasH
相关产品推荐
相关产品推荐

