Обнаружение того, что SMS не удалось отправить на iOS

В моем приложении очень важно знать, отправлено СМС или нет. Для проверки я использую этот метод делегата:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{

    switch (result) {
        case MessageComposeResultCancelled: {
            [NSThread detachNewThreadSelector:@selector(SMScancelled) toTarget:self withObject:nil];
        }
            break;
        case MessageComposeResultSent: {
            [NSThread detachNewThreadSelector:@selector(SMSsent) toTarget:self withObject:nil];
        }
            break;
        case MessageComposeResultFailed: {
            [NSThread detachNewThreadSelector:@selector(SMSfailed) toTarget:self withObject:nil];
        }
            break;
        default:
            break;
    }

    [self dismissViewControllerAnimated:YES completion:nil];
}

Моя проблема в том, что при тестировании я включаю режим полета в настройках (чтобы проверить, что произойдет), а затем пытаюсь отправить SMS (используя свое приложение). Естественно, iOS не может его отправить, и система сообщает мне об этом. В приложении сообщений также показано, что мне не удалось его отправить. Но метод делегата по-прежнему возвращает MessageComposeResultSent вместо MessageComposeResultFailed. Такая ситуация также возникает, когда я тестирую на другом телефоне, в котором нет SIM-карты.

Я тестирую это на iOS 7 и iOS 8.

В документации написано, что MessageComposeResultSent означает "Пользователь успешно поставил в очередь или отправил сообщение". Это означает, что поведение, которое я ожидаю, правильное.

Итак, как узнать, было ли успешно отправлено мое последнее SMS или отправка не удалась?


person Reconquistador    schedule 20.01.2016    source источник
comment
Вы смогли это проверить? Я также сталкиваюсь с той же проблемой. Есть идеи, когда этот делегат MessageComposeResultFailed будет уволен?   -  person Fionashoff    schedule 16.01.2021
comment
К сожалению, не помню, так как это было 5 лет назад, и сейчас я уже не iOS-разработчик, поэтому больше не могу тестировать.   -  person Reconquistador    schedule 18.01.2021


Ответы (1)


Вы можете проверить, разрешено ли устройству отправлять текстовые сообщения, используя метод canSendText класса MFMessageComposeViewController.

Добавьте этот код ниже, когда вам нужно отправить сообщение (этот метод определяет, что ваше устройство не поддерживает SMS)

if(![MFMessageComposeViewController canSendText]) {
    UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [warningAlert show];
    return;
}

Вы можете проверить, что сообщение не удалось, используя метод делегата MFMessageComposeViewController

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result
{
    switch (result) {
       case MessageComposeResultCancelled:
       break;

       case MessageComposeResultFailed:
       {
            UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [warningAlert show];
            break;
       }

       case MessageComposeResultSent:
           break;

       default:
           break;
   }

   [self dismissViewControllerAnimated:YES completion:nil];
}
person Mayank Patel    schedule 20.01.2016
comment
Спасибо, я знаю о методе canSendText, но одного этого недостаточно. Я могу протестировать его перед открытием MFMessageComposeView, и он может вернуть TRUE, но когда пользователь попытается отправить SMS, устройство может потерять сигнал и не сможет отправить. Я использую messageComposeViewController:didFinishWithResult, но его поведение не такое, как мне нужно (это упоминается в ответе). - person Reconquistador; 20.01.2016
comment
чего ты хочешь тогда? если устройство потеряет сигнал, оно вернет MessageComposeResultFailed - person Mayank Patel; 20.01.2016
comment
Если это так, то почему он возвращает MessageComposeResultSent, когда я пытаюсь отправить, когда включен режим полета? Или это другое поведение, чем потеря сигнала? - person Reconquistador; 20.01.2016
comment
Я не уверен, почему вас отправляют, но я получаю правильный вывод - person Mayank Patel; 20.01.2016
comment
Это может быть из-за разных iOS. Я пробую это на iOS 8 (сегодня у меня нет доступа к устройству iOS 9). - person Reconquistador; 20.01.2016
comment
хм, возможно, похоже, что ошибка iOS, которую вы можете обновить до новой версии, решит вашу проблему. - person Mayank Patel; 20.01.2016
comment
Это только скроет это, так как все еще есть пользователи iOS 8 (более 7% пользователей в другом приложении), которые заполняют неверную информацию. - person Reconquistador; 20.01.2016
comment
Когда делегат вызывается со значением MessageComposeResultSent, это просто означает, что пользователь выбрал отправку. О последующих отказах не сообщается. - person Avi; 20.01.2016
comment
@MayankPatel Я тоже сталкиваюсь с проблемой ... в iOS 13 тоже, если я включаю режим полета или отключаю SIM-карту, я получаю 'MessageComposeResultSent' . не могли бы вы сказать, когда будет запущен этот MessageComposeResultFailed? - person Fionashoff; 16.01.2021
comment
@Fionashoff оно отправилось в папку «Исходящие», и когда вы снова подключитесь к Интернету, эта почта будет доставлена, так она и должна работать. - person Mayank Patel; 16.01.2021
comment
@MayankPatel Но я не говорю о почте / я говорю о SMS .. Итак, в каком случае будет запущен MessageComposeResultFailed. Я за этим в течение нескольких дней. Мне просто нужен тестовый пример, чтобы команда тестирования поняла - person Fionashoff; 16.01.2021
comment
@MayankPatel Я использую контроллер MFMessage, который отличается от Mail. - person Fionashoff; 16.01.2021