iPhone - Определение доступности SIM-карты

Я использую ответ в этой теме.iPhone - как определить носителя устройства (AT & T, Verizon и т. д.?) который так же, какполучение данных оператора в iphone, Хотя это работает нормально при использовании сим-карты, возвращаемое имя оператора, если нет SIM-карты, является старым именем оператора. Он не обнаруживает, что SIM-карта удалена.

Я знаю, что это противоречит документации Apple, что, если нет носителя, объект CTCarrier будет нулевым. Но в моем приложении я зарегистрировал информацию о носителе, и она дает мне последнее имя оператора, хотя ни одна сим не установлена.

Ответы на вопрос(4)

func hasCellularCoverage() -> Bool {

    let networkInfo = CTTelephonyNetworkInfo()

    guard let info = networkInfo.subscriberCellularProvider else {return false}

    if let carrier = info.isoCountryCode {
        print("No sim present Or No cellular coverage or phone is on airplane mode. Carrier = \(carrier)");
        return true
    }

    return false

}

или же

func hasCellularCoverage() -> Bool {

    let networkInfo = CTTelephonyNetworkInfo()

    guard let info = networkInfo.subscriberCellularProvider else {return false}

    return info.isoCountryCode != nil ? true : false

}
Решение Вопроса

документация за[CTCarrier carrierName]:

If you configure a device for a carrier and then remove the SIM card, this property retains the name of the carrier.

Насколько я знаю, вы не можете определить, установлена ли SIM-карта. Вы можете только определить, доступно ли соединение WWAN, используяReachability.

 08 мая 2012 г., 01:02
Правильно, и нет возможности проверить наличие SIM-карты.
 17 июн. 2012 г., 02:34
@wnafee К сожалению, это не всегда так, поскольку значения сохраняются, пока устройство не будет перезагружено после извлечения SIM-карты. Однако YMMV с разными версиями iOS.
 17 июн. 2012 г., 02:30
В той же ссылке на документацию, которую вы указали, не можетеmobileCountryCode или жеmobileNetworkCode использоваться для определения наличия или отсутствия SIM-карты? В документации говорится, что эти значения будутnil если нет SIM-карты. Не похоже, что эти свойства сохранены
 Abdalrahman Shatou08 мая 2012 г., 01:00
Это помогло, но не решило проблему. Соединение WWAN может не существовать, но SIM-карта все еще может быть вставлена (если пользователь отключает данные и 3G).

CTCarrier Объект имеет 5 свойств:

carrierName
isoCountryCode
mobileCountryCode
mobileNetworkCode

Я сделал несколько тестов относительно CTCarrier и пришел к выводу, что для iOS 7only carrierName and are retained когда SIM-карта удалена. isoCountryCode, mobileCountryCode и mobileNetworkCode сбрасываются для iOS 7. Таким образом вы можете определить, присутствует SIM-карта или нет.

Для iOS 6 все значения сохраняются.

Я выполнил тесты с использованием iPhone 4S и iPhone 5, работающих под управлением iOS 7.

@import CoreTelephony;

-(BOOL)hasCellularCoverage
{
    CTTelephonyNetworkInfo *networkInfo = [CTTelephonyNetworkInfo new];
    CTCarrier *carrier = [networkInfo subscriberCellularProvider];


    if (!carrier.isoCountryCode) {
        NSLog(@"No sim present Or No cellular coverage or phone is on airplane mode.");
        return NO;
    }
    return YES;
}

Ваш ответ на вопрос