今天把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:@[@"[email protected]"]]; // 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://[email protected]"]];
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 alloc] init] autorelease];
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 alloc] init] autorelease];
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了