今天把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.打電話不回引用
復制代碼
1 - (void)tel1
2 {
3 // 直接撥號,撥號完成後會停留在通話記錄中
4 NSURL *url = [NSURL URLWithString:@"tel://10010"];
5
6 [[UIApplication sharedApplication] openURL:url];
7 }
復制代碼
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];
}