一、系统应用

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

这里统一使用UIApplication的一个对象方法来实现:
//打开不同的系统应用
- (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. 有提示的打电话
//打电话
- (void)telpromptTest{
//电话号码
NSString *phoneNumber = @"18500138888";
//1.创建打电话URL路径,这种方式会提示用户确认是否拨打电话
NSString *urlStr = [NSString stringWithFormat:@"telprompt://%@",phoneNumber];
//2.生成URL
NSURL *url = [NSURL URLWithString:urlStr];
//3.打开系统应用
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url];
}
2. 发短信
//发送短信
- (void)sendMessageTest{
//电话号码
NSString *phoneNumber = @"18500138888";
//1.创建发短信URL路径
NSString *urlStr = [NSString stringWithFormat:@"sms://%@",phoneNumber];
//2.生成URL
NSURL *url = [NSURL URLWithString:urlStr];
//3.打开系统应用
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url];
}
3. 发邮件
//发送邮件
- (void)sendEmailTest {
NSString *mailAddress = @"850192964@qq.com";
//1.创建发邮件URL路径
NSString *urlStr = [NSString stringWithFormat:@"mailto://%@",mailAddress];
//2.生成URL
NSURL *url = [NSURL URLWithString:urlStr];
//3.打开系统应用
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url];
}
4. 打开浏览器
//浏览网页
- (void)browserTest {
//1.创建打开浏览器URL路径
NSString *urlStr = @"http://www.baidu.com";
//2.生成URL
NSURL *url = [NSURL URLWithString:urlStr];
//3.打开系统应用
UIApplication *application = [UIApplication sharedApplication];
[application openURL:url];
}

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

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

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

二、系统服务

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

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

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

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

1、短信

MessageUI.framework中使用MFMessageComposeViewController来发短信

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

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

    /* 发送完成会调用,不管成功与否 */
    -(void)messageComposeViewController:(MFMessageComposeViewController *)controller
    didFinishWithResult:(MessageComposeResult)result;/*发送结果*/
下面是使用实例:
#import "KCSendMessageViewController.h"
#import <MessageUI/MessageUI.h> @interface KCSendMessageViewController ()<MFMessageComposeViewControllerDelegate> @property (weak, nonatomic) IBOutlet UITextField *receivers;//收信人文本框
@property (weak, nonatomic) IBOutlet UITextField *body;//信息正文文本框
@property (weak, nonatomic) IBOutlet UITextField *subject;//主题文本框
@property (weak, nonatomic) IBOutlet UITextField *attachments;//附件文本框 @end @implementation KCSendMessageViewController
#pragma mark - 控制器视图方法
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - UI事件
- (IBAction)sendMessageClick:(UIButton *)sender {
//如果不能发送文本信息,就直接返回
if(![MFMessageComposeViewController canSendText]){
return;
}
//创建短信发送视图控制器
MFMessageComposeViewController *messageController =
[[MFMessageComposeViewController alloc] init];
//设置收件人
messageController.recipients = [self.receivers.text componentsSeparatedByString:@","];
//设置信息正文
messageController.body = self.body.text;
//设置代理,注意这里不是delegate而是messageComposeDelegate
messageController.messageComposeDelegate = self;
//判断是否支持主题
if([MFMessageComposeViewController canSendSubject]){
//设置主题
messageController.subject = self.subject.text;
}
//判断是否支持附件
if ([MFMessageComposeViewController canSendAttachments]) {
//添加附件,请务必指定附件文件的后缀,否则在发送后无法正确识别文件类别
NSArray *attachments = [self.attachments.text componentsSeparatedByString:@","];
if (attachments.count > 0) {
for(NSString *attachment in attachments){
NSString *path = [[NSBundle mainBundle] pathForResource:attachment
ofType:nil];
NSURL *url = [NSURL fileURLWithPath:path];
//添加附件具体方法,需要设置附件URL和附件的标识
[messageController addAttachmentURL:url
withAlternateFilename:attachment];
};
}
}
//以模态弹出界面
[self presentViewController:messageController animated:YES completion:nil];
}
#pragma mark - MFMessageComposeViewController代理方法
/* 发送完成,不管成功与否 */
-(void)messageComposeViewController:(MFMessageComposeViewController *)controller
didFinishWithResult:(MessageComposeResult)result
{
switch (result) {
case MessageComposeResultSent:
NSLog(@"发送成功.");
break;
case MessageComposeResultCancelled:
NSLog(@"取消发送.");
break;
default:
NSLog(@"发送失败.");
break;
}
//弹回界面
[self dismissViewControllerAnimated:YES completion:nil];
}
@end

2. 邮件

MessageUI.framework中使用MFMailComposeViewController来发邮件

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

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

    /* 发送完成会调用,不管成功与否 */
    -(void)mailComposeController:(MFMailComposeViewController *)controller
    didFinishWithResult:(MFMailComposeResult)result /* 发送结果 */
    error:(NSError *)error;/* 错误信息 */
