Как программно отправить смс на айфон?

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


person Community    schedule 14.08.2008    source источник
comment
в iOS 4 вы можете отправить sms с кодом, но проблема в том, что ваше приложение будет закрыто   -  person Pankaj Kainthla    schedule 02.02.2011
comment
Если использование официального SDK не является обязательным для других, я написал этот пост, чтобы показать, как это сделать с помощью Twilio: twilio.com/blog/2016/11/   -  person Megan Speir    schedule 10.02.2017
comment
вы можете создать электронную таблицу Google на своем почтовом ящике Gmail, ввести нужные поля, затем выполнить tools->script editor и в запросе POST использовать MailApp.sendEmail api для отправки электронной почты на номер телефона. att - ВАШ НОМЕР@mms.att.net, tmobile - ВАШ НОМЕР@tmomail.net Я думаю (ВСЕ БЕСПЛАТНО)   -  person Coty Embry    schedule 20.05.2017


Ответы (18)


Ограничения

Если бы вы могли отправлять SMS в программе на iPhone, вы могли бы писать игры, которые спамят людей в фоновом режиме. Я уверен, что вы действительно хотите получать спам от своих друзей: «Попробуйте эту новую игру! Она потрясает моих боксеров, и ваши тоже! Roxxersboxxers.com !!!! Если вы зарегистрируетесь сейчас, вы получите 3200 РБ. точки!!"

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

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

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

Однако iOS 4 теперь предоставляет viewController, который вы можете импортировать в свое приложение. Вы предварительно заполняете поля SMS, затем пользователь может инициировать отправку SMS в контроллере. В отличие от формата URL-адреса «SMS: ...», это позволяет вашему приложению оставаться открытым и позволяет заполнять поля 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 только в том случае, если устройство ее не поддерживает.

person Adam Davis    schedule 12.09.2008
comment
И если вы купите этот домен, я больше никогда не смогу смотреть на вас так же. - person Adam Davis; 12.09.2008
comment
Я думаю, это иронично, что кто-то пометил этот пост как спам. Читайте между строк, народы! - person Randolpho; 18.09.2009
comment
-1 потому что это спекуляция. Также см. Ответы Джуса 'Wondrin' и rydgaze о том, как отправлять SMS-сообщения из приложения. - person Frank Shearar; 27.09.2010
comment
@Frank - Обновлена ​​моя запись, чтобы отразить новые функции iOS 4. Удалены бессвязные формулировки. - person Adam Davis; 09.10.2010
comment
Я знаю, что это очень поздно, но можно ли отправить сообщение с фотографией в качестве вложения? - person edhedges; 06.08.2012
comment
К этому можно добавить, что в iOS5 Apple не отправляет SMS, как предполагает Адам, они используют iMessage с устройствами, которые по своей сути не являются телефоном. - person Joakim Engstrom; 14.01.2013
comment
@edhedges, у вас должен быть новый вопрос, а не комментарий. - person Kirk Woll; 24.08.2013
comment
Я очень ценю, что вы обновляете этот пост для новых версий iOS. :) - person Ciryon; 14.03.2016
comment
Мне нужно отправить sms на определенный номер, но с предопределенным (предварительно заполненным) основным текстом. Основной текст должен быть выбран вручную из 4 возможных вариантов. Например. Приложение откроется и во всплывающих окнах выберите причину. Тогда доступны 4 варианта. Затем пользователь выбирает один из этих 4 вариантов, а затем автоматически отправляется SMS, содержащее в качестве основного текста выбор пользователя. Есть подсказка? - person seralouk; 28.03.2020

Вот руководство, которое сделает именно то, что вы ищете: 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

person Daniel Amitay    schedule 24.07.2010
comment
Тем не менее, форма для SMS должна появиться. Любой способ отправить в фоновом режиме? - person Raptor; 02.08.2012
comment
Вы, безусловно, можете отправлять SMS в фоновом режиме с помощью такой службы, как Twilio, но если вы хотите отправить его с номера телефона пользователя, они должны утвердить сообщение указанным выше способом. - person Daniel Amitay; 02.08.2012
comment
любой, кто использует приведенный выше код, может пожелать рассмотреть возможность помещения MFMessageComposeViewController *controller = ... внутри блока if. (метод класса не требует наличия экземпляра для выполнения теста) - person unsynchronized; 13.12.2013
comment
Ссылка http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/ говорит о 502 Bad Gateway на моем ноутбуке. Может ссылка битая. - person Nikita Vlasenko; 28.11.2015

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

    1. Сначала установите тело для вашего messageInstance как:

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

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

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

      [self presentModalViewController:messageInstance animated:YES];
      
person Najeebullah Shah    schedule 07.12.2011
comment
Примечание к версии: presentModalViewController:animated: устарело; используйте вместо этого presentViewController:animated:completion:. Кроме того, не забудьте определить метод делегата - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result, если вы хотите знать результаты. - person Raptor; 30.10.2015
comment
Пожалуйста, поставьте код для тестирования. @Najeebullah Shah здесь или в гитхабе. - person ; 09.02.2017

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

