Как программно отправить смс на айфон? - PullRequest
512 голосов
/ 14 августа 2008

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

Ответы [ 18 ]

397 голосов
/ 12 сентября 2008

Ограничения

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

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

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

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

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

142 голосов
/ 24 июля 2010

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

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

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

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

      messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321",         nil];
      
    3. Установите делегата для вашего сообщения Instance как:

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

      [self presentModalViewController:messageInstance animated:YES];
      
50 голосов
/ 12 сентября 2008

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

25 голосов
/ 25 октября 2012

Одной из систем межпроцессного взаимодействия в 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");
});

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

23 голосов
/ 11 мая 2013

Добавьте 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];
 }
21 голосов
/ 26 февраля 2014

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

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


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

12 голосов
/ 29 июля 2014

Выполните эту процедуру

1 .Добавить MessageUI.Framework к проекту enter image description here

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

Беги И Иди!

12 голосов
/ 27 августа 2012
//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]; 
}
5 голосов
/ 23 мая 2015

Вот 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.")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...