下面是实例:
#import "KCSendEmailViewController.h"
#import <MessageUI/MessageUI.h> @interface KCSendEmailViewController ()<MFMailComposeViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UITextField *toTecipients;//收件人文本框
@property (weak, nonatomic) IBOutlet UITextField *ccRecipients;//抄送人文本框
@property (weak, nonatomic) IBOutlet UITextField *bccRecipients;//密送人文本框
@property (weak, nonatomic) IBOutlet UITextField *subject; //主题文本框
@property (weak, nonatomic) IBOutlet UITextField *body;//正文文本框
@property (weak, nonatomic) IBOutlet UITextField *attachments;//附件文本框
@end @implementation KCSendEmailViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark - UI事件
- (IBAction)sendEmailClick:(UIButton *)sender {
//判断当前是否能够发送邮件
if ([MFMailComposeViewController canSendMail]) {
return;
}
//创建发送邮件视图控制器
MFMailComposeViewController *mailController =
[[MFMailComposeViewController alloc] init];
//设置代理,注意这里不是delegate,而是mailComposeDelegate
mailController.mailComposeDelegate = self;
//设置收件人
NSArray *recipients = [self.toTecipients.text componentsSeparatedByString:@","];
[mailController setToRecipients:recipients];
//设置抄送人
if (self.ccRecipients.text.length > 0) {
NSArray *ccRecipients = [self.ccRecipients.text componentsSeparatedByString:@","];
[mailController setCcRecipients:ccRecipients];
}
//设置密送人
if (self.bccRecipients.text.length > 0) {
NSArray *bccRecipients = [self.bccRecipients.text componentsSeparatedByString:@","];
[mailController setBccRecipients:bccRecipients];
}
//设置主题
[mailController setSubject:self.subject.text];
//设置主体内容
[mailController setMessageBody:self.body.text isHTML:YES];
//添加附件
if (self.attachments.text.length > 0) {
NSArray *attachments = [self.attachments.text componentsSeparatedByString:@","] ;
for(NSString *attachment in attachments) {
NSString *file = [[NSBundle mainBundle] pathForResource:attachment
ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:file];
//第一个参数是附件数据,第二个参数是mimeType类型,jpg图片对应image/jpeg
[mailController addAttachmentData:data
mimeType:@"image/jpeg"
fileName:attachment];
}];
}
//弹出视图
[self presentViewController:mailController animated:YES completion:nil];
} #pragma mark - MFMailComposeViewController代理方法
/* 发送完成会调用,不管成功与否 */
-(void)mailComposeController:(MFMailComposeViewController *)controller
didFinishWithResult:(MFMailComposeResult)result
error:(NSError *)error
{
switch (result) {
case MFMailComposeResultSent:
NSLog(@"发送成功.");
break;
case MFMailComposeResultSaved:
//点取消会提示是否存储为草稿,存储后可以到系统邮件应用的对应草稿箱找到
NSLog(@"邮件已保存.");
break;
case MFMailComposeResultCancelled:
NSLog(@"取消发送.");
break;
default:
NSLog(@"发送失败.");
break;
}
if (error) {
NSLog(@"发送邮件过程中发生错误,错误信息:%@",error.localizedDescription);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
@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. RYU的GUI安装

    1. RYU安装 Ubuntu14.04 LTS 1.sudo apt-get install git python-pip libxml2-dev libxslt1-dev python2.7-de ...

  2. UVA 1451 Average平均值 (数形结合,斜率优化)

    摘要:数形结合,斜率优化,单调队列. 题意:求一个长度为n的01串的子串,子串长度至少为L,平均值应该尽量大,多个满足条件取长度最短,还有多个的话,取起点最靠左. 求出前缀和S[i],令点Pi表示(i ...

  3. exportfs: /mnt/demo requires fsid= for NFS export

    解决方法:/mnt/demo 10.0.1.57(fsid=0,rw,async) //加入fsid=0参数就可.

  4. Core BlueTooth官方文档翻译

    本⽂文是苹果<Core Bluetooth Programming Guide>的翻译. 关于Core Bluetooth Core Bluetooth 框架提供了蓝⽛牙低功耗⽆无线设备与 ...

  5. 代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

    随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫切和必要.(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhone 6p/6ps ...

  6. C++ Primer读书笔记(一)第一篇:C++概述,第一章:开始

    1. 主要内容 介绍程序语言的核心思想和C++的基本概念. 印象比较深刻的就是分而治之(divide and conque)的分解思想. 2. 知识广场 1) C++ 文件后缀 cc, cpp,,cx ...

  7. chrome浏览器 配置开机启动全屏(看板app模式设置)

        chrome浏览器 配置开机启动全屏(看板app模式设置) 1.下载安装chrome浏览器. 2.建立一个chrome浏览器的快键方式,右键打开属性,如下图: 3.将目标选项卡的值修改为:&q ...

  8. k8s基于canel的网络策略

    Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...

  9. RSA与AES实现数据加密传输

    RSA.AES简介 RSA:非对称加密,需要提前生成两个密钥(一对的),通过其中一个密钥加密后的数据,只有另一个密钥能解密.通常这两个密钥中有一个会暴漏出来,即对外公开的,这个密钥称为“公钥”,反之另 ...

  10. 配置wamp开发环境

    新手在PHP网站建设时,会使用使用PHP的集成开发环境,这样利于开发和理解!但是做为一个网站开发人员,会独立的配置开发环境这是必须的……因为集成的环境毕竟是固定的,不利于自己的开发.好,废话少说咱现在 ...