一、系统应用

在开发某些应用时,我们可能希望能够调用iOS系统内置的电话、短信、邮件、浏览器应用,或者直接调用安装的第三方应用,这个要怎么实现呢?

这里统一使用UIApplication的一个对象方法来实现:
  1. //打开不同的系统应用
  2. - (void)openUrl:(NSURL *)url;

那怎么区分我是要打电话还是发短信等等呢?
之前我们学习网络的时候,是不是URL最前面使用的是http://,使用本地文件是不是前面就变成file://了,这就是URL的协议,我们就是控制URL的协议,来打开不同应用。

下面列出了一些系统应用URL协议:
  1. tel://tel:打电话,没有提示直接拨打
  2. telprompt://telprompt:打电话,拨打电话前有提示用户是否拨打电话
  3. sms://sms:发短信
  4. mailto://mailto:发邮件
  5. http://http:打开浏览器
下面就是具体实例演示:
1. 有提示的打电话
  1. //打电话
  2. - (void)telpromptTest{
  3. //电话号码
  4. NSString *phoneNumber = @"18500138888";
  5. //1.创建打电话URL路径,这种方式会提示用户确认是否拨打电话
  6. NSString *urlStr = [NSString stringWithFormat:@"telprompt://%@",phoneNumber];
  7. //2.生成URL
  8. NSURL *url = [NSURL URLWithString:urlStr];
  9. //3.打开系统应用
  10. UIApplication *application = [UIApplication sharedApplication];
  11. [application openURL:url];
  12. }
2. 发短信
  1. //发送短信
  2. - (void)sendMessageTest{
  3. //电话号码
  4. NSString *phoneNumber = @"18500138888";
  5. //1.创建发短信URL路径
  6. NSString *urlStr = [NSString stringWithFormat:@"sms://%@",phoneNumber];
  7. //2.生成URL
  8. NSURL *url = [NSURL URLWithString:urlStr];
  9. //3.打开系统应用
  10. UIApplication *application = [UIApplication sharedApplication];
  11. [application openURL:url];
  12. }
3. 发邮件
  1. //发送邮件
  2. - (void)sendEmailTest {
  3. NSString *mailAddress = @"850192964@qq.com";
  4. //1.创建发邮件URL路径
  5. NSString *urlStr = [NSString stringWithFormat:@"mailto://%@",mailAddress];
  6. //2.生成URL
  7. NSURL *url = [NSURL URLWithString:urlStr];
  8. //3.打开系统应用
  9. UIApplication *application = [UIApplication sharedApplication];
  10. [application openURL:url];
  11. }
4. 打开浏览器
  1. //浏览网页
  2. - (void)browserTest {
  3. //1.创建打开浏览器URL路径
  4. NSString *urlStr = @"http://www.baidu.com";
  5. //2.生成URL
  6. NSURL *url = [NSURL URLWithString:urlStr];
  7. //3.打开系统应用
  8. UIApplication *application = [UIApplication sharedApplication];
  9. [application openURL:url];
  10. }

上面打开的是系统应用,实际上openUrl的功能是只要是系统安装了的应用程序,都可以打开,比如假设你现在开发了一个应用A,如果用户机器上已经安装了此应用,并且在应用B中希望能够直接打开A,也是可以用openUrl实现,不过要进行一些配置。

配置第三方应用步骤:
  1. 修改应用A的info.plist文件,添加URL types节点
  2. 在该节点下,配置具体协议URL Schemas以及应用A的唯一标识URL identifier,如下图:
  3. 在应用A的AppDelegate文件中处理AppDelegate的一个代理方法

    1. /*
    2. 当被其他应用程序通过URL打开时就会调用,
    3. 这里可以接收参数并解析,返回是否能被其他应用程序打开
    4. */
    5. -(BOOL)application:(UIApplication *)application //当前应用程序
    6. openURL:(NSURL *)url //其他应用使用的URL
    7. sourceApplication:(NSString *)sourceApplication //其他应用的应用标识
    8. annotation:(id)annotation
    9. {
    10. NSLog(@"url:%@",url);
    11. NSLog(@"source:%@",sourceApplication);
    12. NSLog(@"params:%@",[url host]);
    13. return YES;//是否打开
    14. }
