2012年5月21日 星期一

[iOS Dev] 在 iOS 上透過程式碼寄送 E-mail


在 iOS 上面,如果要讓使用者可以寄送郵件,一般的做法是透過 openURL 的方式,把想要寄送的 Mail Address 兜成 URL,然後交給系統喚起相對應的 Mail 程式幫忙寄送。例如這樣:

[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];

其中,url 就是使用者自訂的 Mail Address 以及相關信件內容,以 URL 的方式串接起來。

在 iOS 3.2 之後,Apple 大人把 Mail 的 API 放出來了,所以現在我們可以透過程式來控制電子郵件的寄送,而不必離開自己的 App。

廢話不多說,我們就來看怎麼樣可以達到這樣的功能。

要做到程式碼裡面可以寄送信件,使用的是 MFMailComposeViewController 這個 Class 以及相關的 Method。

當然,要使用這個 Class,你需要做一些前置準備動作,第一個就是把這個 Class 所屬的 Framework 加到你的 Project 去。

再來,要在準備使用的程式裡面 include 相關的 header file (如果這一段你看不懂,表示你來錯地方了,快回去火星吧,地球很危險的)。

#import <MessageUI/MessageUI.h>

然後就可以準備相關的 Method 來讓 Mail 順利寄出。

主要的程序可以分成三部分,底下先列出來,讓您有個底。

1. 準備 MFMailComposeViewController 的實體
2. 設定相關的內容 (Mail Address, Contents, CC, Subject 之類)
3. 撰寫 Call Back Method ,讓 iOS 處理完之後可以通知你 Mail 寄送的狀況,或者使用者的動作
4. 把視窗 Dismiss 掉 (千萬要記得,不然 User 就「回不去了」)

底下分別針對各部分需要的程式碼,一一說明。

1. 準備 MFMailComposeViewController 的實體

你需要一個 MFMailComposeViewController 的 Object 來進行後續處理,可以透過類似底下這樣的程式碼 new 出一個:

MFMailComposeViewController *mailPicker = [[MFMailComposeViewController alloc] init];

之後相關的設定,都要透過這個 mailPicker 的物件進行操作。

如果是 iOS 有支援 ARC 的,照樣,就不用理會 release 的時間點了,不然這一段程式碼稍微有概念的就會立刻想到,要在某一個地方安插 release 的 Code。 (如果你這段話看不懂,那,真的來錯地方了,乖,去吃糖吧)

2. 設定相關的內容 (Mail Address, Contents, CC, Subject 之類)

上面我們已經把一個 MFMailComposeViewController 實體 New 出來了,接著我們就要對信件的內容進行設定。

    // 設定要出現的郵件視窗 Style
    mailPicker.navigationBar.barStyle = UIBarStyleBlack;

    // 設定出現的郵件視窗 Title
    [mailPicker setTitle:@"My Mail"];
    
    // 設定郵件主旨
    [mailPicker setSubject:@"Share your Chop"];

    // 設定郵件主體,emailBody 是一個 NSString ,內容就自己兜吧
    [mailPicker setMessageBody:emailBody isHTML:YES];

    // 可以把附件加入,指定檔名即可
    [mailPicker addAttachmentData:imageData mimeType:@"image/png" fileName:@"CameraImage"];

    // 設定副本群
    NSArray *ccArray = [NSArray arrayWithObjects:@"cc1@some.com", @"cc2@some.com",nil];
    [mailPicker setCcRecipients: ccArray];
    
    // 設定密件副本群
    NSArray *bccArray = [NSArray arrayWithObjects:@"bcc1@some2.com", @"bcc2@some2.com",nil];
    [mailPicker setBccRecipients: bccArray];


在上面的設定程式碼中,我們設定的都是針對 Mail 視窗相關的內容,這些內容我想看一下就瞭解怎麼用。

有一個重點,這邊要特別提出來講。在眾多的設定之後,我們需要多設定一個叫做 MFMailComposeViewControllerDelegate 的東西,方便 iOS 在處理完郵件寄送以及跟 User 的互動之後可以通知程式,並且讓程式有機會把剛叫出來的 Mail 視窗關掉。

類似底下這樣的程式碼:

    // 把 Mail 處理狀況回報的對象設定成目前所在的 Object
    // 前提是這個 Object 有 Implement MFMailComposeViewControllerDelegate
    mailPicker.mailComposeDelegate = self;

那這個 self 就必須要在宣告的時候加入 MFMailComposeViewControllerDelegate 這個 protocol,所以在 header file 那邊,記得要加上去。

類似這樣:
@interface MyHelloViewController : UIViewController 

最後,記得要把這個視窗叫出來,讓使用者可以透過它寄信。

[self presentModalViewController:picker animated:YES];

都完成之後,就可以進入下一步,來實作這個 Protocol 所需要的 Call back method。

3. 撰寫 Call Back Method ,讓 iOS 處理完之後可以通知你 Mail 寄送的狀況,或者使用者的動作

在 MFMailComposeViewControllerDelegate,我們需要實作 mailComposeController 這個 method,作為溝通的橋梁。

這個 Method 主要是用來處理 iOS 跟 User 互動完畢的結果,這部分我想不用太多解釋,直接看 Code 吧。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{ 
    // 根據回傳的結果決定對應的處理方式
    switch (result)
    {
        case MFMailComposeResultCancelled: // User Cancel 了
            break;
        case MFMailComposeResultSaved:  // User 儲存為草稿
            break;
        case MFMailComposeResultSent:  // Mail 成功寄出
            break;
        case MFMailComposeResultFailed:  // Mail 寄失敗
            break;
            
        default:
        {
            // 這邊你可以顯示一個 Alert 告訴 User 說 Mail 處理過程有問題
            break;
    }

    // !!!!重要!!!! -> 不做這一行的話,Mail 視窗是不會消失的
    [self dismissModalViewControllerAnimated:YES];
}

4. 把視窗 Dismiss 掉 (千萬要記得,不然 User 就「回不去了」)

這一點很重要,程式碼在上面那一段的 Source 裡面。

如果沒有加上這一行,理論上你的 Mail 視窗就會一直留在那邊,直到天荒地老啊。

所以嚕,無論如何,這一行一定要加上去,避免發生悲劇啊。

    // !!!!重要!!!! -> 不做這一行的話,Mail 視窗是不會消失的
    [self dismissModalViewControllerAnimated:YES];

整個透過程式碼寄送 Email 的過程大致上就是需要這一些動作兜起來,練習幾次,應該就可以無痛整合進入你的 App 裡面了。

這些知識我也是透過 Google 大神找出來的,留在這邊做個記錄,給自己看,也給需要的人。

有需要的,程式碼就自己拿去吧。
 



沒有留言:

張貼留言