前言:
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如在应用中拨打电话,一些第三方软件会在应用内发送短信等。今天将和大家一起学习如何使用系统应用、使用系统服务完成上述功能。
事实上,我们在前面学习的内容中就有调用过系统内置的应用。比如我们在点击textView的超链接文本时,默认使用系统浏览器来访问连接,还有前面学习到地图服务,我们也可以通过打开系统内置的地图应用来完成地图服务。在开发某些应用时,如果希望能够调用iOS系统内置的电话、短信、邮件、浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的系统应用。常用的协议如下:
- 打电话:tel:或者tel://、telprompt:或telprompt://(拨打电话前有提示)。
- 发短信:sms:或者sms://
- 发送邮件:mailto:或者mailto://
- 启动浏览器:http:或者http://
但是实际开发中我们发现,调用系统内置的应用来完成上述系统服务也存在着一些弊端:除了打电话之外,当你点击了发送短信(或邮件)操作之后直接启动了系统的短信(或邮件)应用程序,我们的应用其实此时已经处于一种挂起状态,打完电话或是发送完短信(或邮件)之后无法自动回到应用界面。而且不能在我们自己开发的应用中制定短信(或邮件)的内容。这显然不符合我们的需求,我们需要在应用程序内部完成这些操作。
1. 拨打电话
拨打电话的功能实现相对简单,直接使用UIApplication的OpenURL:的方法并制定对应的协议就可以,打完电话后我们任然留在当前的应用界面。下面以一个简单的demo演示如何完成拨打电话的功能:
示例代码:
#import "ViewController.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
// 打电话 tel: 或tel:// 协议
- (IBAction)callPhone1:(id)sender {
// 使用这个协议会直接拨打电话
NSString *phoneNumber=@"10010";// 拨打的电话
NSString *url=[NSString stringWithFormat:@"tel://%@",phoneNumber];
[self openUrl:url];
}
// 打电话 telprompt:或telprompt:// 协议
- (IBAction)callPhone2:(id)sender {
// 这个协议在打电话前会先弹出一个对话框,提醒你是否打电话,然后在打完电话之后会回到程序中
NSString *phoneNumber=@"10010";// 拨打的电话
NSString *url=[NSString stringWithFormat:@"telprompt://%@",phoneNumber];
[self openUrl:url];
}
#pragma mark - 私有方法
-(void)openUrl:(NSString *)urlStr {
// 注意url中包含协议名称,iOS根据协议确定调用哪个应用,例如发送邮件是“tel://”其中“//”可以省略写成“tel:”(其他协议也是如此)
NSURL *url=[NSURL URLWithString:urlStr];
UIApplication *application=[UIApplication sharedApplication];
if(![application canOpenURL:url]){
NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
return;
}
// 打开对应协议的应用
[[UIApplication sharedApplication] openURL:url];
}
@end
2. 发送短信
如果我们在应用中直接调用发送短信的系统应用,在完成发送任务后,我们停留在了系统应用当中,当然我们也可以在程序内部完成短信的编辑和发送任务。利用iOS中的MessageUI.framework,它提供了关于短信的UI接口供开发者在应用程序内部调用。从框架名称不难看出这是一套UI接口,提供有现成的短信的编辑界面,开发人员只需要通过编程的方式给短信控制器设置对应的参数即可。
在MessageUI.framework中用于发送短信的类是MFMessageComposeViewController。它继承于UINavigationController。下面介绍一下MFMessageComposeViewController使用步骤:
- 创建MFMessageComposeViewController对象。
- 设置收件人recipients、信息正文body,如果运行商支持主题和附件的话可以设置主题subject、附件attachments(可以通过canSendSubject、canSendAttachments方法判断运行商是否支持)
- 设置代理messageComposeDelegate,注意这里不是delegate属性,因为delegate属性已经留给UINavigationController,MFMessageComposeViewController没有覆盖此属性而是重新定义了一个代理,实现代理方法获得发送状态。
下面自定义一个发送短信的界面演示MFMessageComposeViewController的使用:我们可以定制短息控制器的相关参数,当我们弹出MFMessageComposeViewController的实例对象时,看到的就是短息的系统编辑界面,点击MFMessageComposeViewController 界面中的“发送”来完成短信发送工作,当然用户也可能点击“取消”按钮回到当前应用。当然,在我们完成发送任务之后还是可以回到当前应用的。
示例代码:
#import "ViewController.h"
#import <MessageUI/MessageUI.h>
@interface ViewController ()<MFMessageComposeViewControllerDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
// 发短信
- (IBAction)snedMessage1:(id)sender {
NSString *phoneNumber = @"10010";
NSString *urlString = [NSString stringWithFormat:@"sms://%@",phoneNumber];
NSURL *url = [NSURL URLWithString:urlString];
UIApplication *application = [