2013-12-25 1 views
5

У меня есть приложение iphone, которое имеет возможность отправлять сообщения. Я хочу предупредить пользователя, когда SIM-карта недоступна в iphone. Так что я попытался ниже три функции для проверки SIM-карты AvailabiltyВозможный способ обнаружения обнаружения сим-карты в ios?

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

if([MFMessageComposeViewController canSendText]){ 
    // Sim available 
    NSLog(@"Sim available"); 
} 
else{ 
    //Sim not available 
    NSLog(@"Sim not available"); 
} 

if([[UIDevice currentDevice].model isEqualToString:@"iPhone"]) 
{ 
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel:123456"]]) 
    { 
     NSLog(@"Sim available"); 
    } 
    else 
    { 
     NSLog(@"Sim not available"); 
    } 
} 

Я проверил мой Iphone без сим, он всегда возвращается @ «Sim доступно». Но когда я открываю приложение «Сообщения» по умолчанию и пытаюсь отправить смс, он сообщает «Нет установленной SIM-карты» ... Как это приложение для сообщений может обнаружить наличие сим-карты?

+1

Я не думаю, что вы можете, Apple не предоставляет никакой информации о сима, сотовый, радио сети вы находитесь, и т.д. – nivritgupta

ответ

6

К нижнему коду вы можете получить данные о сим-карте, такие как carriername, mobilecountrycode, isocountrycode, mobilenetworkcode.In ios 6 все сохранены. Так что если ваша сим-карта будет удалена, она сохранит старые детали. идея обыкновение быть полезным, но в ИОС 7 только CARRIERNAME сохраняется и остальные изменяются таким образом, приведенный ниже код может быть использован

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 

// Try this to track CTCarrier changes 
info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier* inCTCarrier) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"User did change SIM"); 
     }); 
}; 
+0

Так нет никакого способа, обнаружить наличие сим-карты в ios6 .... правильно? –

+0

Нет, насколько я знаю, нет способа обнаружить, что сим-карта присутствует в ios в этом методе? Но код, который вы использовали, также должен работать нормально. Я не знаю, почему это плохо работает? –

+0

ОК спасибо. Хороший день –

7

Вы можете проверить это класс CTCarrier.

enter image description here

BOOL isSimCardAvailable = YES; 

CTTelephonyNetworkInfo* info = [[CTTelephonyNetworkInfo alloc] init]; 
CTCarrier* carrier = info.subscriberCellularProvider; 

if(carrier.mobileNetworkCode == nil || [carrier.mobileNetworkCode isEqualToString:@""]) 
{ 
    isSimCardAvailable = NO; 
} 

Вам нужно добавить рамки CoreTelephony для использования CTTelephonyNetworkInfo и CTCarrier.

1

Дополняя ответ Anneq Анвара, здесь быстрая версия:

import CoreTelephony 
func isSimAvailable() -> Bool { 
    var isSimCardAvailable = true 
    var info = CTTelephonyNetworkInfo() 
    var carrier = info.subscriberCellularProvider 
    if carrier != nil && carrier.mobileNetworkCode == nil || carrier.mobileNetworkCode.isEqual("") { 
     isSimCardAvailable = false 
    } 
    return isSimCardAvailable 
} 

Исправление: Носитель может быть нулем в некоторых устройствах

+0

Ваш код компилируется, но сбой –

+0

Эй, Леонардо, кажется, что в зависимости от устройства , перевозчик может быть ноль, спасибо человеку; D –

2

Внедрены в Swift как свойство только для чтения вычислено:

import CoreTelephony 

var availableSIM: Bool { 
    return CTTelephonyNetworkInfo().subscriberCellularProvider?.mobileNetworkCode != nil 
} 
2

Дополнением к Anneq и Фелипе отвечает:

Swift 2,3:

не
import CoreTelephony 
func isSimAvailable() -> Bool { 
    let info = CTTelephonyNetworkInfo() 
    let carr = info.subscriberCellularProvider 
    guard let carrier = carr else { 
     return false 
    } 
    guard let carrierCode = carrier.mobileNetworkCode else { 
     return false 
    } 
    guard carrierCode != "" else { 
     return false 
    } 
    return true 
}