如何在iPhone上的程序发送短信?

问题描述 投票:513回答:18

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

ios objective-c cocoa-touch sms
18个回答
399
投票

Restrictions

如果你可以发送在iPhone程序中的短信,你就可以写游戏,垃圾邮件的人的背景。我敢肯定,你真的想从垃圾邮件您的朋友,“试用这款新游戏!它roxxers我boxxers,和你将太!roxxersboxxers.com !!!!如果你现在注册,你会得到3200 RB点!”

苹果拥有自动化(甚至部分自动)短信和拨号操作的限制。 (试想一下,如果游戏,而不是在一天中的特定时间拨打911)

最好的办法是建立一个中间服务器,它使用一个网上短信发送服务,并通过该路由发送短信,如果你需要完整的自动化在互联网上。 (即你的iPhone上的程序发送一个UDP包,您的服务器,这将真正SMS)

iOS 4 Update

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

这可防止应用程序发送短信自动未经用户明确地意识到这一点。你仍然不能从iPhone本身发送完全自动化的短信,它需要一些用户交互。但是,这至少可以让你来填充的一切,并避免关闭应用程序。

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

iOS 5 Update

iOS 5的包括iPod touch和iPad设备的消息,因此,虽然我还没有测试此我自己,它可能是所有iOS设备将能够通过MFMessageComposeViewController发送短信。如果是这样的话,那么苹果正在运行代表不具有蜂窝调制解调器的设备发送消息的SMS服务器。

iOS 6 Update

没有改变这一类。

iOS 7 Update

现在,您可以检查是否正在使用的消息,媒体将接受一个主题或附件,以及什么样的附件就会接受。您可以编辑主题和添加附件的消息,该媒体允许它。

iOS 8 Update

没有改变这一类。

iOS 9 Update

没有改变这一类。

iOS 10 Update

没有改变这一类。

iOS 11 Update

No significant changes to this class

Limitations to this class

请记住,这不是没有iOS 4的手机上运行,​​并在iPod touch或iPad同样采用此之前,它不会工作,除非,也许,的iOS 5下必须要么检测设备和iOS限制控制器,或风险限制您的应用程序最近升级3G,3GS,4个iPhone手机。

然而,发送短信的中间服务器将允许任何和所有的iOS设备,只要他们上网发送短信,所以它可能仍然是许多应用的更好的解决方案。或者,同时使用,并且只回落到一个网上短信服务时,该设备不支持它。


5
投票

这里是斯威夫特版本的代码中的iOS发送短信。请注意的是,它只能在实际设备。代码中的iOS 7+测试。你可以阅读更多here

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的一类,它支持从您的应用程序发送带有身体和收件人的邮件。它的工作原理相同,发送邮件。你可以在这里找到的文档:qazxsw POI


3
投票

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

}

//用于发送消息的方法

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

2
投票

如果你愿意,你可以使用私人框架- (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]; } } 呼吁CoreTelephony类。有几个方法来发送短信。


1
投票

用这个:

CTMessageCenter

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,可以发送短信,但用户提示(他轻拍发送按钮)。没有办法做到这一点,而无需用户的权限。在iOS上11,你可以扩展,可以像过滤传入的消息,告诉的iOS无论是它的垃圾邮件。没有更多的短信不能做


0
投票

你需要的,如果你想显示创建和你自己的应用程序将消息发送到使用MFMessageComposeViewController。

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


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


99
投票
  1. 您必须将MessageUI.framework添加到您的Xcode项目
  2. 包括在你的头文件的#import <MessageUI/MessageUI.h>
  3. 这些委托添加到您的头文件MFMessageComposeViewControllerDelegateUINavigationControllerDelegate
  4. 在您的IBAction方法声明实例的MFMessageComposeViewControllermessageInstance
  5. 要检查您的设备是否可以在发送文本使用[MFMessageComposeViewController canSendText]如果条件下,它会返回是/否
  6. if条件做这些: 首先设置机构的messageInstance为: messageInstance.body = @"Hello from Shah"; 然后决定该消息的收件人: messageInstance.recipients = [NSArray arrayWithObjects:@"12345678", @"87654321", nil]; 设置一个委托你作为messageInstance: messageInstance.messageComposeDelegate = self; 在最后一行做到这一点: [self presentModalViewController:messageInstance animated:YES];

50
投票

您可以使用sms:[target phone number] URL打开SMS应用,但对如何预填短信体文本没有迹象。


25
投票

一个进程间通信的中的MacOS的系统之一是XPC。该系统层已被开发用于基于使用libSystem中和的launchd plist中结构的转移的进程间通信。事实上,它是经由作为字典这种结构的交换允许管理进程的接口。由于遗传,iOS 5中具备这种机制也是如此。

你可能已经明白我的这个介绍的意思。是的,有在iOS系统的服务,包括为XPC通讯工具。我要举例说明了短信发送守护工作。但是,应该提到的是,这种能力是固定在iOS 6中,但相关的iOS 5.0-5.1.1。越狱,私人框架,以及其他非法手段并不需要为它的开发利用。只需要一组从目录/ usr / include中/ XPC / *头文件。

一个短信发送的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的设置为短信发送业务。然而,XPC配置提供了用于创建-we需要采取用于激活一个步骤悬挂连接。

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");
});

就这样。短信发送。


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

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

12
投票

按照此程序

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

运行和GO!

© www.soinside.com 2019 - 2024. All rights reserved.