zoukankan      html  css  js  c++  java
  • IOS,发短信,发邮件,打电话

    今天把APP里常用小功能 例如发短信、发邮件、打电话。
    全部拿出来简单说说它们的实现思路。
     
    1.发短信
    实现打电话的功能,主要二种方法,下面我就分别说说它们的优缺点。
    1.1.发短信(1)——URL 
    // 直接拨号,拨号完成后会停留在通话记录中
    1、方法:

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

    2、优点:
    –简单
    3、缺点:
    –不能指定短信内容,而且不能自动回到原应用
    1.2发短信(2)——MessageUI框架 

    如果自定义短信,需要使用一个框架MessageUI。

    优点
     1. 从应用出去能回来
     2. 可以多人
     3. 可以自定义消息,消息支持HTML格式的

    而且如果在苹果系统中,如果彼此的手机都是iOS设备,并且开通了iMessage功能,彼此之间的短信是走网络通道,而不走运营商的通道!

    - (void)msg2
    {
        // 判断用户设备能否发送短信
        if (![MFMessageComposeViewController canSendText]) {
            return;
        }
        
        // 1. 实例化一个控制器
        MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
        
        // 2. 设置短信内容
        // 1) 收件人
        controller.recipients = @[@"10010", @"10086"];
        
        // 2) 短信内容
        controller.body = @"给您拜个晚年,祝您晚年快乐!";
        
        // 3) 设置代理
        controller.messageComposeDelegate = self;
    
        // 3. 显示短信控制器
        [self presentViewController:controller animated:YES completion:nil];
    }

    记得发完短信记得调用代理方法关闭窗口

    #pragma mark 短信控制器代理方法
    /**
     短信发送结果
     
     MessageComposeResultCancelled,     取消
     MessageComposeResultSent,          发送
     MessageComposeResultFailed         失败
     */
    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
    {
        NSLog(@"%d", result);
        
        // 在面向对象程序开发中,有一个原则,谁申请,谁释放!
        // *** 此方法也可以正常工作,因为系统会将关闭消息发送给self
    //    [controller dismissViewControllerAnimated:YES completion:nil];
        
        // 应该用这个!!!
        [self dismissViewControllerAnimated:YES completion:nil];
    }

    2.发邮件

    - (void)sendmail
    {
        // 1. 先判断能否发送邮件
        if (![MFMailComposeViewController canSendMail]) {
            // 提示用户设置邮箱
            return;
        }
        
        // 2. 实例化邮件控制器,准备发送邮件
        MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
        
        // 1) 主题 xxx的工作报告
        [controller setSubject:@"我的工作报告"];
        // 2) 收件人
        [controller setToRecipients:@[@"4800607@gmail.com"]];
        
        // 3) cc 抄送
        // 4) bcc 密送(偷偷地告诉,打个小报告)
        // 5) 正文
        [controller setMessageBody:@"这是我的<font color="blue">工作报告</font>,请审阅!<BR />P.S. 我的头像牛X吗?" isHTML:YES];
        
        // 6) 附件
        UIImage *image = [UIImage imageNamed:@"头像1.png"];
        NSData *imageData = UIImagePNGRepresentation(image);
        // 1> 附件的二进制数据
        // 2> MIMEType 使用什么应用程序打开附件
        // 3> 收件人接收时看到的文件名称
        // 可以添加多个附件
        [controller addAttachmentData:imageData mimeType:@"image/png" fileName:@"头像.png"];
        
        // 7) 设置代理
        [controller setMailComposeDelegate:self];
        
        // 显示控制器
        [self presentViewController:controller animated:YES completion:nil];
    }

    同样要记得发完邮件记得调用代理方法关闭窗口

    #pragma mark - 邮件代理方法
    /**
     MFMailComposeResultCancelled,      取消
     MFMailComposeResultSaved,          保存邮件
     MFMailComposeResultSent,           已经发送
     MFMailComposeResultFailed          发送失败
     */
    - (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
    {
        // 根据不同状态提示用户
        NSLog(@"%d", result);
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }

    3.打电话
    打电话有三种方式可以实现,优缺点也各不同
    3.1.打电话不回引用

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

    3.2.出去打电话然后回来

    - (void)tel2
    {
        // 但是:telprompt协议属于苹果的私有协议,一旦程序中使用了此协议,程序无法上架
        // 针对越狱的机器开发的系统,可以使用此协议
        NSURL *url = [NSURL URLWithString:@"telprompt://10010"];
        
        [[UIApplication sharedApplication] openURL:url];
    }

    3.3借助UIWebView打电话(会回来)
    一般都是用这种,解决了不越狱的问题。

    - (void)tel3
    {
        // 提示:不要将webView添加到self.view,如果添加会遮挡原有的视图
        // 懒加载
        if (_webView == nil) {
            _webView = [[UIWebView alloc] init];
        }
        NSLog(@"%p", _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];
    }

    1、调用 自带mail

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto://admin@hzlzh.com"]];

     

    2、调用 电话phone

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8008808888"]];

     

    3、调用 SMS

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms://800888"]];

     

    4、调用自带 浏览器 safari

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.hzlzh.com"]];

     

    调用phone可以传递号码,调用SMS 只能设定号码,不能初始化SMS内容。

     

    若需要传递内容可以做如下操作:

    加入:MessageUI.framework

     

    #import <MessageUI/MFMessageComposeViewController.h>

     

    实现代理:MFMessageComposeViewControllerDelegate

     

     

     

    调用sendSMS函数

    //内容,收件人列表

    - (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients

    {

     

        MFMessageComposeViewController *controller = [[[MFMessageComposeViewController allocinitautorelease];

     

        if([MFMessageComposeViewController canSendText])

     

        {

     

            controller.body = bodyOfMessage;   

     

            controller.recipients = recipients;

     

            controller.messageComposeDelegate = self;

     

            [self presentModalViewController:controller animated:YES];

     

        }   

     

    }

     

    // 处理发送完的响应结果
    - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
    {
      [self dismissModalViewControllerAnimated:YES];
     
      if (result == MessageComposeResultCancelled)
        NSLog(@"Message cancelled")
      else if (result == MessageComposeResultSent)
        NSLog(@"Message sent")  
      else 
        NSLog(@"Message failed")  
    }

     

     

    发送邮件的为:

    导入#import <MessageUI/MFMailComposeViewController.h>

    实现代理:MFMailComposeViewControllerDelegate

     

    //发送邮件

    -(void)sendMail:(NSString *)subject content:(NSString *)content{

     

        MFMailComposeViewController *controller = [[[MFMailComposeViewController allocinitautorelease];

     

        if([MFMailComposeViewController canSendMail])

     

        {

     

            [controller setSubject:subject];

     

            [controller setMessageBody:content isHTML:NO];

     

            controller.mailComposeDelegate = self;

     

            [self presentModalViewController:controller animated:YES];

     

        }    

    }

     

    //邮件完成处理

    -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{

     

        [self dismissModalViewControllerAnimated:YES];

     

        if (result == MessageComposeResultCancelled)

            NSLog(@"Message cancelled");

        else if (result == MessageComposeResultSent)

            NSLog(@"Message sent"); 

        else 

            NSLog(@"Message failed");  

     

    }

     

     

     

     

    默认发送短信的界面为英文的,解决办法为:

    在.xib 中的Localization添加一組chinese就ok了

  • 相关阅读:
    php中json_encode中文编码问题
    PLSQL Developer建表时注释(COMMENT)中文乱码的解决方案(Windows)
    JQuery实现 checkbox 全选、反选,子checkbox有没选去掉全选
    oracle group by 使用
    oracle distinct 去除重复,同时按某字段排序
    phpstorm 设置多项目并存
    putty修改编码
    Java基本开发环境搭建
    smarty 判断变量是否为空
    vim
  • 原文地址:https://www.cnblogs.com/OIMM/p/4785577.html
Copyright © 2011-2022 走看看