iOS學(xué)習(xí)筆記28-系統(tǒng)服務(wù)(一)短信和郵件

一碗暗、系統(tǒng)應(yīng)用

在開發(fā)某些應(yīng)用時(shí)颈将,我們可能希望能夠調(diào)用iOS系統(tǒng)內(nèi)置的電話、短信言疗、郵件晴圾、瀏覽器應(yīng)用,或者直接調(diào)用安裝的第三方應(yīng)用噪奄,這個(gè)要怎么實(shí)現(xiàn)呢死姚?

這里統(tǒng)一使用UIApplication的一個(gè)對(duì)象方法來實(shí)現(xiàn):
//打開不同的系統(tǒng)應(yīng)用
- (void)openUrl:(NSURL *)url;

那怎么區(qū)分我是要打電話還是發(fā)短信等等呢?
之前我們學(xué)習(xí)網(wǎng)絡(luò)的時(shí)候勤篮,是不是URL最前面使用的是http://都毒,使用本地文件是不是前面就變成file://了,這就是URL的協(xié)議碰缔,我們就是控制URL的協(xié)議账劲,來打開不同應(yīng)用。

下面列出了一些系統(tǒng)應(yīng)用URL協(xié)議:
  1. tel://tel:打電話手负,沒有提示直接撥打
  1. telprompt://telprompt:打電話涤垫,撥打電話前有提示用戶是否撥打電話
  2. sms://sms:發(fā)短信
  3. mailto://mailto:發(fā)郵件
  4. http://http:打開瀏覽器
下面就是具體實(shí)例演示:
1. 有提示的打電話
//打電話
- (void)telpromptTest{
    //電話號(hào)碼
    NSString *phoneNumber = @"18500138888";
    //1.創(chuàng)建打電話URL路徑,這種方式會(huì)提示用戶確認(rèn)是否撥打電話
    NSString *urlStr = [NSString stringWithFormat:@"telprompt://%@",phoneNumber];
    //2.生成URL
    NSURL *url = [NSURL URLWithString:urlStr];
    //3.打開系統(tǒng)應(yīng)用
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:url];
}
2. 發(fā)短信
//發(fā)送短信
- (void)sendMessageTest{
    //電話號(hào)碼
    NSString *phoneNumber = @"18500138888";
    //1.創(chuàng)建發(fā)短信URL路徑
    NSString *urlStr = [NSString stringWithFormat:@"sms://%@",phoneNumber];
    //2.生成URL
    NSURL *url = [NSURL URLWithString:urlStr];
    //3.打開系統(tǒng)應(yīng)用
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:url];
}
3. 發(fā)郵件
//發(fā)送郵件
- (void)sendEmailTest {
    NSString *mailAddress = @"850192964@qq.com";
    //1.創(chuàng)建發(fā)郵件URL路徑
    NSString *urlStr = [NSString stringWithFormat:@"mailto://%@",mailAddress];
    //2.生成URL
    NSURL *url = [NSURL URLWithString:urlStr];
    //3.打開系統(tǒng)應(yīng)用
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:url];
}
4. 打開瀏覽器
//瀏覽網(wǎng)頁
- (void)browserTest {
    //1.創(chuàng)建打開瀏覽器URL路徑
    NSString *urlStr = @"http://www.baidu.com";
    //2.生成URL
    NSURL *url = [NSURL URLWithString:urlStr];
    //3.打開系統(tǒng)應(yīng)用
    UIApplication *application = [UIApplication sharedApplication];
    [application openURL:url];
}

上面打開的是系統(tǒng)應(yīng)用竟终,實(shí)際上openUrl的功能是只要是系統(tǒng)安裝了的應(yīng)用程序蝠猬,都可以打開,比如假設(shè)你現(xiàn)在開發(fā)了一個(gè)應(yīng)用A统捶,如果用戶機(jī)器上已經(jīng)安裝了此應(yīng)用榆芦,并且在應(yīng)用B中希望能夠直接打開A,也是可以用openUrl實(shí)現(xiàn)喘鸟,不過要進(jìn)行一些配置匆绣。