person millenomi    schedule 12.09.2008
comment
response-native-communications использует параметр & body = для предварительного заполнения текста при открытии sms: targetphonenumber & body = textyouwanttoprefillwith для iOS. - person Doug Voss; 21.12.2017
comment
Я только что попробовал это на своем iphone 8, и он отлично сработал ... спасибо! - person Brad Parks; 22.01.2019
comment
Мне нужно отправить sms на определенный номер, но с предопределенным (предварительно заполненным) основным текстом. Основной текст должен быть выбран вручную из 4 возможных вариантов. Например. Приложение откроется и во всплывающих окнах выберите причину. Тогда доступны 4 варианта. Затем пользователь выбирает один из этих 4 вариантов, а затем автоматически отправляется SMS, содержащее в качестве основного текста выбор пользователя. любой совет? - person seralouk; 28.03.2020

Одна из систем межпроцессного взаимодействия в MacOS - XPC. Этот системный уровень был разработан для межпроцессного взаимодействия на основе передачи структур plist с помощью libSystem и launchd. По сути, это интерфейс, позволяющий управлять процессами через обмен такими структурами, как словари. В силу наследственности iOS 5 также обладает этим механизмом.

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

Одним из элементов для отправки SMS в iOS является системный сервис com.apple.chatkit, в задачи которого входит генерация, управление и отправка коротких текстовых сообщений. Для простоты управления он имеет общедоступный коммуникационный порт com.apple.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 отправлено.

person isox    schedule 25.10.2012
comment
Вы не должны использовать XPC для отправки SMS. Созданное приложение не будет одобрено Apple. Вместо этого используйте MessageUI Framework - person Raptor; 30.10.2015
comment
Если вы используете эту технику для приложения, которое используете для своей организации, и приложение не проходит через магазин приложений, вам не о чем беспокоиться. - person Martin Berger; 10.06.2019
comment
Ошибка подключения к песочнице XPC: соединение недействительно на iOS 12 - person Martin Berger; 10.07.2019

Добавьте 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];
 }
person Bharat Gulati    schedule 10.05.2013
comment
привет, это здорово, но можем ли мы сделать эту функцию из фона? - person Raj; 05.04.2014
comment
Apple не позволит вам отправлять сообщения без одобрения пользователей. Он должен отправить сообщение / почту, вручную нажав кнопку. В качестве альтернативы вы можете использовать настраиваемую службу, отправив электронные письма / номера на свой сервер, а затем отправив. Хотя вы не можете сделать это прямо на iPhone - person Bharat Gulati; 21.05.2014

Вы можете использовать такой подход:

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


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

person Dinesh Reddy Chennuru    schedule 26.02.2014

Следуйте этим процедурам

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];
}

Беги и вперед!

person Tunvir Rahman Tusher    schedule 29.07.2014
comment
стоит упомянуть, что вы, вероятно, захотите запустить [self dismissViewControllerAnimated:YES completion:nil]; внутри messageComposeViewController: didFinishWithResult: метода обратного вызова. Иначе он просто будет там висеть. - person SaltyNuts; 16.11.2014

Вот версия кода 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.")
    }
}
person grandagile    schedule 23.05.2015

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

person Pankaj Kainthla    schedule 10.09.2010

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

-(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];
 }
}
person ALOK KUMAR    schedule 10.03.2015

Если вы хотите, вы можете использовать частный фреймворк CoreTelephony, который называется классом CTMessageCenter. Есть несколько способов отправить смс.

person new soul    schedule 29.01.2010
comment
Он специально спросил, возможно ли это с помощью официального SDK. - person Quentamia; 26.07.2011
comment
Можете ли вы предоставить дополнительную информацию о частном API? У меня нет проблем с использованием частного фреймворка, потому что мне не нужно публиковать его в App Store. - person Bagusflyer; 03.10.2014

Использовать этот:

- (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];
}
person Rock    schedule 18.05.2012

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

Это был бы лучший и короткий способ сделать это.

person Rinku Sadhwani    schedule 04.08.2014

Вы можете представить MFMessageComposeViewController, который может отправлять SMS, но с подсказкой пользователя (он нажимает кнопку отправки). Это невозможно сделать без разрешения пользователя. В iOS 11 вы можете сделать расширение, которое может быть похоже на фильтр для входящих сообщений, сообщая iOS, что это спам или нет. Больше ничего с СМС сделать нельзя

person Максуд Даудов    schedule 26.11.2017
comment
Свежий ответ! - person Fattie; 10.03.2018

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

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

person parvind    schedule 30.03.2015

person    schedule
comment
вы должны увидеть эту ссылку: blog.mugunthkumar .com / coding / поможет вам - person Banker Mittal; 04.10.2012

person    schedule
comment
насколько полезны ваши параметры? - person martinsurleweb; 06.03.2015
comment
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @sms:]]; - person Amr Angry; 16.07.2017