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

497

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

  • 0
    в Ios 4 Вы можете отправить смс с кодом, но проблема в том, что ваше приложение будет закрыто
  • 0
    Если использование официального SDK не является обязательным требованием для других, я написал этот пост, чтобы показать, как это сделать с помощью Twilio: twilio.com/blog/2016/11/…
Показать ещё 1 комментарий
Теги:
cocoa-touch
sms

19 ответов

365

ограничения

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

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

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

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

Однако iOS 4 теперь предоставляет диспетчер просмотра, который вы можете импортировать в свое приложение. Вы заполняете поля SMS, затем пользователь может инициировать отправку SMS в контроллере. В отличие от формата url "sms:...", это позволяет вашему приложению оставаться открытым и позволяет заполнять поля "Кому" и "Тело". Вы даже можете указать несколько получателей.

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

  • 11
    И если вы купите этот домен, я никогда не смогу смотреть на вас так же.
  • 77
    Я думаю, что это иронично, что кто-то пометил этот пост как спам. Читайте между строк, народы!
Показать ещё 6 комментариев
130

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

  • 0
    Тем не менее, форма SMS должна появиться. Любой способ отправить в фоновом режиме?
  • 4
    Конечно, вы можете отправлять SMS в фоновом режиме, используя такую услугу, как Twilio, но если вы хотите отправить его с номера телефона пользователя, они должны одобрить сообщение вышеуказанным способом.
Показать ещё 2 комментария
102
  • Вы должны добавить MessageUI.framework в проект Xcode
  • Включить #import <MessageUI/MessageUI.h> в файл заголовка
  • Добавьте этих делегатов в заголовочный файл MFMessageComposeViewControllerDelegate и UINavigationControllerDelegate
  • В вашем методе IBAction объявите экземпляр MFMessageComposeViewController say messageInstance
  • Чтобы проверить, может ли ваше устройство отправлять текстовое использование [MFMessageComposeViewController canSendText] в состоянии if, оно вернет Yes/No
  • В условии if выполните следующие действия:

    • Сначала установите тело для messageInstance как:

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

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

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

      [self presentModalViewController:messageInstance animated:YES];
      
  • 2
    Примечание к версии: presentModalViewController:animated: устарело; используйте presentViewController:animated:completion: вместо. Также не забудьте определить метод делегата - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result если вы хотите узнать результаты.
  • 0
    Пожалуйста, поставьте код для теста. @Najeebullah Шах здесь или в Github.
48

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

  • 0
    act-native-communications использует параметр & body =, чтобы предварительно заполнить текст при открытии смс: targetphonenumber & body = textyouwanttoprefillwith для iOS
  • 0
    Я только что попробовал это на моем iphone 8, и он работал отлично ... спасибо!
26

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

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

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

  • 1
    Вы не должны использовать XPC для отправки SMS. Созданное приложение не будет одобрено Apple. Вместо этого используйте MessageUI Framework
20

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

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

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


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

12

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

1.Add MessageUI.Framework для проекта Изображение 5321

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

Run And GO!

  • 0
    Стоит отметить, что вы, вероятно, захотите запустить [self dismissViewControllerAnimated:YES completion:nil]; внутри messageComposeViewController: didFinishWithResult: метод обратного вызова. Иначе оно просто будет висеть там.
11
//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

Вот версия 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 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.")
    }
}
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];
 }
}
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
    насколько полезны ваши параметры?
  • 0
    [[UIApplication sharedApplication] openURL: [NSURL URLWithString: @ "sms:"]];
3

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

2

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

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

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

  • 0
    Свежий ответ!
1
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms:number"]] 

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

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

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

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

-4

Много ответов, но если вам действительно нужно SmS автоматически и не использовать композитора, вы можете просто вызвать twilio api.

И вот список с 50 + api для отправки смс в основном из любого приложения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню