如何以编程方式在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
- 您必须将MessageUI.framework添加到您的Xcode项目
- 在头文件中包含
#import <MessageUI/MessageUI.h>
- 将这些委托添加到您的头文件
MFMessageComposeViewControllerDelegate
&UINavigationControllerDelegate
- 在你的
IBAction
方法中声明MFMessageComposeViewController
实例,说messageInstance
- 要检查您的设备是否可以在if条件下使用
[MFMessageComposeViewController canSendText]
发送文本,它将返回Yes / No -
在
if
条件下做这些:-
首先为你的
messageInstance
设置正文:messageInstance.body = @"Hello from Shah";
-
然后确定邮件的收件人为:
messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil];
-
将您的messageInstance的委托设置为:
messageInstance.messageComposeDelegate = self;
-
在最后一行这样做:
[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的列表,主要是从任何应用程序发送短信。