在iPhone上编程,如何检测SIM卡是否可用

3

你好,我正在使用SMSComposer并希望从通讯录向联系人发送短信。我想检测我的iPhone是否插入了SIM卡。

有什么方法可以实现这一点吗?

我尝试过Reachability类,但它只提供有关WWAN和互联网连接的信息。Core Telephony Framework是否具有这样的功能? 例如,iPhone的运营商名称等。

任何帮助都将不胜感激。 谢谢 Vikas

2个回答

9

Swift / iOS 12+

你可以尝试使用CoreTelephony框架,例如:

let noAvailability = CTTelephonyNetworkInfo()
    .serviceSubscriberCellularProviders?
    .values
    .compactMap { $0.mobileCountryCode }
    .isEmpty ?? false

请尝试链接CoreTelephony.framework,然后:

移动国家代码(CTCarrier的一个属性)的官方文档包含了一些关于一些极端情况的更多信息,这可能值得考虑。

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

NSString *_code = [[[[CTTelephonyNetworkInfo alloc] init] subscriberCellularProvider] mobileCountryCode];

你可以在官方文档中找到更多信息,但简要地说:

如果以下任一情况适用,则此属性的值为nil

  • 设备中没有SIM卡。

  • 设备处于蜂窝服务范围之外。

在iPhone 4S之前的硬件上,当处于飞行模式时,该值可能为nil


它实际上没有返回值,我在一些博客中读到,iOS返回sim值并且没有更新sim的当前可用性。我已经分配了tni = [[CTTelephonyNetworkInfo alloc] init];NSString *simStatusMNC = tni.subscriberCellularProvider.mobileNetworkCode; NSString *simStatusISO = tni.subscriberCellularProvider.isoCountryCode; NSString *simStatusMCC = tni.subscriberCellularProvider.mobileCountryCode;但仍然返回旧值。我在我的应用程序中检查过了。请更新。 - Dheeraj Jami
1
@DheerajJami,感谢您的评论,但在这种情况下您是错误的。 正如我在回答中所描述的那样,它完全符合官方文档。 您正在将其与carrierName属性混淆,我建议您尝试使用我回答中的代码,而不是其他内容。 这就是为什么我写了我写的东西; 当您陷入困境时,请随时仔细阅读官方文档,而不是不可信的来源。 谢谢! - holex
嗨Holex,是的,如果sim不可用,或处于飞行模式,或设备超出蜂窝服务范围,则上面的代码将返回nil值,但即使sim处于正常模式,它仍然返回nil值。请在这方面帮助我们。NSString *_code = [[[CTCarrier alloc] init] mobileCountryCode]; NSString *code1 = [[[CTCarrier alloc] init] isoCountryCode]; NSString *code2 = [[[CTCarrier alloc] init] mobileNetworkCode]; - Dheeraj Jami
你好Dhiraj,我该如何导入核心电话框架以使用这段代码? - Vikas Ojha
对我不起作用。始终返回nil。http://nanostuffs.com/Blog/?p=999有效。 - Sunkas
使用CTTelephonyNetworkInfo获取CTCarrier,但这总是返回nil,更多信息请参见https://dev59.com/g2kv5IYBdhLWcg3wlR31。 - NSDeveloper

1

为此,您需要添加MessageUI.framework框架...

尝试使用这段代码...它可能会帮助您

Class messageClass = (NSClassFromString(@"MFMessageComposeViewController"));
if([messageClass canSendText]){
    // Sim available
}
else{
    //Sim not available
}

1
仅返回一个布尔值,指示当前设备是否能够发送文本消息。它只能提供关于能力的信息,而不能提供关于可用性的信息。 - holex
你好,感谢您的帮助。关于/*! canSendText 如果用户已经设置设备只发送文本消息,则返回值为YES,客户端可以设置消息的收件人和正文。 如果返回值为NO,则客户端可以通知用户发送失败,或者客户端可以通过<tt>-[UIApplication openURL:]</tt>打开SMS URL。 - Vikas Ojha
如果SIM卡可用,但是SIM卡上没有足够的余额发送短信怎么办? - Nitin Gohel
1
对我来说不起作用。即使SIM卡已拆除,canSendText始终返回YES。 - Sunkas
1
您可以通过iMessage发送文本消息而无需Sim卡,因此它没有确切的解决方案。 - Onder OZCAN
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接