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

有谁知道是否有可能,以及如何以编程方式从iPhone发送短信与官方的SDK / Cocoa Touch?

限制

如果您可以在iPhone上的程序中发送短信,则可以编写在后台发送垃圾邮件的游戏。 我敢肯定,你真的想从你的朋友那里得到垃圾邮件,“试试这个新游戏吧!它是我的boxxers,你的也会成为!roxxersboxxers.com !!!!如果你现在注册,你会得到3,200RB点!”

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

最好的办法是在因特网上设置一个中间服务器,使用在线短信发送服务,如果需要完全自动化,则通过该路由发送短信。 (即,您的iPhone上的程序发送一个UDP数据包到您的服务器,发送真正的SMS)

iOS 4更新

但是,iOS 4现在提供了一个可以导入到应用程序中的视图控制器。 您预先填充SMS字段,然后用户可以启动控制器内的SMS发送。 与使用“sms:…”url格式不同的是,这可以让您的应用程序保持打开状态,并允许您填充“ to”和“ body”字段。 你甚至可以指定多个收件人。

这可以防止应用程序发送自动化的SMS,而用户不需要明确的知道它。 您仍然不能从iPhone本身发送完全自动的短信,它需要一些用户的交互。 但是,这至less可以让你填充所有内容,并避免closures应用程序。

MFMessageComposeViewController类有很好的文档logging, 教程展示了它的实现是多么容易。

iOS 5更新

iOS 5为iPod touch和iPad设备提供消息传递function,所以虽然我还没有对自己进行testing,但也可能是所有iOS设备都可以通过MFMessageComposeViewController发送短信。 如果是这种情况,那么苹果正在运行一个SMS服务器,该服务器代表没有蜂窝调制解调器的设备发送消息。

iOS 6更新

没有改变这个类。

iOS 7更新

您现在可以检查您正在使用的信息媒介是否接受主题或附件,以及接受哪种附件。 您可以编辑主题并将附件添加到媒体允许的邮件中。

iOS 8更新

没有改变这个类。

iOS 9更新

没有改变这个类。

iOS 10更新

没有改变这个类。

对这个类的限制

请记住,这不适用于没有iOS 4的手机,它不适用于iPod touch或iPad,除了iOS 5以外。您必须在使用前检测设备和iOS限制控制器或将您的应用限制到最近升级的3G,3GS和iPhone 4的风险。

但是,发送短信的中间服务器将允许任何和所有这些iOS设备发送短信,只要它们具有互联网访问权限,所以它对于许多应用程序来说仍然是更好的解决scheme。 或者,同时使用这两种设备,并且只有在设备不支持时才回退到在线SMS服务。

这里是一个教程,确实是你在找什么: 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

  1. 您必须将MessageUI.framework添加到您的Xcode项目
  2. 在头文件中包含#import <MessageUI/MessageUI.h>
  3. 将这些委托添加到您的头文件MFMessageComposeViewControllerDelegateUINavigationControllerDelegate
  4. 在你的IBAction方法中声明MFMessageComposeViewController实例,说messageInstance
  5. 要检查您的设备是否可以在if条件下使用[MFMessageComposeViewController canSendText]发送文本,它将返回Yes / No
  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]; 

您可以使用sms:[target phone number]url打开短信应用程序,但没有迹象表明如何预先填充短信正文(见苹果开发者论坛上的这篇文章 )。

XPC中的进程间通信系统之一是XPC。 这个系统层已经被开发用于基于使用libSystem和launchd的plist结构的转移的进程间通信。 事实上,它是一个接口,允许通过交换字典等结构来pipe理进程。 由于遗传,iOS 5也拥有这种机制。

你可能已经明白我的意思了。 是的,iOS中有系统服务,包括用于XPC通信的工具。 我想用一个守护进程来发送短信。 但是,应该提到的是,这个能力在iOS 6中是固定的,但是与iOS 5.0-5.1.1相关。 越狱,私人框架和其他非法工具是不需要的开发。 只需要目录/ usr / include / xpc / *中的一组头文件。

在iOS中发送短信的一个要素是系统服务com.apple.chatkit,其任务包括生成,pipe理和发送短消息。 为了便于控制,它具有公共可用的通信端口com.apple.chatkit.clientcomposeserver.xpc。 使用XPC子系统,您可以在未经用户批准的情况下生成和发送消息。

那么,让我们尝试创build一个连接。

 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设置为短信发送服务。 但是,XPCconfiguration提供了暂停连接的创build,我们需要再进一步来激活。

 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将在电话logging中显示一条消息,表明这种types的通讯是被禁止的。 现在我们需要生成一个类似于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"); }); 

就这样。 短信发送。

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

你可以使用这种方法:

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

iOS将自动从您的应用程序导航到消息应用程序的消息撰写页面。 由于URL的scheme以短信开头:这被识别为消息应用识别的types,并启动它。

按照这个程序

1.将MessageUI.Framework到项目中 在这里输入图像描述

2。 在.h文件中导入#import <MessageUI/MessageUI.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]; } 

跑开始!

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

这里是在iOS发送短信的Swift版本的代码。 请注意,它只适用于真实的设备。 代码在iOS 7+中testing。 你可以在这里阅读更多。

1)创build一个inheritanceMFMessageComposeViewControllerDelegate和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.") } } 

在iOS 4中有一个类,它支持从应用程序发送正文和配方的消息。 它和发送邮件一样。 你可以在这里find文档: 链接文本

 - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients { UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; UIImage *ui =resultimg.image; pasteboard.image = ui; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:"]]; } 

//用名称和号码调用方法

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

用这个:

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

如果你愿意,你可以使用叫做CTMessageCenter类的私有框架CoreTelephony 。 有几种方法可以发送短信。

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

这将是最好的和简短的方式来做到这一点。

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

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

很多答案,但如果你真的需要自动SmS而不使用composer php,你可以简单地调用twilio api。

这里有一个50 + api的列表,主要是从任何应用程序发送短信。