配置应用A完成,然后我们就可以在应用B中使用openUrl打开应用A了
  1. //打开第三方应用
  2. - (void)thirdPartyApplicationTest
  3. {
  4. //使用第三方应用协议
  5. NSString *urlStr = @"cmj://myparams";
  6. NSURL *url = [NSURL URLWithString:urlStr];
  7. //判断该应用是否能打开
  8. UIApplication *application = [UIApplication sharedApplication];
  9. if(![application canOpenURL:url]){
  10. NSLog(@"无法打开\"%@\",请确保此应用已经正确安装.",url);
  11. return;
  12. }
  13. [application openURL:url];
  14. }

二、系统服务

调用系统内置的应用来发送短信、邮件相当简单,但是这么操作也存在着一些弊端:

当你点击了发送短信(或邮件)操作之后,直接启动了系统的短信(或邮件)应用程序,我们的应用其实此时已经处于一种挂起状态,发送完(短信或邮件)之后无法自动回到应用界面。

如果想要在应用程序内部完成这些操作,则可以利用iOS中的MessageUI.framework,它提供了关于短信和邮件的UI接口供开发者在应用程序内部调用。

MessageUI.framework提供了有现成的短信和邮件的编辑界面,开发人员只需要通过编程的方式给短信和邮件控制器设置对应的参数即可。

1、短信

MessageUI.framework中使用MFMessageComposeViewController来发短信

下面是使用步骤:
  1. 导入MessageUI.framework,并添加头文件

    1. #import <MessageUI/MessageUI.h>
  2. 创建MFMessageComposeViewController对象
  3. 设置收件人、信息正文等内容属性,设置代理messageComposeDelegate
  4. 以模态弹出该视图控制器
  5. 处理代理方法,获取发送状态:

    1. /* 发送完成会调用,不管成功与否 */
    2. -(void)messageComposeViewController:(MFMessageComposeViewController *)controller
    3. didFinishWithResult:(MessageComposeResult)result;/*发送结果*/
下面是使用实例:
  1. #import "KCSendMessageViewController.h"
  2. #import <MessageUI/MessageUI.h>
  3. @interface KCSendMessageViewController ()<MFMessageComposeViewControllerDelegate>
  4. @property (weak, nonatomic) IBOutlet UITextField *receivers;//收信人文本框
  5. @property (weak, nonatomic) IBOutlet UITextField *body;//信息正文文本框
  6. @property (weak, nonatomic) IBOutlet UITextField *subject;//主题文本框
  7. @property (weak, nonatomic) IBOutlet UITextField *attachments;//附件文本框
  8. @end
  9. @implementation KCSendMessageViewController
  10. #pragma mark - 控制器视图方法
  11. - (void)viewDidLoad {
  12. [super viewDidLoad];
  13. }
  14. #pragma mark - UI事件
  15. - (IBAction)sendMessageClick:(UIButton *)sender {
  16. //如果不能发送文本信息,就直接返回
  17. if(![MFMessageComposeViewController canSendText]){
  18. return;
  19. }
  20. //创建短信发送视图控制器
  21. MFMessageComposeViewController *messageController =
  22. [[MFMessageComposeViewController alloc] init];
  23. //设置收件人
  24. messageController.recipients = [self.receivers.text componentsSeparatedByString:@","];
  25. //设置信息正文
  26. messageController.body = self.body.text;
  27. //设置代理,注意这里不是delegate而是messageComposeDelegate
  28. messageController.messageComposeDelegate = self;
  29. //判断是否支持主题
  30. if([MFMessageComposeViewController canSendSubject]){
  31. //设置主题
  32. messageController.subject = self.subject.text;
  33. }
  34. //判断是否支持附件
  35. if ([MFMessageComposeViewController canSendAttachments]) {
  36. //添加附件,请务必指定附件文件的后缀,否则在发送后无法正确识别文件类别
  37. NSArray *attachments = [self.attachments.text componentsSeparatedByString:@","];
  38. if (attachments.count > 0) {
  39. for(NSString *attachment in attachments){
  40. NSString *path = [[NSBundle mainBundle] pathForResource:attachment
  41. ofType:nil];
  42. NSURL *url = [NSURL fileURLWithPath:path];
  43. //添加附件具体方法,需要设置附件URL和附件的标识
  44. [messageController addAttachmentURL:url
  45. withAlternateFilename:attachment];
  46. };
  47. }
  48. }
  49. //以模态弹出界面
  50. [self presentViewController:messageController animated:YES completion:nil];
  51. }
  52. #pragma mark - MFMessageComposeViewController代理方法
  53. /* 发送完成,不管成功与否 */
  54. -(void)messageComposeViewController:(MFMessageComposeViewController *)controller
  55. didFinishWithResult:(MessageComposeResult)result
  56. {
  57. switch (result) {
  58. case MessageComposeResultSent:
  59. NSLog(@"发送成功.");
  60. break;
  61. case MessageComposeResultCancelled:
  62. NSLog(@"取消发送.");
  63. break;
  64. default:
  65. NSLog(@"发送失败.");
  66. break;
  67. }
  68. //弹回界面
  69. [self dismissViewControllerAnimated:YES completion:nil];
  70. }
  71. @end

