APP内部调用短信、电话、邮件

在APP开发中,很多时候需要在APP内部实现短信验证、分享,以及切换电话拨打等功能,这也就会调用到系统相对应得功能体系;

在iOS开发中一般会出现两种模式:

1)在APP中实现短信发送 和 电话拨打功能,完成后会停留在短信 和 电话界面

2)在APP中实现短信发送 和 电话拨打,完成后可以跳转到原来的APP界面,进行下一步操作。

一 、发短信

1)直接拨号,拨号完成后会停留在通话记录中

方法:


NSURL  *url  =  [NSURL  URLWithString:@"sms://10010"]; 
[[UIApplication  sharedApplication]  openURL:url];



优点 : 简单

缺点 : 不能指定短信内容,而且不能跳转回原APP界面

 

2)使用MFMessageComposeViewController ---------(需导入MessageUI框架 #import <MessageUI/MessageUI.h>)



方法:(需遵循短信代理----------MFMessageComposeViewControllerDelegate)



//邀请手机联系人
            //判断设备能否发送短信
            if (![MFMessageComposeViewController canSendText]) {
                return;
            }
            // 初始化短信控制器
           MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc]init];

            // 设置委托对象
            messageVC.messageComposeDelegate = self;

            NSString *text = [NSString stringWithFormat:@"[%@]邀请你注册IBOS · 酷办公加入“%@”,点击加入http://www.ibos.cn/?corp=%@", 
                              getMyInfo().realname, getMyInfo().corpname, getMyInfo().corpcode];
            //短信内容
            messageVC.body = text;// (注:如果短信中包含后网址,能自动识别,仍可以发送短信,收件人可以点击触发链接,实现跳转)
 
            //设置收件人(可以不设置,短信界面能跳转到系统通讯录,自行选择人选)
            controller.recipients  =   [@"10010",  @"10086"];

            //显示短信控制器
            [self presentViewController:messageVC animated:YES completion:nil];



 

 短信发送完成后 ,调用代理方法关闭短信界面

:



- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    switch (result) {
        case MessageComposeResultCancelled://取消
        {
            break;
        }

        case MessageComposeResultSent://发送
        {
            break;
        }

        case MessageComposeResultFailed://失败
        {
            UIAlertView *alertV = [[UIAlertView alloc]initWithTitle:@"提示" message:@"发送短信错误,请重发!" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
            [alertV show];
            break;
        }

        default:
            break;
    }
       // 关闭短信界面
    [controller dismissViewControllerAnimated:YES completion:nil];
}



 

二 、打电话

1)直接拨号,停留在通话记录界面



-(void)telPhoneFirst
{
     //  直接拨号,拨号完成后会停留在通话记录中      
       NSURL  *url  =  [NSURL  URLWithString:@"tel://10010"];        
       [[UIApplication  sharedApplication]  openURL:url];
}



2)拨号完成可以返回

注 :telprompt协议属于苹果的私有协议,一旦程序中使用了此协议,程序无法上架 ; 针对越狱的机器开发的系统,可以使用此协议 



-(void)telPhoneSecond
{
      NSURL  *url  =  [NSURL URLWithString:@"telprompt://10010"];    
      [[UIApplication  sharedApplication]  openURL:url];
}



3)借助UIWebView拨打电话

注:一般都是用这个方式,解决了不越狱的问题



-(void)telPhoneThird
{
    //  提示:不要将webView添加到self.view,如果添加会遮挡原有的视图        
    //  懒加载
        if (_webView  ==  nil) 
           {
              _webView  =  [[UIWebView  alloc]  init];
           }
             NSLog(@"%@",  _webView);
            // _webView  =  [[UIWebView  alloc]  initWithFrame:self.view.bounds]; 
           // [self.view  addSubview:_webView];
          
           NSURL  *url  =  [NSURL  URLWithString:@"tel://10010"];        
            NSURLRequest  *request  =  [NSURLRequest  requestWithURL:url];        
           [_webView  loadRequest:request];
}



 

三、发邮件 



 注:使用--MFMailComposeViewController (参照发短信2)



   需遵循邮件代理----------MFMessageComposeViewControllerDelegate



- (void)sendMail
{
    
    //判断是否能发送邮件
    if (![MFMailComposeViewController canSendMail]) {
        
         // 提示用户设置邮箱
        UIAlertView * mailAlert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"请查看邮箱设置" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [mailAlert show];
        return;
    }
    
    // 实例化邮件控制器界面,准备发送邮件
    
    MFMailComposeViewController * mailVC = [[MFMailComposeViewController alloc] init];
    
     //1)设置邮件主题
    [mailVC setSubject:@"工作报告"];
    
     //2)设置收件人
    
    [mailVC setToRecipients:@[@"xxxxxxx@163.com"]];
    
    //cc ----抄送   bcc -------密送
    
    // 3)设置正文
    
    [mailVC setMessageBody:@"这是我的<font  color=\"blue\">工作报告</font>,请审阅!<BR  />P.S.  我 的头像牛X吗?" isHTML:YES];
   
    // 4)附件
    
    UIImage * image = [UIImage imageNamed:@"aboutIbos"];
    NSData * imageData = UIImagePNGRepresentation(image); // UIImageJPEGRepresentation(image, 0);
//    //  1>  附件的二进制数据
//    //  2>  MIMEType  使用什么应用程序打开附件
//    //  3>  收件人接收时看到的文件名称
//    //  可以添加多个附件
    [mailVC addAttachmentData:imageData mimeType:@"image/png" fileName:@"aboutIbos.png"];
    
    //设置代理
    
    mailVC.delegate = self;
    
    //显示控制器
    [self presentViewController:mailVC animated:YES completion:nil];
    
}



 邮件发送完成后 ,调用代理方法关闭短信界面



- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
    
    
    switch (result) {
        case MFMailComposeResultCancelled: //取消发送
            
            break;
        case MFMailComposeResultFailed:   // 发送失败
            
            break;
        case MFMailComposeResultSaved:  // 保存邮件
            
            break;
        case MFMailComposeResultSent: // 发送成功
            
            break;
        default:
            break;
    }
    // 关闭邮件界面
    [self dismissViewControllerAnimated:YES completion:nil];
}