配置第三方應(yīng)用步驟:
  1. 修改應(yīng)用A的info.plist文件,添加URL types節(jié)點(diǎn)
  1. 在該節(jié)點(diǎn)下什黑,配置具體協(xié)議URL Schemas以及應(yīng)用A的唯一標(biāo)識(shí)URL identifier崎淳,如下圖:
  2. 在應(yīng)用A的AppDelegate文件中處理AppDelegate的一個(gè)代理方法
/* 
      當(dāng)被其他應(yīng)用程序通過URL打開時(shí)就會(huì)調(diào)用,
      這里可以接收參數(shù)并解析愕把,返回是否能被其他應(yīng)用程序打開
 */
-(BOOL)application:(UIApplication *)application //當(dāng)前應(yīng)用程序
            openURL:(NSURL *)url //其他應(yīng)用使用的URL
    sourceApplication:(NSString *)sourceApplication //其他應(yīng)用的應(yīng)用標(biāo)識(shí)
           annotation:(id)annotation
{
        NSLog(@"url:%@",url);
        NSLog(@"source:%@",sourceApplication);
        NSLog(@"params:%@",[url host]);
        return YES;//是否打開
}
配置應(yīng)用A完成拣凹,然后我們就可以在應(yīng)用B中使用openUrl打開應(yīng)用A了
//打開第三方應(yīng)用
- (void)thirdPartyApplicationTest 
{    
    //使用第三方應(yīng)用協(xié)議
    NSString *urlStr = @"cmj://myparams";
    NSURL *url = [NSURL URLWithString:urlStr];
    //判斷該應(yīng)用是否能打開
    UIApplication *application = [UIApplication sharedApplication];
    if(![application canOpenURL:url]){
        NSLog(@"無法打開\"%@\"森爽,請(qǐng)確保此應(yīng)用已經(jīng)正確安裝.",url);
        return;
    }
    [application openURL:url];
}

二、系統(tǒng)服務(wù)

調(diào)用系統(tǒng)內(nèi)置的應(yīng)用來發(fā)送短信嚣镜、郵件相當(dāng)簡(jiǎn)單爬迟,但是這么操作也存在著一些弊端:

當(dāng)你點(diǎn)擊了發(fā)送短信(或郵件)操作之后,直接啟動(dòng)了系統(tǒng)的短信(或郵件)應(yīng)用程序菊匿,我們的應(yīng)用其實(shí)此時(shí)已經(jīng)處于一種掛起狀態(tài)付呕,發(fā)送完(短信或郵件)之后無法自動(dòng)回到應(yīng)用界面。

如果想要在應(yīng)用程序內(nèi)部完成這些操作跌捆,則可以利用iOS中的MessageUI.framework徽职,它提供了關(guān)于短信和郵件的UI接口供開發(fā)者在應(yīng)用程序內(nèi)部調(diào)用。

MessageUI.framework提供了有現(xiàn)成的短信和郵件的編輯界面疹蛉,開發(fā)人員只需要通過編程的方式給短信和郵件控制器設(shè)置對(duì)應(yīng)的參數(shù)即可活箕。

1、短信

MessageUI.framework中使用MFMessageComposeViewController來發(fā)短信

下面是使用步驟:
  1. 導(dǎo)入MessageUI.framework可款,并添加頭文件
#import <MessageUI/MessageUI.h>
  1. 創(chuàng)建MFMessageComposeViewController對(duì)象
  2. 設(shè)置收件人育韩、信息正文等內(nèi)容屬性,設(shè)置代理messageComposeDelegate
  3. 以模態(tài)彈出該視圖控制器
  4. 處理代理方法闺鲸,獲取發(fā)送狀態(tài):
/* 發(fā)送完成會(huì)調(diào)用筋讨,不管成功與否 */
-(void)messageComposeViewController:(MFMessageComposeViewController *)controller 
                   didFinishWithResult:(MessageComposeResult)result;/*發(fā)送結(jié)果*/
