【问题标题】:How to detect iOS SMS capability (NOT text messaging in general)如何检测 iOS 短信功能(一般不是短信)
【发布时间】: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)?

【问题讨论】:

    标签: ios objective-c iphone ipad


    【解决方案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 卡进行测试。
    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多