2. 邮件

MessageUI.framework中使用MFMailComposeViewController来发邮件

使用步骤【和发短信相似】:
  1. 导入MessageUI.framework,并添加头文件

    1. #import <MessageUI/MessageUI.h>
  2. 创建MFMailComposeViewController对象
  3. 设置收件人、抄送人、正文等内容属性,设置代理mailComposeDelegate
  4. 以模态弹出该视图控制器
  5. 处理代理方法,获取发送状态:

    1. /* 发送完成会调用,不管成功与否 */
    2. -(void)mailComposeController:(MFMailComposeViewController *)controller
    3. didFinishWithResult:(MFMailComposeResult)result /* 发送结果 */
    4. error:(NSError *)error;/* 错误信息 */
下面是实例:
  1. #import "KCSendEmailViewController.h"
  2. #import <MessageUI/MessageUI.h>
  3. @interface KCSendEmailViewController ()<MFMailComposeViewControllerDelegate>
  4. @property (weak, nonatomic) IBOutlet UITextField *toTecipients;//收件人文本框
  5. @property (weak, nonatomic) IBOutlet UITextField *ccRecipients;//抄送人文本框
  6. @property (weak, nonatomic) IBOutlet UITextField *bccRecipients;//密送人文本框
  7. @property (weak, nonatomic) IBOutlet UITextField *subject; //主题文本框
  8. @property (weak, nonatomic) IBOutlet UITextField *body;//正文文本框
  9. @property (weak, nonatomic) IBOutlet UITextField *attachments;//附件文本框
  10. @end
  11. @implementation KCSendEmailViewController
  12. - (void)viewDidLoad {
  13. [super viewDidLoad];
  14. }
  15. #pragma mark - UI事件
  16. - (IBAction)sendEmailClick:(UIButton *)sender {
  17. //判断当前是否能够发送邮件
  18. if ([MFMailComposeViewController canSendMail]) {
  19. return;
  20. }
  21. //创建发送邮件视图控制器
  22. MFMailComposeViewController *mailController =
  23. [[MFMailComposeViewController alloc] init];
  24. //设置代理,注意这里不是delegate,而是mailComposeDelegate
  25. mailController.mailComposeDelegate = self;
  26. //设置收件人
  27. NSArray *recipients = [self.toTecipients.text componentsSeparatedByString:@","];
  28. [mailController setToRecipients:recipients];
  29. //设置抄送人
  30. if (self.ccRecipients.text.length > 0) {
  31. NSArray *ccRecipients = [self.ccRecipients.text componentsSeparatedByString:@","];
  32. [mailController setCcRecipients:ccRecipients];
  33. }
  34. //设置密送人
  35. if (self.bccRecipients.text.length > 0) {
  36. NSArray *bccRecipients = [self.bccRecipients.text componentsSeparatedByString:@","];
  37. [mailController setBccRecipients:bccRecipients];
  38. }
  39. //设置主题
  40. [mailController setSubject:self.subject.text];
  41. //设置主体内容
  42. [mailController setMessageBody:self.body.text isHTML:YES];
  43. //添加附件
  44. if (self.attachments.text.length > 0) {
  45. NSArray *attachments = [self.attachments.text componentsSeparatedByString:@","] ;
  46. for(NSString *attachment in attachments) {
  47. NSString *file = [[NSBundle mainBundle] pathForResource:attachment
  48. ofType:nil];
  49. NSData *data = [NSData dataWithContentsOfFile:file];
  50. //第一个参数是附件数据,第二个参数是mimeType类型,jpg图片对应image/jpeg
  51. [mailController addAttachmentData:data
  52. mimeType:@"image/jpeg"
  53. fileName:attachment];
  54. }];
  55. }
  56. //弹出视图
  57. [self presentViewController:mailController animated:YES completion:nil];
  58. }
  59. #pragma mark - MFMailComposeViewController代理方法
  60. /* 发送完成会调用,不管成功与否 */
  61. -(void)mailComposeController:(MFMailComposeViewController *)controller
  62. didFinishWithResult:(MFMailComposeResult)result
  63. error:(NSError *)error
  64. {
  65. switch (result) {
  66. case MFMailComposeResultSent:
  67. NSLog(@"发送成功.");
  68. break;
  69. case MFMailComposeResultSaved:
  70. //点取消会提示是否存储为草稿,存储后可以到系统邮件应用的对应草稿箱找到
  71. NSLog(@"邮件已保存.");
  72. break;
  73. case MFMailComposeResultCancelled:
  74. NSLog(@"取消发送.");
  75. break;
  76. default:
  77. NSLog(@"发送失败.");
  78. break;
  79. }
  80. if (error) {
  81. NSLog(@"发送邮件过程中发生错误,错误信息:%@",error.localizedDescription);
  82. }
  83. [self dismissViewControllerAnimated:YES completion:nil];
  84. }
  85. @end

