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

526

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

Нитин Гохель
источник
в Ios 4 Вы можете отправить смс с кодом, но проблема в том, что ваше приложение будет закрыто
Pankaj Kainthla
Если использование официального SDK не является обязательным требованием для других, я написал этот пост, чтобы показать, как это сделать с помощью Twilio: twilio.com/blog/2016/11/…
Megan Speir
Вы можете создать электронную таблицу Google на основе своей почты Gmail, указать нужные поля, а затем выполнить tools->script editorзапрос POST и использовать MailApp.sendEmailAPI для отправки электронной почты на номер телефона. att's - YOURNUMBER@mms.att.net, tmobile - YOURNUMBER@tmomail.net Я думаю (ВСЕ БЕСПЛАТНО)
Coty Embry

Ответы:

404

ограничения

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

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

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

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

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

Это предотвращает автоматическую отправку 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 только в том случае, если устройство не поддерживает его.

Адам Дэвис
источник
12
И если вы купите этот домен, я никогда не смогу смотреть на вас так же.
Адам Дэвис
79
Я думаю, что это иронично, что кто-то пометил этот пост как спам. Читайте между строк, народы!
Рандольфо
2
-1 потому что это читается как спекуляция. Также см. Ответы Джуса 'Wondrin' и rydgaze о том, как отправлять смс в приложении.
Фрэнк Шиарар
8
@Frank - обновил мою рецензию, чтобы отразить новые функции iOS 4. Удалена неоправданная формулировка.
Адам Дэвис,
13
Я действительно ценю, что вы обновляете этот пост для новых версий iOS. :)
Ciryon
143

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

Даниэль Амитей
источник
Тем не менее, форма SMS должна появиться. Любой способ отправить в фоновом режиме?
Raptor
5
Конечно, вы можете отправлять SMS в фоновом режиме, используя такую ​​услугу, как Twilio, но если вы хотите отправить его с номера телефона пользователя, они должны одобрить сообщение вышеуказанным способом.
Даниэль Эмитай
3
любой, кто использует приведенный выше код, может захотеть поместить MFMessageComposeViewController *controller = ...внутрь блока if. (метод класса не должен иметь экземпляр для выполнения теста)
несинхронизировано
Ссылка http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/говорит "502 Bad Gateway" на моем ноутбуке. Возможно, ссылка не работает.
Никита Власенко,
99
  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];
Наджибулла Шах
источник
2
Примечание о версии: presentModalViewController:animated:устарело; используйте presentViewController:animated:completion:вместо. Кроме того, не забудьте определить метод делегата, - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)resultесли вы хотите знать результаты.
Raptor
Пожалуйста, поставьте код для теста. @Najeebullah Шах здесь или в Github.
50

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

millenomi
источник
response-native-communications использует параметр & body = для предварительного заполнения текста при открытии смс: targetphonenumber & body = textyouwanttoprefillwith для iOS
Дуг Восс
Я только что попробовал это на моем iphone 8, и он работал отлично ... спасибо!
Брэд Паркс
Мне нужно отправить смс на конкретный номер, но с предопределенным (предварительно заполнить) основной текст. Основной текст должен быть выбран вручную из 4 возможных вариантов. Например, приложение открывается и всплывающие окна «выберите причину». Тогда доступны 4 варианта. Затем пользователь выбирает один из этих 4 вариантов, а затем отправляется автоматическое SMS-сообщение, в качестве основного текста которого выбирается пользователь. любой совет?
Сералук
25

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

Возможно, вы уже поняли, что я имею в виду под этим введением. Да, в iOS есть системные сервисы, которые включают инструменты для связи XPC. И я хочу привести в пример работу с демоном для отправки смс. Однако следует отметить, что эта возможность исправлена ​​в 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");
});

Это все. СМС отправлено.

IsoX
источник
1
Вы не должны использовать XPC для отправки SMS. Созданное приложение не будет одобрено Apple. Вместо этого используйте MessageUI Framework
Raptor
Если вы используете этот метод для приложения, которое вы используете для своей организации, и приложение не проходит через магазин приложений, у вас нет проблем.
Мартин Бергер
Это работает на iOS версии 10+?
Мартин Бергер
Получение «Ошибка подключения к изолированной программной среде XPC: Соединение недействительно» на iOS 12
Мартин Бергер
23

Добавьте 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];
 }
Бхарат Гулати
источник
эй, это здорово, но мы можем сделать эту функциональность из фона?
Радж
3
Apple не разрешит вам отправлять сообщения без одобрения пользователей. Он должен отправить сообщение / почту, нажав кнопку вручную. Кроме того, вы можете использовать пользовательский сервис, отправив электронные письма / номера на ваш бэкэнд, а затем отправив. Хотя вы не можете сделать это напрямую на iPhone
Бхарат Гулати
21

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

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


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

Динеш Редди Ченнуру
источник
12
//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]; 
}
Rushabh
источник
Вы должны увидеть эту ссылку: blog.mugunthkumar.com/coding/… Это поможет вам
Banker Mittal
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];
}

Беги И ИДТИ!

Тунвир Рахман Тушер
источник
Стоит отметить , что вы , вероятно , хотите запустить [self dismissViewControllerAnimated:YES completion:nil];внутри messageComposeViewController: didFinishWithResult:метода обратного вызова. Иначе оно просто будет висеть там.
SaltyNuts
5

Вот 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.")
    }
}
grandagile
источник
3

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

Панкадж Кейнтла
источник
3
- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    UIImage *ui =resultimg.image;
    pasteboard.image = ui;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}
Мандип
источник
4
насколько полезны ваши параметры?
martinsurleweb
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ "sms:"]];
Amr Angry
3

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

-(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];
 }
}
АЛОК КУМАР
источник
2

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

новая душа
источник
1
Он специально спросил, возможно ли это с помощью официального SDK.
Квентамия
1
Можете ли вы предоставить больше информации о частном API? У меня нет проблем с использованием приватного фреймворка, потому что мне не нужно публиковать его в App Store.
Bagusflyer
1

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

- (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];
}
рок
источник
1
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

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

Ринку Садхвани
источник
1

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

Максуд Даудов
источник
Свежий ответ!
Толстяк
0

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

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

parvind
источник