Вопрос:

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

ios objective-c cocoa-touch sms

278701 просмотра

18 ответа

0 Репутация автора

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

Автор: Marco Источник Размещён: 14.08.2008 09:51

Ответы (18)


50 плюса

5966 Репутация автора

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

Автор: millenomi Размещён: 12.09.2008 02:41

392 плюса

68385 Репутация автора

ограничения

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

Автор: Adam Davis Размещён: 12.09.2008 03:00

2 плюса

259 Репутация автора

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

Автор: new soul Размещён: 29.01.2010 02:15

139 плюса

6559 Репутация автора

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

Автор: Daniel Amitay Размещён: 24.07.2010 07:09

3 плюса

1274 Репутация автора

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

Автор: Pankaj Kainthla Размещён: 10.09.2010 08:32

98 плюса

3509 Репутация автора

  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];
      
Автор: Najeebullah Shah Размещён: 07.12.2011 04:50

1 плюс

336 Репутация автора

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

- (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];
}
Автор: Rock Размещён: 18.05.2012 05:47

12 плюса

3365 Репутация автора

//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 Размещён: 27.08.2012 12:33

25 плюса

469 Репутация автора

Одной из систем межпроцессного взаимодействия в 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 Размещён: 25.10.2012 07:17

23 плюса

750 Репутация автора

Добавьте 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];
 }
Автор: Bharat Gulati Размещён: 10.05.2013 09:38

3 плюса

333 Репутация автора

- (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    UIImage *ui =resultimg.image;
    pasteboard.image = ui;
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]];
}
Автор: mandeep Размещён: 09.09.2013 11:17

20 плюса

456 Репутация автора

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

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


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

Автор: Dinesh Reddy Chennuru Размещён: 26.02.2014 07:13

12 плюса

4144 Репутация автора

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

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

Беги И ИДТИ!

Автор: Tunvir Rahman Tusher Размещён: 29.07.2014 10:32

1 плюс

86 Репутация автора

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

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

Автор: Rinku Sadhwani Размещён: 04.08.2014 12:36

3 плюса

715 Репутация автора

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

-(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];
 }
}
Автор: ALOK KUMAR Размещён: 10.03.2015 12:48

0 плюса

629 Репутация автора

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

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

Автор: parvind Размещён: 30.03.2015 06:31

5 плюса

594 Репутация автора

Вот 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 Размещён: 23.05.2015 07:40

1 плюс

490 Репутация автора

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

Автор: Максуд Даудов Размещён: 26.11.2017 01:33
Вопросы из категории :
32x32