如何以编程方式在iPhone上发送短信?


526

是否有人知道有可能以及如何通过官方SDK / Cocoa Touch 通过编程方式从发送SMSiPhone呢?


在Ios 4中,您可以发送带有代码的短信,但问题是您的应用程序将被关闭
Pankaj Kainthla 2011年

如果使用官方的SDK是不是为别人的要求,我写这篇文章来说明如何做到这一点使用Twilio:twilio.com/blog/2016/11/...
梅根Speir

您可以使用gmail创建Google电子表格,设置所需字段,然后tools->script editor在POST请求中使用MailApp.sendEmailapi将电子邮件发送到电话号码。我想(全部免费)是att是YOURNUMBER @ mms.att.net,tmobile是YOURNUMBER@tmomail.net
Coty Embry

Answers:


404

限制条件

如果您可以在iPhone上的程序中发送短信,则可以编写在后台向用户发送垃圾邮件的游戏。我敢肯定,您真的想收到您的朋友的垃圾邮件,“尝试这个新游戏!它使我的boxxers陷入僵局,您的也将成为垃圾邮件!roxxersboxxers.com !!!!如果立即注册,您将获得3,200 RB点!!”

Apple对自动(甚至部分自动)的SMS和拨号操作有限制。(想象一下,如果游戏改为在一天的特定时间拨打911)

最好的选择是在Internet上设置使用在线SMS发送服务的中间服务器,如果需要完全自动化,则通过该路由发送SMS。(即,iPhone上的程序将UDP数据包发送到服务器,服务器将发送真实的SMS)

iOS 4更新

但是,iOS 4现在提供了viewController可以导入到您的应用程序中的功能。您预先填充了SMS字段,然后用户可以在控制器内启动SMS发送。不同于使用“短信:......” URL格式,这使得你的应用程序保持开放,并允许您来填充既身体各个领域。您甚至可以指定多个收件人。

这样可以防止应用程序在用户未明确知道的情况下发送自动SMS。您仍然无法从iPhone本身发送全自动SMS,它需要一些用户交互。但这至少允许您填充所有内容,并避免关闭应用程序。

MFMessageComposeViewController类是有据可查的,和教程显示它是多么容易实现。

iOS 5更新

iOS 5包括用于iPod touch和iPad设备的消息传递,因此尽管我自己尚未对此进行测试,但可能是所有iOS设备都将能够通过MFMessageComposeViewController发送SMS。如果是这种情况,则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设备中的任何一个都可以访问Internet,只要它们具有Internet访问权限,因此对于许多应用程序来说,它仍然是更好的解决方案。或者,同时使用两者,并且仅在设备不支持该服务时才退回到在线SMS服务。


12
如果您购买该域名,我将永远无法再以同样的方式看待您。
亚当·戴维斯 Adam Davis)

79
我认为有人将此帖子标记为垃圾邮件是具有讽刺意味的。阅读这句话,人民!
伦道夫

2
-1,因为这被视为推测。另外,请参阅Jus'Wondrin和rydgaze关于如何发送应用内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
您当然可以使用Twilio之类的服务在后台发送SMS,但是如果要从用户的电话号码发送SMS,则他们必须通过上述方法批准该消息。
Daniel Amitay

3
使用以上代码的任何人都可能希望考虑将MFMessageComposeViewController *controller = ...if块放入其中。(类方法无需具有实例即可进行测试)
2013年

该链接http://blog.mugunthkumar.com/coding/iphone-tutorial-how-to-send-in-app-sms/在我的笔记本电脑上显示“ 502 Bad Gateway”。也许链接断开了。
Nikita Vlasenko

99
  1. 您必须将MessageUI.framework添加到您的Xcode项目中
  2. #import <MessageUI/MessageUI.h>在您的头文件中包含
  3. 将这些代表添加到您的头文件中MFMessageComposeViewControllerDelegateUINavigationControllerDelegate
  4. 在您的IBAction方法中声明MFMessageComposeViewControllersay的实例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如果您想知道结果,请记住定义委托方法。
猛禽

请输入代码进行测试。@Najeebullah Shah在这里或在github中。

50

您可以使用sms:[target phone number]URL打开SMS应用程序,但是没有关于如何用文本预填充SMS正文的指示。


当打开短信时,react-native-communications使用&body =参数预填充文本:iOS的目标电话号码&body = textyouwanttoprefillwith
Doug Voss

我只是在iPhone 8上尝试过,效果很好...谢谢!
布拉德·帕克斯

我需要发送短信到特定号码,但要带有预定义的(预填充)正文。正文应该是从4种可能的选项中手动选择的。例如,应用程序打开并弹出“选择原因”。然后有4个选项可用。接下来,用户选择这四个选项之一,然后发送一条自动SMS,其中将用户的选择作为正文。有小费吗?
seralouk

25

XPC是MacOS中进程间通信的系统之一。此系统层已开发出来,用于基于使用libSystem的plist结构的传输进行进程间通信,并已启动。实际上,它是一个界面,允许通过交换字典等结构来管理流程。由于遗传原因,iOS 5也具有此机制。

您可能已经了解了此介绍的意思。是的,iOS中有一些系统服务,其中包括用于XPC通信的工具。我想用一个用于发送SMS的守护程序来举例说明该工作。但是,应该指出的是,此功能在iOS 6中已修复,但与iOS 5.0-5.1.1有关。无需使用越狱,专用框架和其他非法工具即可对其进行开发。仅需要目录/ usr / include / xpc / *中的头文件集。

在iOS中发送SMS的元素之一是系统服务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发送短信。产生的应用程序将不会被苹果公司认可。改用MessageUI Framework
Raptor

如果您将这种技术用于组织的应用程序,并且该应用程序未通过应用程序商店,则无需担心。
Martin Berger

这在iOS版本10+上有效吗?
Martin Berger

在iOS 12上获取“ XPC沙箱连接错误:连接无效”
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];
 }

嘿,太好了,但是我们可以从后台执行此功能吗?
拉吉2014年

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

您应该会看到此链接: blog.mugunthkumar.com/coding/… 它将为您带来帮助
银行家米塔尔(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 2014年

5

这是在iOS中发送短信的Swift版本代码。请注意,它仅适用于真实设备。在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
- (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称为CTMessageCenterclass 的私有框架。有几种发送短信的方法。


1
他特别询问使用官方SDK是否可行。
昆塔米亚州2011年

1
您能否提供有关私有API的更多信息?我使用私有框架没有问题,因为我不需要将其发布到App Store。
Bagusflyer 2014年

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

您可以显示MFMessageComposeViewController,它可以发送SMS,但带有用户提示(他点击发送按钮)。未经用户许可,无法执行此操作。在iOS 11上,您可以进行扩展,就像对传入消息进行过滤一样,告诉iOS是否为垃圾邮件。短信无能为力


新鲜的答案!
Fattie

0

您需要使用MFMessageComposeViewController如果要在自己的应用程序中显示创建和发送消息,则。

否则,您可以使用sharedApplication方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.