OCiOS開發:發簡訊、發郵件、打電話及搖一搖實現
阿新 • • 發佈:2018-12-26
簡介
在iOS開發中,可能會用到發簡訊、發郵件、打電話及搖一搖等功能,比如在應用程式的‘關於’介面,我們可能會留下電話號碼或郵箱等聯絡方式,為了方便使用者直接在應用程式中做操作,提升使用者體驗,我們會設計一些互動動作,讓使用者輕鬆的去發簡訊、打電話或發郵件等。如下我將簡單介紹幾種功能的具體實現方法。需要注意的是,如下功能的實現必須通過真機除錯,模擬器暫不支援如上功能。
打電話
methods 1:直接跳轉到打電話介面
NSURL *url = [NSURL URLWithString:[@"tel://電話號碼"];
[[UIApplication sharedApplication] openURL:url];
缺陷:直接撥打,不提示。
methods 2:直接跳轉到打電話介面,有提示
NSURL *url = [NSURL URLWithString:[@"telprompt://電話號碼"];
[[UIApplication sharedApplication] openURL:url];
methods 3:基於UIWebView實現打電話功能,有提示
UIWebView *webView = [[UIWebView alloc] init];
NSURL *url = [NSURL URLWithString:[@"tel://電話號碼"];
[webView loadRequest:[NSURLRequest requestWithURL:url]] ;
[self.view addSubview:webView];
發簡訊
methods 1:直接跳轉到傳送簡訊介面
NSURL *url = [NSURL URLWithString:[@"sms://手機號碼"];
[[UIApplication sharedApplication] openURL:url];
缺陷:不能定義傳送簡訊的內容,且發完簡訊後不能自動回到原應用。
methods 2:使用 MessageUI 框架傳送簡訊
注意:需要包含標頭檔案 #import
MFMessageComposeViewController *msgVc = [[MFMessageComposeViewController alloc] init];
// 設定簡訊內容
msgVc.body = @"您好,今天天氣不錯,一起出去玩麼?";
// 設定收件人列表
msgVc.recipients = @[電話號碼];
// 設定代理
msgVc.messageComposeDelegate = self;
// 顯示控制器
[self presentViewController:msgVc animated:YES completion:nil];
}
實現代理方法:
// 點選取消按鈕會自動呼叫
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
[controller dismissViewControllerAnimated:YES completion:nil];
}
發郵件
methods 1:用自帶的郵件客戶端
NSURL *url = [NSURL URLWithString:[@"mailto://郵箱地址"];
[[UIApplication sharedApplication] openURL:url];
methods 2:使用 MessageUI 框架傳送郵件
// 異常處理
if (![MFMailComposeViewController canSendMail]) {
return;
}
MFMailComposeViewController *mailVc = [[MFMailComposeViewController alloc] init];
// 設定郵件主題
[mailVc setSubject:@"部門會議"];
// 設定郵件內容
[mailVc setMessageBody:@"下午3點半,召開部門會議,請準時參加。" isHTML:NO];
// 設定收件人列表
[mailVc setToRecipients:@[收件人郵箱地址]];
// 設定抄送人列表
[mailVc setCcRecipients:@[抄送人郵箱地址]];
// 設定代理
mailVc.mailComposeDelegate = self;
// 顯示控制器
[self presentViewController:mailVc animated:YES completion:nil];
實現代理方法
#pragma mark - MFMailComposeViewControllerDelegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[controller dismissViewControllerAnimated:YES completion:nil];
}
搖一搖
iOS本身支援搖一搖功能,在UIResponder中存在如下方法:
// 1、檢測到搖動
- (void)motionBegan:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
// 2、搖動結束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
// 3、搖動取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(nullable UIEvent *)event NS_AVAILABLE_IOS(3_0);
使用搖一搖功能實際很簡單,首先你只需呼叫如下方法讓控制器支援搖動即可:
[[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];
其次你還需將檢視控制器成為第一響應者,如下所示:
[self becomeFirstResponder];
程式碼示例:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[UIApplication sharedApplication] setApplicationSupportsShakeToEdit:YES];
[self becomeFirstResponder];
}
#pragma mark - Motion methos
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSLog(@"檢測到搖動");
}
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSLog(@"搖動取消");
}
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSLog(@"搖動結束");
if (event.subtype == UIEventSubtypeMotionShake) {
// 處理業務邏輯
}
}
@end
打電話、發簡訊、發郵件案例
效果展示
程式碼示例
#import "ViewController.h"
#import <MessageUI/MessageUI.h>
#define Screen_Width [UIScreen mainScreen].bounds.size.width
@interface ViewController () <MFMessageComposeViewControllerDelegate, MFMailComposeViewControllerDelegate>
@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) UIButton *callBtn;
@property (nonatomic, strong) UIButton *sendMsgBtn;
@property (nonatomic, strong) UIButton *sendEmailBtn;
- (void)initializeUserInterface; /**< 初始化使用者介面 */
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initializeUserInterface];
}
#pragma mark - Initialize
- (void)initializeUserInterface {
self.view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:self.textField];
[self.view addSubview:self.callBtn];
[self.view addSubview:self.sendMsgBtn];
[self.view addSubview:self.sendEmailBtn];
}
#pragma mark - Events
- (void)respondsToCallBtn:(UIButton *)sender {
[self.view endEditing:YES];
NSString *phoneNumber = self.textField.text;
// 方法一:
// NSURL *url = [NSURL URLWithString:[@"tel://" stringByAppendingString:phoneNumber]];
// [[UIApplication sharedApplication] openURL:url];
// 方法二:
// NSURL *url = [NSURL URLWithString:[@"telprompt://" stringByAppendingString:phoneNumber]];
// [[UIApplication sharedApplication] openURL:url];
// 方法三:
UIWebView *webView = [[UIWebView alloc] init];
NSURL *url = [NSURL URLWithString:[@"tel://" stringByAppendingString:phoneNumber]];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
[self.view addSubview:webView];
}
- (void)respondsToSendMsgBtn:(UIButton *)sender {
[self.view endEditing:YES];
NSString *phoneNumber = self.textField.text;
// 方法一:直接跳轉到發簡訊介面
// 缺點:不能定義傳送簡訊的內容,且發完簡訊後不能自動回到原應用。
// NSURL *url = [NSURL URLWithString:[@"sms://" stringByAppendingString:phoneNumber]];
// [[UIApplication sharedApplication] openURL:url];
// 方法二:使用MessageUI 框架傳送簡訊,需要包含標頭檔案 #import <MessageUI/MessageUI.h>
MFMessageComposeViewController *msgVc = [[MFMessageComposeViewController alloc] init];
// 設定簡訊內容
msgVc.body = @"您好,今天天氣不錯,一起出去玩麼?";
// 設定收件人列表
msgVc.recipients = @[phoneNumber];
// 設定代理
msgVc.messageComposeDelegate = self;
// 顯示控制器
[self presentViewController:msgVc animated:YES completion:nil];
}
- (void)respondsToSendEamilBtn:(UIButton *)sender {
[self.view endEditing:YES];
NSString *email = self.textField.text;
// 方法一:用自帶的郵件客戶端
// 缺點:發完郵件後不會自動回到原應用
NSURL *url = [NSURL URLWithString:[@"mailto://" stringByAppendingString:email]];
[[UIApplication sharedApplication] openURL:url];
// 方法二:類似於發簡訊的第二種方法
// 異常處理
/*
if (![MFMailComposeViewController canSendMail]) {
return;
}
MFMailComposeViewController *mailVc = [[MFMailComposeViewController alloc] init];
// 設定郵件主題
[mailVc setSubject:@"部門會議"];
// 設定郵件內容
[mailVc setMessageBody:@"下午3點半,召開部門會議,請準時參加。" isHTML:NO];
// 設定收件人列表
[mailVc setToRecipients:@[email]];
// 設定抄送人列表
[mailVc setCcRecipients:@[]];
// 設定代理
mailVc.mailComposeDelegate = self;
// 顯示控制器
[self presentViewController:mailVc animated:YES completion:nil];
*/
}
#pragma mark - Touches
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
#pragma mark - MFMessageComposeViewControllerDelegate
// 點選取消按鈕會自動呼叫
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
[controller dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - MFMailComposeViewControllerDelegate
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[controller dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - Getters
// 打電話佈局
- (UITextField *)textField {
if (!_textField) {
_textField = [[UITextField alloc] init];
_textField.bounds = CGRectMake(0, 0, Screen_Width * 0.85, 45);
_textField.center = CGPointMake(Screen_Width * 0.5, 64 + CGRectGetMidY(_textField.bounds) + 10);
_textField.textAlignment = NSTextAlignmentCenter;
_textField.placeholder = @"請輸入手機號碼或郵箱";
_textField.clearButtonMode = UITextFieldViewModeWhileEditing;
_textField.borderStyle = UITextBorderStyleBezel;
}
return _textField;
}
- (UIButton *)callBtn {
if (!_callBtn) {
_callBtn = [UIButton buttonWithType:UIButtonTypeSystem];
_callBtn.bounds = CGRectMake(0, 0, 100, 30);
_callBtn.center = CGPointMake(Screen_Width * 0.5, CGRectGetMaxY(self.textField.frame) + CGRectGetMidX(_callBtn.bounds) + 20);
_callBtn.titleLabel.font = [UIFont boldSystemFontOfSize:20];
[_callBtn setTitle:@"撥打電話" forState:UIControlStateNormal];
[_callBtn addTarget:self action:@selector(respondsToCallBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _callBtn;
}
// 發訊息
- (UIButton *)sendMsgBtn {
if (!_sendMsgBtn) {
_sendMsgBtn = [UIButton buttonWithType:UIButtonTypeSystem];
_sendMsgBtn.bounds = CGRectMake(0, 0, 100, 30);
_sendMsgBtn.center = CGPointMake(Screen_Width * 0.5, CGRectGetMaxY(self.callBtn.frame) + CGRectGetMidY(_sendMsgBtn.bounds) + 20);
_sendMsgBtn.titleLabel.font = [UIFont boldSystemFontOfSize:20];
[_sendMsgBtn setTitle:@"傳送資訊" forState:UIControlStateNormal];
[_sendMsgBtn addTarget:self action:@selector(respondsToSendMsgBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _sendMsgBtn;
}
// 發郵件
- (UIButton *)sendEmailBtn {
if (!_sendEmailBtn) {
_sendEmailBtn = [UIButton buttonWithType:UIButtonTypeSystem];
_sendEmailBtn.bounds = CGRectMake(0, 0, 100, 30);
_sendEmailBtn.center = CGPointMake(Screen_Width * 0.5, CGRectGetMaxY(self.sendMsgBtn.frame) + CGRectGetMidY(_sendEmailBtn.bounds) + 20);
_sendEmailBtn.titleLabel.font = [UIFont boldSystemFontOfSize:20];
[_sendEmailBtn setTitle:@"傳送郵件" forState:UIControlStateNormal];
[_sendEmailBtn addTarget:self action:@selector(respondsToSendEamilBtn:) forControlEvents:UIControlEventTouchUpInside];
}
return _sendEmailBtn;
}
@end