调用电话、邮箱、短信功能

引言:

应用中经常会用到调用系统打电话、发信息、发邮件等功能,下面一一实现。


# 一. 打电话

# 1. 方式一

// 最简单最直接的方式: 直接跳转到拨号界面
// 缺点: 拨打电话完毕后, 不会自动回到原应用界面, 直接停留在通话记录界面
NSURL *url = [NSURL URLWithString:@"tel://10086"];
[[UIApplication sharedApplication] openURL:url];

# 2. 方式二

// 拨号之前会弹框询问用户是否拨号, 拨号完毕后会直接回到原应用
// 缺点: 因为是私有API, 所以可能会被拒掉
NSURL *url = [NSURL URLWithString:@"telprompt://10086"];
[[UIApplication sharedApplication] openURL:url];

# 3. 方式三

/**
  *  创建一个UIWebView来加载url, 拨号后能自动回到原应用
  *
  *  拨号之前会弹框询问用户是否拨号, 拨号完毕后自动回到原应用
  * 
  *  注意: webView不要设置尺寸, 不然会遮挡住其他界面  只是用来打电话,不需要显示
  */
NSURL *url = [NSURL URLWithString:@"tel://10086"];
if (_webView == nil) {
    _webView = [[UIWebView alloc] initWithFrame:(CGRectZero)];
}
[_webView loadRequest:[NSURLRequest requestWithURL:url]];


# 二. 发短信

# 1. 方式一

// 直接跳转到发短信界面, 但是不能指定短信内容, 而且不能返回到原应用
NSURL *url = [NSURL URLWithString:@"sms://15084089244"];
[[UIApplication sharedApplication] openURL:url];

# 2. 方式二

1 如果想指定短信内容, 使用MessageUI框架

    //1. 导入头文件
    //2. 显示发短信的控制器
    MFMessageComposeViewController *messageVC = [[MFMessageComposeViewController alloc] init];

    //3. 设置短信内容
    messageVC.body = @"吃饭了?";

    //4. 设置收件人列表(可以添加多个)
    messageVC.recipients = @[@"13917714464", @"15084089244"];

    //5. 设置代理
    messageVC.messageComposeDelegate = self;

    [self presentViewController:messageVC animated:YES completion:nil];

2 代理方法:

// 当短信界面关闭的时候调用, 发完后会自动回到原应用
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{

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

    if (result == MessageComposeResultCancelled) {
        NSLog(@"取消发送");
    }else if (result == MessageComposeResultSent){
        NSLog(@"已经发出");
    }else{
        NSLog(@"发送失败");
    }
}

# 三. 发邮件

# 1. 方式一:

// 调用系统自带的邮件客户端, 发完邮件后不会自动回到原应用
NSURL *url = [NSURL URLWithString:@"mailro://244344094@qq.com"];
[[UIApplication sharedApplication] openURL:url];

# 2. 方式二:

// 指定邮件内容, 和发短信方式2 差不多.  使用
MFMailComposeViewController *emailVC = [[MFMailComposeViewController alloc] init];
emailVC.mailComposeDelegate = self;