iOS学习笔记28-系统服务(一)短信和邮件的更多相关文章

  1. Android(java)学习笔记38:Android 短信发送

    1.第一种可以调用系统内部的短信程序. 之前我曾经出现过一个bug就是报错: android.content.ActivityNotFoundException: No Activity found ...

  2. IOS学习笔记28—SQLite3第三方库之FMDB

    本文转载至 http://blog.csdn.net/happyrabbit456/article/details/11609451 SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非 ...

  3. IOS中调用系统的电话、短信、邮件、浏览功能

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评 ...

  4. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  5. iOS学习笔记22-推送通知

    一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...

  6. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  7. ios 设置亮度、声音;调用发短信、邮件、打电话

    一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...

  8. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  9. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

随机推荐

  1. 任务管理器 用 Ctrl + Shift + Esc 替换 Ctrl + Alt + Del

    任务管理器 用 Ctrl + Shift + Esc 替换 Ctrl + Alt + Del

  2. vue 文件流下载xlsx 功能实现

    downLoadFile (url, name) { this.xhr = new XMLHttpRequest() this.xhr.open('GET', url, true) this.xhr. ...

  3. 记录一次mysql中自定义获取UUID的函数

    循环方式一: DELIMITER :; drop function if exists test.fn_test:; create function test.fn_test() ) begin ) ...

  4. css实现页面文字不换行、自动换行、强制换行

    强制不换行 div{ white-space:nowrap; } 自动换行 div{ word-wrap: break-word; word-break: normal; } 强制英文单词断行 div ...

  5. c3p0,dbcp和proxool

    关于c3p0.dbcp和proxool,之类的比较,配置在网上有很多的文章,我这边就不浪费大家的时间了,主要讲下我用过这三个之后的体会. dbcp:框架以前使用的是dbcp,网上说,有很多BUG,至少 ...

  6. fei33423 工作 职场 格言

    对老板: 1.  老板不知道你做的事情(目标设定) 2.  老板要的是规划(对上报告), 自己给自己设定 金字塔四位下的目标,各种维度.如何细化. 2.1 明确老板期望 2.2 与老板达成共识 2.3 ...

  7. shell脚本,awk里面的BEGIN讲解。

    解释: BEGIN{}这个特殊的pattern最常用的就是 变量赋值. BEGIN这个pattern就是文件没开始读的时候 执行 awk 'BEGIN{FS=":";OFS=&qu ...

  8. bug汇总

    bug 2018年8月23日 bug 1:散点图画不出来. plt.scatter(validation_examples["longitude"], validation_exa ...

  9. 【转】centos中service命令与/etc/init.d的关系以及centos7的变化

    centos中service命令与/etc/init.d的关系 service httpd start 其实是启动了存放在/etc/init.d目录下的脚本. 但是centos7的服务管理改规则了.C ...

  10. python hashlib模块学习

    目录 hashlib 模块 破解密码 hmac 模块 hashlib 模块 1.干嘛用的: 对字符进行加密,其实就是一个自定义的字符编码表,我们原来接触的是计算机语言0和1然后转化成字符,而hashl ...