如何检测 iOS 短信功能(一般不是短信)

Posted

技术标签:

【中文标题】如何检测 iOS 短信功能(一般不是短信)【英文标题】:How to detect iOS SMS capability (NOT text messaging in general) 【发布时间】:2017-03-18 11:53:22 【问题描述】:

我正在编写一个应用程序,可以选择允许您向用户列表发送 SMS。应用当前检测设备是否允许使用 MFMessageComposeViewController.canSendText() 发送短信,结果为真时才显示“发送短信”按钮。

今天,我的一位用户抱怨说,当他按下仅支持 Wifi 的 iPad 上的按钮时,什么也没发生。事实证明,如果 ios 设备打开了 iMessage 功能,即使不支持 SMS,canSendText() 也会返回 true。在 iOS 设置中关闭 iMessage 功能会正确禁用“发送短信”按钮。

通过 iMessage 发送消息的问题是某些收件人将打开 iMessage,因此会收到短信。但是对于没有 iMessage 的收件人(它可能已关闭,或者他们可能一开始没有使用 Apple 设备),这些消息将不会到达。 (当 MFMessageComposeViewController 最终出现时,这些地址被标记为红色。但我的普通用户不会理解这意味着消息不会传递。)

有没有人知道专门测试 SMS 功能的可靠方法,而不仅仅是一般的文本消息(SMS、iMessage 和 MMS)?

【问题讨论】:

【参考方案1】:

据我所知,装有 iOS 5+ 的设备将返回 TRUEMFMessageComposeViewController.canSendText(),因为它们能够使用 iMessage

所以我假设您只需要在设备上安装了 SIM 卡的情况下发送文本。 但是无法检测设备上是否安装了 SIM 卡。您仍然可以使用以下解决方法:

#import<CoreTelephony/CTCallCenter.h>
#import<CoreTelephony/CTCall.h>
#import<CoreTelephony/CTCarrier.h>
#import<CoreTelephony/CTTelephonyNetworkInfo.h>

CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = info.subscriberCellularProvider;
NSString *mobileCountryCode = carrier.mobileCountryCode;
NSString *carrierName = carrier.carrierName;
NSString *isoCountryCode = carrier.isoCountryCode;
NSString *mobileNetworkCode = carrier.mobileNetworkCode;

NSLog(@"\n %@ \n %@ \n %@ \n %@", mobileCountryCode, carrierName, isoCountryCode, mobileNetworkCode);

这里,carrierName 将在 SIM 卡存在或最后使用 SIM 卡信息时返回名称。但如果没有安装 SIM 卡,其他人将是null

【讨论】:

这似乎适用于大多数情况。谢谢。但是,我可以想象这不起作用的极端情况。例如 SIM 卡已过期或计划不允许 SMS 消息(例如仅数据)的用户。知道是否也有办法解决这些情况吗? @WouterLiefting :我认为以编程方式不可能。对于过期的 SIM,您可以插入该 SIM 并运行上述代码并检查值。我没有使用过期的 SIM 卡进行测试。

以上是关于如何检测 iOS 短信功能(一般不是短信)的主要内容,如果未能解决你的问题,请参考以下文章

ios8.1短信转发功能怎么用?

java如何实现发送短信验证码功能?

iosp8.1短信转发怎么设置?ios8.1短信转发功能设置教程

应用程序无法检测到传入的短信iOS5

php5.2版本如何成功调用腾讯云短信API,实现短信发送功能

iOS开发中,调用打电话,发短信,打开网址等手机基础功能