Как программно отправить SMS на iPhone?

Кто-нибудь знает, можно ли и как программно отправить SMS с iPhoneофициального SDK / Cocoa Touch?

18 ответов

  1. Вы можете использовать sms:[target phone number]URL-адрес для открытия приложения SMS, но нет никаких указаний о том, как предварительно заполнить текст SMS (см. Это сообщение на форумах разработчиков Apple).

  2. Ограничения

    Если вы можете отправить SMS в рамках программы на iPhone, вы сможете писать игры, которые спам людей в фоновом режиме. Я уверен, что вы действительно хотите, чтобы спам от ваших друзей, «попробовать эту новую игру! Это roxxers мой boxxers, и Ваш будет тоже! roxxersboxxers.com!!!! Если вы зарегистрируетесь сейчас, то получите 3200 RB очков!

    У Apple есть ограничения для автоматизированных (или даже частично автоматизированных) SMS и операций набора номера. (Представьте, что игра вместо этого набрала 911 в определенное время суток)

    Лучше всего настроить промежуточный сервер в интернете, который использует онлайн-сервис отправки SMS, и отправить SMS по этому маршруту, если вам нужна полная автоматизация. (т. е. ваша программа на iPhone отправляет UDP пакет на ваш сервер, который отправляет реальные SMS)

    обновление iOS 4

    iOS 4, однако, теперь предоставляет viewControllerвозможность импорта в приложение. Предварительно заполните поля SMS, затем пользователь может инициировать отправку SMS в контроллере. В отличие от использования » SMS:…»формат url-адреса позволяет приложению оставаться открытым, а также заполнять поля to и body. Можно даже указать несколько получателей.

    Это не позволяет приложениям отправлять автоматические SMS без явного уведомления Пользователя. Вы по-прежнему не можете отправлять полностью автоматизированные SMS с самого iPhone, это требует некоторого взаимодействия с пользователем. Но это, по крайней мере, позволяет заполнить все, и избегает закрытия приложения.

    Класс MFMessageComposeViewController хорошо документирован, и учебники показывают, как легко это реализовать.

    обновление iOS 5

    iOS 5 включает в себя обмен сообщениями для устройств iPod touch и iPad, поэтому, хотя я еще не протестировал это сам, возможно, что все устройства iOS смогут отправлять SMS через MFMessageComposeViewController. Если это так, то Apple запускает сервер SMS, который отправляет сообщения от имени устройств, не имеющих сотового модема.

    обновление iOS 6

    Никаких изменений в этом классе.

    обновление iOS 7

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

    обновление iOS 8

    Никаких изменений в этом классе.

    обновление iOS 9

    Никаких изменений в этом классе.

    обновление iOS 10

    Никаких изменений в этом классе.

    обновление iOS 11

    Нет существенных изменений в этом классе

    Ограничения для этого класса

    Имейте в виду, что это не будет работать на телефонах без iOS 4, и он не будет работать на iPod touch или iPad, за исключением, возможно, под iOS 5. Перед использованием этого контроллера необходимо либо определить ограничения устройства и iOS, либо ограничить приложение недавно обновленными 3G, 3GS и 4 iPhone.

    Тем не менее, промежуточный сервер, который отправляет SMS, позволит любому из этих устройств iOS отправлять SMS, пока у них есть доступ к интернету, поэтому это может быть лучшим решением для многих приложений. Поочередно используйте оба варианта и возвращайтесь к онлайн-службе SMS, только если устройство не поддерживает ее.

  3. Если вы хотите, вы можете использовать частный фреймворкCoreTelephony, который вызвал CTMessageCenterclass. Существует несколько способов отправки sms.

  4. Вот учебник, который делает именно то, что вы ищете:MFMessageComposeViewController.

    http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/

    По существу:

    MFMessageComposeViewController *controller = [[[MFMessageComposeViewController alloc] init] autorelease];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = @"SMS message here";
        controller.recipients = [NSArray arrayWithObjects:@"1(234)567-8910", nil];
        controller.messageComposeDelegate = self;
        [self presentModalViewController:controller animated:YES];
    }
    

    И ссылка на документы.

    https://developer.apple.com/documentation/messageui/mfmessagecomposeviewcontroller

  5. В iOS 4 есть класс, который поддерживает отправку сообщений с телом и реципиентами из вашего приложения. Это работает так же, как отправка почты. Вы можете найти документацию здесь: текст ссылки

    1. Необходимо добавить MessageUI.фреймворк для вашего проекта Xcode
    2. Включить #import <MessageUI/MessageUI.h>в файл заголовка
    3. Добавьте эти делегаты в файл заголовка MFMessageComposeViewControllerDelegate &UINavigationControllerDelegate
    4. В IBActionметоде объявить экземпляр MFMessageComposeViewControllersaymessageInstance
    5. Чтобы проверить, может ли ваше устройство отправлять текст [MFMessageComposeViewController canSendText]в условии if, он возвратит Yes / No
    6. В ifсостоянии сделать это:

      1. Первый набор тела для вашего messageInstanceas:

        messageInstance.body = @"Hello from Shah";
        
      2. Затем выберите получателей сообщения как:

        messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
        
      3. Задайте делегат для messageInstance как:

        messageInstance.messageComposeDelegate = self;
        
      4. В последней строке сделайте это:

        [self presentModalViewController:messageInstance animated:YES];
        
  6. Использовать это:

    - (void)showSMSPicker
    {
        Class messageClass = (NSClassFromString(@"MFMessageComposeViewController"));
    
        if (messageClass != nil) {          
            // Check whether the current device is configured for sending SMS messages
            if ([messageClass canSendText]) {
               [self displaySMSComposerSheet];
            }   
        }
    }
    
    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
    {       
        //feedbackMsg.hidden = NO;
        // Notifies users about errors associated with the interface
        switch (result)
        {
            case MessageComposeResultCancelled:
            {   
                UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending canceled!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
                [alert1 show];
                [alert1 release];
            }   
    
            // feedbackMsg.text = @"Result: SMS sending canceled";
            break;
    
            case MessageComposeResultSent:
            {
                UIAlertView *alert2 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
                [alert2 show];
                [alert2 release];
            }   
    
            // feedbackMsg.text = @"Result: SMS sent";
            break;
    
            case MessageComposeResultFailed:
            {   
                UIAlertView *alert3 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS sending failed!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
                [alert3 show];
                [alert3 release];
            }   
    
            // feedbackMsg.text = @"Result: SMS sending failed";
            break;
    
            default:
            {   
                UIAlertView *alert4 = [[UIAlertView alloc] initWithTitle:@"Message" message:@"SMS not sent!!!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
                [alert4 show];
                [alert4 release];
            }   
    
            // feedbackMsg.text = @"Result: SMS not sent";
            break;
        }
    
        [self dismissModalViewControllerAnimated: YES];
    }
    
  7. //Add the Framework in .h file
    
    #import <MessageUI/MessageUI.h>
    #import <MessageUI/MFMailComposeViewController.h>
    
    //Set the delegate methods
    
    UIViewController<UINavigationControllerDelegate,MFMessageComposeViewControllerDelegate>
    
    //add the below code in .m file
    
    
    - (void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
    
        MFMessageComposeViewController *controller = 
        [[[MFMessageComposeViewController alloc] init] autorelease];
    
        if([MFMessageComposeViewController canSendText])
        { 
            NSString *str= @"Hello";
            controller.body = str;
            controller.recipients = [NSArray arrayWithObjects:
                                     @"", nil];
            controller.delegate = self;
            [self presentModalViewController:controller animated:YES];  
        }
    
    
    }
    
    - (void)messageComposeViewController:
    (MFMessageComposeViewController *)controller
                     didFinishWithResult:(MessageComposeResult)result 
    {
        switch (result)
        {
            case MessageComposeResultCancelled:  
                NSLog(@"Cancelled");    
                break; 
            case MessageComposeResultFailed:
                NSLog(@"Failed");
                break;   
            case MessageComposeResultSent:      
                break; 
            default:  
                break;  
        }  
        [self dismissModalViewControllerAnimated:YES]; 
    }
    
  8. Одной из систем межпроцессной связи в MacOS является XPC. Этот уровень системы был разработан для межпроцессной связи, основанной на передаче plist-структур с помощью libSystem и launchd. По сути, это интерфейс, позволяющий управлять процессами посредством обмена такими структурами, как словари. Благодаря наследственности, iOS 5 также обладает этим механизмом.

    Возможно, вы уже поняли, что я имею в виду под этим введением. Да, есть системные службы в iOS, которые включают инструменты для связи XPC. И я хочу проиллюстрировать работу с демоном для отправки SMS. Однако следует отметить, что эта возможность исправлена в iOS 6, но актуальна для iOS 5.0—5.1.1. Джейлбрейк, частный фреймворк и другие незаконные инструменты не требуются для его использования. Требуется только набор заголовочных файлов из каталога/usr/include/ xpc/*.

    Одним из элементов для отправки SMS в iOS является системная служба com.яблоко.chatkit, в задачи которого входит генерация, управление и отправка коротких текстовых сообщений. Для удобства управления он имеет общедоступный коммуникационный порт com.яблоко.chatkit.clientcomposeserver.xpc. С помощью подсистемы XPC можно создавать и отправлять сообщения без одобрения пользователя.

    Что ж, попробуем создать соединение.

    xpc_connection_t myConnection;
    
    dispatch_queue_t queue = dispatch_queue_create("com.apple.chatkit.clientcomposeserver.xpc", DISPATCH_QUEUE_CONCURRENT);
    
    myConnection = xpc_connection_create_mach_service("com.apple.chatkit.clientcomposeserver.xpc", queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
    

    Теперь у нас есть XPC соединение myConnection установлен на службу отправки SMS. Однако конфигурация XPC предусматривает создание приостановленных соединений —для активации нужно сделать еще один шаг.

    xpc_connection_set_event_handler(myConnection, ^(xpc_object_t event){
    xpc_type_t xtype = xpc_get_type(event);
    if(XPC_TYPE_ERROR == xtype)
    {
    NSLog(@"XPC sandbox connection error: %s\n", xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION));
    }
    // Always set an event handler. More on this later.
    
    NSLog(@"Received a message event!");
    
    });
    
    xpc_connection_resume(myConnection);
    

    Соединение активировано. Прямо в этот момент iOS 6 отобразит в телефонном журнале сообщение о том, что этот тип связи запрещен. Теперь нам нужно создать словарь, похожий на xpc_dictionary с данными, необходимыми для отправки сообщения.

    NSArray *recipient = [NSArray arrayWithObjects:@"+7 (90*) 000-00-00", nil];
    
    NSData *ser_rec = [NSPropertyListSerialization dataWithPropertyList:recipient format:200 options:0 error:NULL];
    
    xpc_object_t mydict = xpc_dictionary_create(0, 0, 0);
    xpc_dictionary_set_int64(mydict, "message-type", 0);
    xpc_dictionary_set_data(mydict, "recipients", [ser_rec bytes], [ser_rec length]);
    xpc_dictionary_set_string(mydict, "text", "hello from your application!");
    

    Немного осталось: отправьте сообщение на порт XPC и убедитесь, что оно доставлено.

    xpc_connection_send_message(myConnection, mydict);
    xpc_connection_send_barrier(myConnection, ^{
    NSLog(@"The message has been successfully delivered");
    });
    

    Вот и все. SMS отправлено.

  9. Добавьте MessageUI.Framework и использовать следующий код

    #import <MessageUI/MessageUI.h> 
    

    И:

    if ([MFMessageComposeViewController canSendText]) {
      MFMessageComposeViewController *messageComposer =
      [[MFMessageComposeViewController alloc] init];
      NSString *message = @"Your Message here";
      [messageComposer setBody:message];
      messageComposer.messageComposeDelegate = self;
      [self presentViewController:messageComposer animated:YES completion:nil];
    }
    

    и метод делегата —

    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller
                 didFinishWithResult:(MessageComposeResult)result {
          [self dismissViewControllerAnimated:YES completion:nil];
     }
    
  10. - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
    {
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        UIImage *ui =resultimg.image;
        pasteboard.image = ui;
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
    }
    
  11. Вы можете использовать этот подход:

    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:MobileNumber"]]
    

    iOS автоматически перейдет с вашего приложения на страницу создания сообщений приложения messages. Поскольку схема URL-адреса начинается с sms:, этот тип определяется как тип, который распознается приложением messages и запускает его.

  12. Выполните следующие действия

    1 .Добавить MessageUI.Frameworkв проектВведите описание изображения здесь

    2 . Импорт #import <MessageUI/MessageUI.h>в .H файл.

    3 . Скопируйте этот код для отправки сообщения

     if ([MFMessageComposeViewController canSendText]) {
        MFMessageComposeViewController *messageComposer =
        [[MFMessageComposeViewController alloc] init];
        NSString *message = @"Message!!!";
        [messageComposer setBody:message];
        messageComposer.messageComposeDelegate = self;
        [self presentViewController:messageComposer animated:YES completion:nil];
    }
    

    4 . Реализуйте delegateметод, если хотите.

    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
    
    
       ///your stuff here 
    
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    Беги и беги!

  13. // метод вызова с именем и номером.

    -(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];
     }
    }
    
  14. Необходимо использовать MFMessageComposeViewController, если вы хотите показать создание и отправку сообщения в своем собственном приложении.

    В противном случае можно использовать метод sharedApplication.

  15. Вот Swift версия кода для отправки SMS в iOS. Обратите внимание, что он работает только в реальных устройствах. Код протестирован в iOS 7+. Подробнее вы можете прочитать здесь .

    1) Создайте новый класс, который наследует MFMessageComposeViewControllerDelegate и NSObject:

    import Foundation
    import MessageUI
    
    class MessageComposer: NSObject, MFMessageComposeViewControllerDelegate {
        // A wrapper function to indicate whether or not a text message can be sent from the user's device
        func canSendText() -> Bool {
            return MFMessageComposeViewController.canSendText()
        }
    
        // Configures and returns a MFMessageComposeViewController instance
        func configuredMessageComposeViewController(textMessageRecipients:[String] ,textBody body:String) -> MFMessageComposeViewController {
            let messageComposeVC = MFMessageComposeViewController()
            messageComposeVC.messageComposeDelegate = self  //  Make sure to set this property to self, so that the controller can be dismissed!
            messageComposeVC.recipients = textMessageRecipients
            messageComposeVC.body = body
            return messageComposeVC
        }
    
        // MFMessageComposeViewControllerDelegate callback - dismisses the view controller when the user is finished with it
        func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {
            controller.dismissViewControllerAnimated(true, completion: nil)
            }
    }
    

    2) Как использовать этот класс:

    func openMessageComposerHelper(sender:AnyObject ,withIndexPath indexPath: NSIndexPath) {
        var recipients = [String]()
    
        //modify your recipients here
    
        if (messageComposer.canSendText()) {
            println("can send text")
            // Obtain a configured MFMessageComposeViewController
            let body = Utility.createInvitationMessageText()
    
            let messageComposeVC = messageComposer.configuredMessageComposeViewController(recipients, textBody: body)
    
            // Present the configured MFMessageComposeViewController instance
            // Note that the dismissal of the VC will be handled by the messageComposer instance,
            // since it implements the appropriate delegate call-back
            presentViewController(messageComposeVC, animated: true, completion: nil)
        } else {
            // Let the user know if his/her device isn't able to send text messages
            self.displayAlerViewWithTitle("Cannot Send Text Message", andMessage: "Your device is not able to send text messages.")
        }
    }
    
  16. Вы можете представить MFMessageComposeViewController, который может отправлять SMS, но с приглашением пользователя (он нажимает кнопку Отправить). Это невозможно сделать без разрешения пользователя. На iOS 11 вы можете сделать расширение , которое может быть похоже на фильтр для входящих сообщений, сообщая iOS или ее спам или нет. Ничего больше с SMS не может быть сделано