iOS: проверьте, поддерживает ли телефон две SIM-карты?

В Android мы можем определить, является ли телефон одной SIM-картой или двумя SIM-картами. И, как мы знаем, iPhone XS, iPhone XS Max, iPhone XR и более поздние версии оснащены двумя SIM-картами с nano-SIM и eSIM, за исключением материкового Китая, где нет eSIM.

A) Я могу программно вызвать MFMessageComposeViewController нажатием кнопки, чтобы отправить SMS на определенный номер. Вот следующий код: Этот код может сказать нам, вставлена ​​ли SIM-карта или нет. Но будет ли это работать и для eSIM?

-(void)openMessageViewWithName:(NSString*)contactName withPhone:(NSString *)phone{

CTTelephonyNetworkInfo *networkInfo=[[CTTelephonyNetworkInfo alloc]init];

CTCarrier *carrier=networkInfo.subscriberCellularProvider;

NSString *Countrycode = carrier.isoCountryCode;

if ([Countrycode length]>0)     //Check If Sim Inserted
{

    [self sendSMS:msg recipientList:[NSMutableArray arrayWithObject:phone]];
}
else
{

    [AlertHelper showAlert:@"Message" withMessage:@"No sim card inserted"];
}

//Метод отправки сообщения:

   - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSMutableArray *)recipients{  
 MFMessageComposeViewController *controller1 = [[MFMessageComposeViewController alloc] init] ;
 controller1 = [[MFMessageComposeViewController alloc] init] ;
 if([MFMessageComposeViewController canSendText])
{
    controller1.body = bodyOfMessage;
    controller1.recipients = recipients;
    controller1.messageComposeDelegate = self;
    [self presentViewController:controller1 animated:YES completion:Nil];
 }
}

Б) Можно ли программно определить, является ли мой iPhone Dual SIM или Single SIM? Если да, это ДВОЙНАЯ SIM-карта, то можем ли мы выбрать SIM-карту из моего приложения для отправки SMS?

Пожалуйста, помогите мне с этим и помогите мне с обходным путем.


person Fionashoff    schedule 04.08.2020    source источник
comment
Нет, вы не можете определить данные сим-карты и выбрать сим-карту, которая используется для отправки сообщений. Это контролируется пользователем.   -  person Paulw11    schedule 04.08.2020
comment
@Paulw11Paulw11, пожалуйста, опубликуйте это как ответ с более подробной информацией, и я приму его ..... еще раз большое спасибо   -  person Fionashoff    schedule 04.08.2020


Ответы (2)


Как упомянул @PaulW11 в комментарии Нет, вы не можете ни определить данные сима, ни выбрать сима, который используется для отправки сообщений. Это контролируется пользователем Внимательно прочитайте для понимания

A) Во-первых, в iOS вы не получите никаких данных, связанных с SIM-картой, или номера телефона, вы получите только информацию о сети, такую ​​как имя оператора, код мобильной страны, код страны iso, код мобильной сети. Поэтому, если вы замените Verizon SIM с Verizon вы увидите имя оператора только как Verizon, больше ничего вы не получите

РЕШЕНИЕ Вызовите MFMessageController нажатием кнопки, как вы это делаете. Это откроет стандартное приложение iOS для SMS/сообщений. Затем позвольте пользователю выбрать SIM-карту в случае использования двух SIM-карт в самом приложении «Сообщения».

B) В приложении невозможно выбрать конкретную SIM-карту/номер телефона. Потому что в iOS нет такой возможности, как в Android. Вместо этого вы должны вызвать приложение сообщений по умолчанию в iOS, где вы можете выбрать желаемую SIM-карту (в случае ДВОЙНОЙ SIM-карты) для отправки SMS или еще в случае одна SIM-карта напрямую отправляет сообщение с этого номера

person polina    schedule 12.01.2021

ты пробовал это?

    CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc]init];
    if (@available(iOS 12.0, *)) {
        NSDictionary *providers = [networkInfo serviceSubscriberCellularProviders];
        NSEnumerator *e = [providers objectEnumerator];
        if ([[e.allObjects firstObject] isKindOfClass:(CTCarrier.class)]) {
            NSString *str = ((CTCarrier *)[e.allObjects firstObject]).isoCountryCode;
        }
    } else {
        // do a fallback
    }
person Kateryna Gridina    schedule 04.08.2020
comment
Свойство «isoCountryCode» не найдено в объекте типа «NSDictionary *» - person Fionashoff; 04.08.2020
comment
Словарь @property(readonly, retain) NSDictionary<NSString *,CTCarrier *> , вы уверены, что правильно обращаетесь к параметрам? - person Kateryna Gridina; 04.08.2020
comment
Я не уверен .. если возможно, пожалуйста, опубликуйте код с этим и для доступа к isoCountryCode из словаря - person Fionashoff; 04.08.2020
comment
Отредактировал ответ. Пожалуйста, проверьте. В моем примере я просто взял первый объект, но вы можете повторить, если это необходимо, используя NSEnumerator - person Kateryna Gridina; 04.08.2020
comment
где взять ноль? вы тестируете его на реальном устройстве? - person Kateryna Gridina; 05.08.2020
comment
да, я тестировал на реальном устройстве, но строка возвращает мне значение NULL в nslog - person Fionashoff; 05.08.2020
comment
for (NSString *aKey в провайдерах) { CTCarrier *aCarrier = провайдеры[aKey]; NSString *code = [aCarrier isoCountryCode]; NSLog(@Код страны: %@, код); } Наконец я сделал такой код и получил требуемый результат. Большое спасибо за вашу помощь, и да, ваши видео конференции SWIFT ценны :) - person Fionashoff; 05.08.2020
comment
спасибо ^^. Пожалуйста, отредактируйте ответ, если хотите, чтобы предоставить свое решение - person Kateryna Gridina; 05.08.2020