iOS - 短信功能的实现

发短信的功能对于一个须要渠道扩展的APP来讲,必不可少。可是,当第一次看到这个需求时,我却一脸懵逼,由于以前并无接触过,出于对未知事物的恐惧,被分配作这个任务的时候其实我是拒绝的,可是,没办法谁让我是小兵一个呢,只能硬着头皮强上了。在查阅了一番资料以后,发现这个功能作起来其实很是简单,不到十分钟就能够解决。下面咱们就来聊一下如何实现这个功能。html

首先,咱们来介绍一个最为简单的方法,只须要一行代码就能够搞定,代码以下:数组

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];
复制代码

可是,这段代码虽然简单,缺陷却也明显,这段代码属于程序外部调用,也就是跳出app程序自己,利用手机短信功能发送短信,在发送短信页面点击取消按钮时,回到的是手机短信功能页面,而不是app程序。并且,此方法也不能传入默认的短信文本,须要本身手动输入,极可能没法知足需求。因此:bash

咱们须要知道的一点是,苹果官方在发送短信功能方面有一个框架,叫作MessageUI,此框架能够解决上述一切问题,并且轻松方便容易实现,下面咱们就来介绍一下这个框架的使用:app

在吃大餐以前,让咱们先来几道前菜框架

  1. 导入框架:MessageUI.framework
    屏幕快照 2017-08-16 17.22.50.png

2.导入头文件:#import <MessageUI/MessageUI.h>编辑器

3.添加协议: ide

屏幕快照 2017-08-16 17.32.28.png

添加完协议以后,咱们首先想到的就是实现协议方法,但是还不能急,咱们还得检测一下设备是否能够发送短信。以下:ui

- (void)showSMSPicker:(id)sender
{
     /**
     您必须检查当前设备是否能够在尝试建立一个MFMessageComposeViewController的实例以前发送短信
     。 若是设备没法发送短信,
     [[MFMessageComposeViewController alloc] init]将返回nil。 您的应用程式用一个空视图控制器调用
      -presentViewController时会致使崩溃。
      **/
    if ([MFMessageComposeViewController canSendText])
        // The device can send email.
    {
        [self displaySMSComposerSheet];
    }
    else
        // The device can not send email.
    {
        self.feedbackMsg.hidden = NO;
        self.feedbackMsg.text = @"Device not configured to send SMS.";
    }
}

- (void)displaySMSComposerSheet
{
    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
    picker.messageComposeDelegate = self;
    
    //您能够指定一个或多个预配置的收件人。 用户有从消息编辑器视图中删除或添加收件人的选项控制器
    //您能够指定将出如今消息编辑器视图控制器中的初始消息文本。
    
    picker.recipients = @[@"Phone number here"];//发短信的手机号码的数组,数组中是一个即单发,多个即群发。
    picker.body       = @"Hello from California!"; //短信主体内容
    
    [self presentViewController:picker animated:YES completion:NULL];
}

复制代码

检测是否能够发送短信,仍是须要有一个触发事件的,代码以下:spa

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIButton * button = [[UIButton alloc]initWithFrame:CGRectMake(140, 100, 100, 100)];
    button.backgroundColor = [UIColor blackColor];
    [button setTitle:@"发送短信" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(showSMSPicker:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    UILabel * feedbackMsg =  [[UILabel alloc]initWithFrame:CGRectMake(10, 300, self.view.frame.size.width -20, 30)];
    feedbackMsg.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:feedbackMsg];
    self.feedbackMsg = feedbackMsg;
}


复制代码

嗯,到了实现协议方法的时候了:code

// -------------------------------------------------------------------------------
//  messageComposeViewController:didFinishWithResult:
//  Dismisses the message composition interface when users tap Cancel or Send.
//  Proceeds to update the feedback message field with the result of the
//  operation.
//  当用户点击取消或发送时,关闭消息组合界面。
//  收到更新反馈消息字段的结果操做。
// -------------------------------------------------------------------------------
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
              didFinishWithResult:(MessageComposeResult)result
{
    self.feedbackMsg.hidden = NO;
    // Notifies users about errors associated with the interface
    // 通知用户与界面相关的错误
    switch (result)
    {
        case MessageComposeResultCancelled: //取消
            self.feedbackMsg.text = @"Result: SMS sending canceled";
            break;
        case MessageComposeResultSent: //发送
            self.feedbackMsg.text = @"Result: SMS sent";
            break;
        case MessageComposeResultFailed: //失败
            self.feedbackMsg.text = @"Result: SMS sending failed";
            break;
        default: //默认
            self.feedbackMsg.text = @"Result: SMS not sent";
            break;
    }
    
    [self dismissViewControllerAnimated:YES completion:NULL];
}
复制代码

Demo运行结果以下:

IMG_1445.PNG

IMG_1446.PNG

IMG_1447.PNG

至此,咱们的发送短信功能就实现了,是否是很简单!可是,当年也是怂过啊,因此,特写此文,以记念当年怂过的日子。

参考文章

官方文档