下面是使用實(shí)例:
#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 {
    //如果不能發(fā)送文本信息,就直接返回
    if(![MFMessageComposeViewController canSendText]){
        return;
    }
    //創(chuàng)建短信發(fā)送視圖控制器
    MFMessageComposeViewController *messageController = 
                    [[MFMessageComposeViewController alloc] init];
    //設(shè)置收件人
    messageController.recipients = [self.receivers.text componentsSeparatedByString:@","];
    //設(shè)置信息正文
    messageController.body = self.body.text;
    //設(shè)置代理,注意這里不是delegate而是messageComposeDelegate
    messageController.messageComposeDelegate = self;
    //判斷是否支持主題
    if([MFMessageComposeViewController canSendSubject]){
        //設(shè)置主題
        messageController.subject = self.subject.text;
    }
    //判斷是否支持附件
    if ([MFMessageComposeViewController canSendAttachments]) {
        //添加附件摸恍,請(qǐng)務(wù)必指定附件文件的后綴悉罕,否則在發(fā)送后無法正確識(shí)別文件類別
        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];
                //添加附件具體方法,需要設(shè)置附件URL和附件的標(biāo)識(shí)
                [messageController addAttachmentURL:url 
                              withAlternateFilename:attachment];
            };
        }
    }
    //以模態(tài)彈出界面
    [self presentViewController:messageController animated:YES completion:nil];
}
#pragma mark - MFMessageComposeViewController代理方法
/* 發(fā)送完成立镶,不管成功與否 */
-(void)messageComposeViewController:(MFMessageComposeViewController *)controller 
                didFinishWithResult:(MessageComposeResult)result
{
    switch (result) {
        case MessageComposeResultSent:
            NSLog(@"發(fā)送成功.");
            break;
        case MessageComposeResultCancelled:
            NSLog(@"取消發(fā)送.");
            break;
        default:
            NSLog(@"發(fā)送失敗.");
            break;
    }
    //彈回界面
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end
效果顯示壁袄,左邊點(diǎn)擊發(fā)送信息,跳轉(zhuǎn)到右邊媚媒,右邊點(diǎn)擊發(fā)送嗜逻,就會(huì)發(fā)送短信

2. 郵件

MessageUI.framework中使用MFMailComposeViewController來發(fā)郵件

使用步驟【和發(fā)短信相似】:
  1. 導(dǎo)入MessageUI.framework,并添加頭文件
#import <MessageUI/MessageUI.h>
  1. 創(chuàng)建MFMailComposeViewController對(duì)象
  2. 設(shè)置收件人缭召、抄送人栈顷、正文等內(nèi)容屬性,設(shè)置代理mailComposeDelegate
  3. 以模態(tài)彈出該視圖控制器
  4. 處理代理方法嵌巷,獲取發(fā)送狀態(tài):
/* 發(fā)送完成會(huì)調(diào)用萄凤,不管成功與否 */
-(void)mailComposeController:(MFMailComposeViewController *)controller 
            didFinishWithResult:(MFMailComposeResult)result /* 發(fā)送結(jié)果 */
                          error:(NSError *)error;/* 錯(cuò)誤信息 */
下面是實(shí)例:
#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 {
    //判斷當(dāng)前是否能夠發(fā)送郵件
    if ([MFMailComposeViewController canSendMail]) {
        return;
    }
    //創(chuàng)建發(fā)送郵件視圖控制器
    MFMailComposeViewController *mailController = 
                    [[MFMailComposeViewController alloc] init];
    //設(shè)置代理,注意這里不是delegate搪哪,而是mailComposeDelegate
    mailController.mailComposeDelegate = self;
    //設(shè)置收件人
    NSArray *recipients = [self.toTecipients.text componentsSeparatedByString:@","];
    [mailController setToRecipients:recipients];
    //設(shè)置抄送人
    if (self.ccRecipients.text.length > 0) {
        NSArray *ccRecipients = [self.ccRecipients.text componentsSeparatedByString:@","];
        [mailController setCcRecipients:ccRecipients];
    }
    //設(shè)置密送人
    if (self.bccRecipients.text.length > 0) {
        NSArray *bccRecipients = [self.bccRecipients.text componentsSeparatedByString:@","];
        [mailController setBccRecipients:bccRecipients];
    }
    //設(shè)置主題
    [mailController setSubject:self.subject.text];
    //設(shè)置主體內(nèi)容
    [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];
            //第一個(gè)參數(shù)是附件數(shù)據(jù)靡努,第二個(gè)參數(shù)是mimeType類型,jpg圖片對(duì)應(yīng)image/jpeg
            [mailController addAttachmentData:data 
                                     mimeType:@"image/jpeg" 
                                     fileName:attachment];
        };
    }
    //彈出視圖
    [self presentViewController:mailController animated:YES completion:nil];
}

