1. 程式人生 > >OCiOS開發:發簡訊、發郵件、打電話及搖一搖實現

OCiOS開發:發簡訊、發郵件、打電話及搖一搖實現

簡介

在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