Як програмно надсилати SMS на iPhone?


526

Хтось знає, чи можливо, і як програматично надіслати SMS з iPhoneофіційного SDK / Cocoa Touch?


в Ios 4 Ви можете надіслати sms з кодом, але проблема в тому, що ваша заявка буде закрита
Pankaj Kainthla

Якщо використання офіційного пакета SDK не є вимогою для інших, я написав це повідомлення, щоб показати, як це зробити за допомогою Twilio
Меган Шпір

ви можете створити електронну таблицю google з своєї пошти, ввести потрібні поля, а потім виконати tools->script editorі у запиті POST використовувати MailApp.sendEmailapi для надсилання електронної пошти на номер телефону. att's YOURNUMBER@mms.att.net, tmobile's YOURNUMBER@tmomail.net Я думаю (ВСЕ БЕЗКОШТОВНО)
Coty Embry

Відповіді:


404

Обмеження

Якщо ви зможете надіслати SMS в рамках програми на iPhone, ви зможете писати ігри, які спамують людей у ​​фоновому режимі. Я впевнений, що ви дійсно хочете отримати спами від своїх друзів: "Спробуйте цю нову гру! Це розгойдує моїх боксерів, і ваше теж буде! Roxxersboxxers.com !!!! Якщо ви зареєструєтесь зараз, ви отримаєте 3200 RB бали !! "

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 айфонами.

Однак проміжний сервер, який надсилає SMS, дозволить будь-якому з цих пристроїв iOS надсилати SMS, якщо вони мають доступ до Інтернету, тож це може бути кращим рішенням для багатьох програм. Крім того, використовуйте і те і інше, і повернутися до онлайн-сервісу SMS, коли пристрій не підтримує його.


12
І якщо ви придбаєте цей домен, я більше ніколи не зможу дивитись на вас однаково.
Адам Девіс

79
Я думаю, що іронічно, що хтось позначив цей пост як спам. Читайте між рядків, народи!
Рандольфо

2
-1 тому, що це читається як спекуляція. Також дивіться відповіді Юса «Вондріна» та Ридгазе про те, як надсилати SMS-повідомлення в програмі.
Френк Ширар

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 повинна з’являтися. Будь-який спосіб відправити у фоновому режимі?
Раптор

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методі оголосіть екземпляр MFMessageComposeViewControllersaymessageInstance
  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якщо ви хочете знати результати.
Раптор

Будь ласка, поставте код для тестування. @Najeebullah Шах тут або в github.

50

Ви можете скористатися sms:[target phone number]URL-адресою, щоб відкрити програму SMS, але немає жодних вказівок щодо попереднього заповнення тексту SMS текстом.


react-native-communication використовує параметр & body = для попереднього заповнення тексту під час відкриття sms: targetphonenumber & body = textyouwanttoprefillwith для iOS
Doug Voss

Я просто спробував це на своєму iphone 8, і він спрацював чудово ... дякую!
Бред Паркс

Мені потрібно надіслати sms на певний номер, але із заздалегідь визначеним (попередньо заповненим) текстом тексту. Текст тіла Thos повинен бути ручним вибором з 4 можливих варіантів. Наприклад, додаток відкривається і спливаючі вікна "Виберіть причину". Тоді доступні 4 варіанти. Далі користувач вибирає один з цих 4 варіантів, а потім надсилається автоматичне SMS, що має в якості тексту тексту вибір користувача. будь-яка порада?
seralouk

25

Однією з систем міжпроцесорної комунікації в MacOS є XPC. Цей системний рівень був розроблений для міжпроцесорної комунікації на основі передачі лінійних структур за допомогою libSystem та запускається. Насправді це інтерфейс, який дозволяє керувати процесами за допомогою обміну такими структурами, як словники. Завдяки спадковості, 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");
});

Це все. SMS надіслано.


1
Не слід використовувати XPC для надсилання SMS. Програма, що виробляється, не буде схвалена Apple. Замість цього використовуйте MessageUI Framework
Raptor

Якщо ви використовуєте цю техніку для додатка, який ви використовуєте для своєї організації, а додаток не проходить через магазин додатків, у вас немає проблем.
Мартін Бергер

Чи працює це на версії iOS 10+?
Мартін Бергер

Отримання помилки підключення XPC в пісочниці: підключення недійсне на iOS 12
Martin Berger

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
Bharat Gulati

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

ви повинні побачити це посилання: 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.")
    }
}

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клас. Існує кілька способів відправки sms.


1
Він спеціально запитав, чи це можливо, використовуючи офіційний SDK.
Кентамія

1
Чи можете ви надати більше інформації про приватні програми? Я не маю жодних проблем використовувати приватний фреймворк, оскільки мені не потрібно публікувати його в 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 не можна зробити


Свіжа відповідь!
Fattie

0

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

В іншому випадку ви можете використовувати метод sharedApplication .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.