#pragma mark - MFMailComposeViewController代理方法
/* 發(fā)送完成會(huì)調(diào)用,不管成功與否 */
-(void)mailComposeController:(MFMailComposeViewController *)controller 
         didFinishWithResult:(MFMailComposeResult)result 
                       error:(NSError *)error
{
    switch (result) {
        case MFMailComposeResultSent:
            NSLog(@"發(fā)送成功.");
            break;
        case MFMailComposeResultSaved:
            //點(diǎn)取消會(huì)提示是否存儲(chǔ)為草稿颤难,存儲(chǔ)后可以到系統(tǒng)郵件應(yīng)用的對(duì)應(yīng)草稿箱找到
            NSLog(@"郵件已保存.");
            break;
        case MFMailComposeResultCancelled:
            NSLog(@"取消發(fā)送.");
            break;
        default:
            NSLog(@"發(fā)送失敗.");
            break;
    }
    if (error) {
        NSLog(@"發(fā)送郵件過程中發(fā)生錯(cuò)誤神年,錯(cuò)誤信息:%@",error.localizedDescription);
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end
效果顯示已维,左邊點(diǎn)擊發(fā)送郵件行嗤,跳轉(zhuǎn)到右邊,右邊點(diǎn)擊發(fā)送垛耳,就會(huì)發(fā)送郵件

上面的代碼Demo點(diǎn)這里:LearnDemo里面的MessageUITest

如果有什么問題可以在下方評(píng)論區(qū)中提出栅屏,求關(guān)注!O(∩_∩)O哈堂鲜!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栈雳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缔莲,更是在濱河造成了極大的恐慌哥纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痴奏,死亡現(xiàn)場(chǎng)離奇詭異蛀骇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)读拆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門擅憔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人檐晕,你說我怎么就攤上這事暑诸。” “怎么了辟灰?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵个榕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我芥喇,道長(zhǎng)西采,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任乃坤,我火速辦了婚禮苛让,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湿诊。我一直安慰自己狱杰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布厅须。 她就那樣靜靜地躺著仿畸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上错沽,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天簿晓,我揣著相機(jī)與錄音,去河邊找鬼千埃。 笑死憔儿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的放可。 我是一名探鬼主播谒臼,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼耀里!你這毒婦竟也來了蜈缤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤冯挎,失蹤者是張志新(化名)和其女友劉穎底哥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體房官,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾徽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了易阳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片附较。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖潦俺,靈堂內(nèi)的尸體忽然破棺而出拒课,到底是詐尸還是另有隱情,我是刑警寧澤事示,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布早像,位于F島的核電站,受9級(jí)特大地震影響肖爵,放射性物質(zhì)發(fā)生泄漏卢鹦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一劝堪、第九天 我趴在偏房一處隱蔽的房頂上張望冀自。 院中可真熱鬧,春花似錦秒啦、人聲如沸熬粗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驻呐。三九已至灌诅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間含末,已是汗流浹背猜拾。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佣盒,地道東北人挎袜。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沼撕,于是被迫代替她去往敵國和親宋雏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容