系統應用於系統服務javascript
系統應用java
在開發某些應用時可能但願可以調用iOS系統內置的電話、短信、郵件、瀏覽器應用,此時你能夠直接使用UIApplication的OpenURL:方法指定特定的協議來打開不一樣的系統應用。經常使用的協議以下:編程
打電話:tel:或者tel://、telprompt:或telprompt://(撥打電話前有提示)瀏覽器
發短信:sms:或者sms://app
發送郵件:mailto:或者mailto://框架
啓動瀏覽器:http:或者http://ide
1 下面以一個簡單的demo演示如何調用上面幾種系統應用: 2 // 3 // ViewController.m 4 // iOSSystemApplication 5 // 6 // Created by Kenshin Cui on 14/04/05. 7 // Copyright (c) 2014年 cmjstudio. All rights reserved. 8 // 9 #import "ViewController.h" 10 @interface ViewController () 11 @end 12 @implementation ViewController 13 - (void)viewDidLoad { 14 [super viewDidLoad]; 15 } 16 #pragma mark - UI事件 17 //打電話 18 - (IBAction)callClicK:(UIButton *)sender { 19 NSString *phoneNumber=@"18500138888"; 20 // NSString *url=[NSString stringWithFormat:@"tel://%@",phoneNumber];//這種方式會直接撥打電話 21 NSString *url=[NSString stringWithFormat:@"telprompt://%@",phoneNumber];//這種方式會提示用戶確認是否撥打電話 22 [self openUrl:url]; 23 } 24 //發送短信 25 - (IBAction)sendMessageClick:(UIButton *)sender { 26 NSString *phoneNumber=@"18500138888"; 27 NSString *url=[NSString stringWithFormat:@"sms://%@",phoneNumber]; 28 [self openUrl:url]; 29 } 30 //發送郵件 31 - (IBAction)sendEmailClick:(UIButton *)sender { 32 NSString *mailAddress=@"kenshin@hotmail.com"; 33 NSString *url=[NSString stringWithFormat:@"mailto://%@",mailAddress]; 34 [self openUrl:url]; 35 } 36 //瀏覽網頁 37 - (IBAction)browserClick:(UIButton *)sender { 38 NSString *url=@"http://www.cnblogs.com/kenshincui"; 39 [self openUrl:url]; 40 } 41 #pragma mark - 私有方法 42 -(void)openUrl:(NSString *)urlStr{ 43 //注意url中包含協議名稱,iOS根據協議肯定調用哪一個應用,例如發送郵件是「sms://」其中「//」能夠省略寫成「sms:」(其餘協議也是如此) 44 NSURL *url=[NSURL URLWithString:urlStr]; 45 UIApplication *application=[UIApplication sharedApplication]; 46 if(![application canOpenURL:url]){ 47 NSLog(@"沒法打開\"%@\",請確保此應用已經正確安裝.",url); 48 return; 49 } 50 [[UIApplication sharedApplication] openURL:url]; 51 } 52 @end
不 難發現當openURL:方法只要指定一個URL Schame而且已經安裝了對應的應用程序就能夠打開此應用。固然,若是是本身開發的應用也能夠調用openURL方法來打開。假設你如今開發了一個應用 A,若是用戶機器上已經安裝了此應用,而且在應用B中但願可以直接打開A。那麼首先須要確保應用A已經配置了Url Types,具體方法就是在plist文件中添加URL types節點並配置URL Schemas做爲具體協議,配置URL identifier做爲這個URL的惟一標識,以下圖:ui
而後就能夠調用openURL方法像打開系統應用同樣打開第三方應用程序了:this
1 //打開第三方應用 2 - (IBAction)thirdPartyApplicationClick:(UIButton *)sender { 3 NSString *url=@"cmj://myparams"; 4 [self openUrl:url]; 5 }
就 像調用系統應用同樣,協議後面能夠傳遞一些參數(例如上面傳遞的myparams),這樣一來在應用中能夠在AppDelegate的 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)urlatom
1 sourceApplication:(NSString *)sourceApplication annotation:(id)annotation代理方法中接收參數並解析。 2 -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 3 NSString *str=[NSString stringWithFormat:@"url:%@,source application:%@,params:%@",url,sourceApplication,[url host]]; 4 NSLog(@"%@",str); 5 return YES;//是否打開 6 }
系統服務
短信與郵件
調 用系統內置的應用來發送短信、郵件至關簡單,可是這麼操做也存在着一些弊端:當你點擊了發送短信(或郵件)操做以後直接啓動了系統的短信(或郵件)應用程 序,咱們的應用其實此時已經處於一種掛起狀態,發送完(短信或郵件)以後沒法自動回到應用界面。若是想要在應用程序內部完成這些操做則能夠利用iOS中的 MessageUI.framework,它提供了關於短信和郵件的UI接口供開發者在應用程序內部調用。從框架名稱不難看出這是一套UI接口,提供有現 成的短信和郵件的編輯界面,開發人員只須要經過編程的方式給短信和郵件控制器設置對應的參數便可。
在 MessageUI.framework中主要有兩個控制器類分別用於發送短信(MFMessageComposeViewController)和郵件 (MFMailComposeViewController),它們均繼承於UINavigationController。因爲兩個類使用方法十分類 似,這裏主要介紹一下MFMessageComposeViewController使用步驟:
建立MFMessageComposeViewController對象。
設置收件人recipients、信息正文body,若是運行商支持主題和附件的話能夠設置主題subject、附件attachments(能夠經過canSendSubject、canSendAttachments方法判斷是否支持)
設 置代理messageComposeDelegate(注意這裏不是delegate屬性,由於delegate屬性已經留給 UINavigationController,MFMessageComposeViewController沒有覆蓋此屬性而是從新定義了一個代 理),實現代理方法得到發送狀態。
下面自定義一個發送短信的界面演示MFMessageComposeViewController的使用:
用 戶經過在此界面輸入短信信息點擊「發送信息」調用MFMessageComposeViewController界面來展現或進一步編輯信息,點擊 MFMessageComposeViewController中的「發送」來完成短信發送工做,固然用戶也可能點擊「取消」按鈕回到前一個短信編輯頁 面。
實現代碼:
1 // 2 // KCSendMessageViewController.m 3 // iOSSystemApplication 4 // 5 // Created by Kenshin Cui on 14/04/05. 6 // Copyright (c) 2014年 cmjstudio. All rights reserved. 7 // 8 #import "KCSendMessageViewController.h" 9 #import 10 @interface KCSendMessageViewController () 11 @property (weak, nonatomic) IBOutlet UITextField *receivers; 12 @property (weak, nonatomic) IBOutlet UITextField *body; 13 @property (weak, nonatomic) IBOutlet UITextField *subject; 14 @property (weak, nonatomic) IBOutlet UITextField *attachments; 15 @end 16 @implementation KCSendMessageViewController 17 #pragma mark - 控制器視圖方法 18 - (void)viewDidLoad { 19 [super viewDidLoad]; 20 21 } 22 #pragma mark - UI事件 23 - (IBAction)sendMessageClick:(UIButton *)sender { 24 //若是能發送文本信息 25 if([MFMessageComposeViewController canSendText]){ 26 MFMessageComposeViewController *messageController=[[MFMessageComposeViewController alloc]init]; 27 //收件人 28 messageController.recipients=[self.receivers.text componentsSeparatedByString:@","]; 29 //信息正文 30 messageController.body=self.body.text; 31 //設置代理,注意這裏不是delegate而是messageComposeDelegate 32 messageController.messageComposeDelegate=self; 33 //若是運行商支持主題 34 if([MFMessageComposeViewController canSendSubject]){ 35 messageController.subject=self.subject.text; 36 } 37 //若是運行商支持附件 38 if ([MFMessageComposeViewController canSendAttachments]) { 39 /*第一種方法*/ 40 //messageController.attachments=...; 41 42 /*第二種方法*/ 43 NSArray *attachments= [self.attachments.text componentsSeparatedByString:@","]; 44 if (attachments.count>0) { 45 [attachments enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 46 NSString *path=[[NSBundle mainBundle]pathForResource:obj ofType:nil]; 47 NSURL *url=[NSURL fileURLWithPath:path]; 48 [messageController addAttachmentURL:url withAlternateFilename:obj]; 49 }]; 50 } 51 52 /*第三種方法*/ 53 // NSString *path=[[NSBundle mainBundle]pathForResource:@"photo.jpg" ofType:nil]; 54 // NSURL *url=[NSURL fileURLWithPath:path]; 55 // NSData *data=[NSData dataWithContentsOfURL:url]; 56 /** 57 * attatchData:文件數據 58 * uti:統一類型標識,標識具體文件類型,詳情查看:幫助文檔中System-Declared Uniform Type Identifiers 59 * fileName:展示給用戶看的文件名稱 60 */ 61 // [messageController addAttachmentData:data typeIdentifier:@"public.image" filename:@"photo.jpg"]; 62 } 63 [self presentViewController:messageController animated:YES completion:nil]; 64 } 65 } 66 #pragma mark - MFMessageComposeViewController代理方法 67 //發送完成,無論成功與否 68 -(void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{ 69 switch (result) { 70 case MessageComposeResultSent: 71 NSLog(@"發送成功."); 72 break; 73 case MessageComposeResultCancelled: 74 NSLog(@"取消發送."); 75 break; 76 default: 77 NSLog(@"發送失敗."); 78 break; 79 } 80 [self dismissViewControllerAnimated:YES completion:nil]; 81 } 82 @end
這裏須要強調一下:
MFMessageComposeViewController的代理不是經過delegate屬性指定的而是經過messageComposeDelegate指定的。
能夠經過幾種方式來指定發送的附件,在這個過程當中請務必指定文件的後綴,不然在發送後沒法正確識別文件類別(例如若是發送的是一張jpg圖片,在發送後沒法正確查看圖片)。
無 論發送成功與否代理方法-(void)messageComposeViewController: (MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result都會執行,經過代理參數中的result來得到發送 狀態。
其實只要熟悉了MFMessageComposeViewController以後,那麼用於發送郵件的 MFMailComposeViewController用法和步驟徹底一致,只是功能不一樣。下面看一下 MFMailComposeViewController的使用:
1 // 2 // KCSendEmailViewController.m 3 // iOSSystemApplication 4 // 5 // Created by Kenshin Cui on 14/04/05. 6 // Copyright (c) 2014年 cmjstudio. All rights reserved. 7 // 8 #import "KCSendEmailViewController.h" 9 #import 10 @interface KCSendEmailViewController () 11 @property (weak, nonatomic) IBOutlet UITextField *toTecipients;//收件人 12 @property (weak, nonatomic) IBOutlet UITextField *ccRecipients;//抄送人 13 @property (weak, nonatomic) IBOutlet UITextField *bccRecipients;//密送人 14 @property (weak, nonatomic) IBOutlet UITextField *subject; //主題 15 @property (weak, nonatomic) IBOutlet UITextField *body;//正文 16 @property (weak, nonatomic) IBOutlet UITextField *attachments;//附件 17 @end 18 @implementation KCSendEmailViewController 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 } 22 #pragma mark - UI事件 23 - (IBAction)sendEmailClick:(UIButton *)sender { 24 //判斷當前是否可以發送郵件 25 if ([MFMailComposeViewController canSendMail]) { 26 MFMailComposeViewController *mailController=[[MFMailComposeViewController alloc]init]; 27 //設置代理,注意這裏不是delegate,而是mailComposeDelegate 28 mailController.mailComposeDelegate=self; 29 //設置收件人 30 [mailController setToRecipients:[self.toTecipients.text componentsSeparatedByString:@","]]; 31 //設置抄送人 32 if (self.ccRecipients.text.length>0) { 33 [mailController setCcRecipients:[self.ccRecipients.text componentsSeparatedByString:@","]]; 34 } 35 //設置密送人 36 if (self.bccRecipients.text.length>0) { 37 [mailController setBccRecipients:[self.bccRecipients.text componentsSeparatedByString:@","]]; 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 [attachments enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 47 NSString *file=[[NSBundle mainBundle] pathForResource:obj ofType:nil]; 48 NSData *data=[NSData dataWithContentsOfFile:file]; 49 [mailController addAttachmentData:data mimeType:@"image/jpeg" fileName:obj];//第二個參數是mimeType類型,jpg圖片對應image/jpeg 50 }]; 51 } 52 [self presentViewController:mailController animated:YES completion:nil]; 53 54 } 55 } 56 #pragma mark - MFMailComposeViewController代理方法 57 -(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{ 58 switch (result) { 59 case MFMailComposeResultSent: 60 NSLog(@"發送成功."); 61 break; 62 case MFMailComposeResultSaved://若是存儲爲草稿(點取消會提示是否存儲爲草稿,存儲後能夠到系統郵件應用的對應草稿箱找到) 63 NSLog(@"郵件已保存."); 64 break; 65 case MFMailComposeResultCancelled: 66 NSLog(@"取消發送."); 67 break; 68 69 default: 70 NSLog(@"發送失敗."); 71 break; 72 } 73 if (error) { 74 NSLog(@"發送郵件過程當中發生錯誤,錯誤信息:%@",error.localizedDescription); 75 } 76 [self dismissViewControllerAnimated:YES completion:nil]; 77 } 78 @end
運行效果: