如何在應用中經過郵件輸入和輸出數據

這篇文章還能夠在這裏找到 英語html

Load Attachments In Your App!

Load Attachments In Your App!ios

不少開發者都但願可以經過電子郵件分享他們的應用數據。這對用戶用戶之間以及設備之間的數據傳輸來講是一個很方便的方法--它甚至能夠爲你帶來一些新的用戶。
幸運的是,在iPhone應用開發裏這是很容易實現的 -- 你只須要在Info.plist裏設置幾個key,而且處理幾個回傳函數使控制系統能夠經過URL引入數據來開啓應用。
咱們將會在這篇教程裏講解這些是如何實現的。
咱們將會由the Scary Bugs項目開始講解。咱們在簡單應用教程中開始了這個項目,而且在文件分享教程中對它進行了更新。
若是你尚未這個項目,能夠在這裏下載。
app

設定你的Info.plist

咱們已經爲了支持郵件分享應用數據作了許多準備工做--咱們已經寫好代碼將應用的數據保存了一個獨立的副本。
因此下一步須要作的就是設定Info.plist讓操做系統知道咱們能夠處理」Scary Bug 的文件」。具體的操做就是將你的應用註冊爲能夠處理特定UTI,而且將系統不知道的UTI引出。
總的來講,UTI就是表明你的文件的惟一標識符,就如同」com.raywenderlich.scarybugs.sbz」同樣。一些常見的文件類型,如」public.jpeg」和」public.html」,還有它們本身的內置UTI。
接下來咱們會將應用註冊爲「能夠處理咱們本身生成的UTI的應用」,而後咱們會將UTI的信息告訴操做系統,好比它所使用的文件擴展名以及它在email編碼中所使用的MIME類型。
如今讓咱們來看看具體怎麼操做吧!打開ScaryBugs-Info.plist,而且添加如下條目:
Info.plist Setup for App Documents
你能夠從Apple的UTI手冊中查到這些值都是什麼含義,可是你要注意如下幾點:iphone

  • CFBundleDocumentTypes條目的意思是咱們的應用支持那個/些UTI做爲全部者/編輯器,在咱們的應用中,即爲com.raywenderlich.scarybugs.sbz UTI。編輯器

  • UTExportedTypeDeclaration條目提供了com.raywenderlich.scarybugs.sbz的信息,由於這並非一個公用的UTI。也就是說,若是任何文件的後綴爲.sbz或者它的mime類型爲application/scarybugs,那麼它就屬於這個咱們支持的文件類型。函數

信不信由你,設置這些keys就是咱們讓操做系統開始傳輸後綴爲.sbz的應用數據所要作的所有準備工做。你能夠經過給本身發送一個 sample bug來進行測試。
Emailed Bug Screenshot
若是你想打開Scary Bugs,能夠按住附件。若是你這麼作了,Scary Bugs就會打開,固然在這裏它並不會加載,由於咱們尚未加入任何的代碼。這就是咱們接下來要作的事情。測試

引入應用數據

當郵件或者其餘應用想要給你的應用發送一個文件,能夠經過兩個方法:經過 application:didFinishLaunchingWithOptions,用 UIApplicationLaunchOptionsURLKey來傳遞URL,或者經過application:handleOpenURL。
爲了理解這些都是在何時發生的,你能夠看看Oliver Drobnick寫的一片很是實用的講解這些方法在何時調用的帶圖表的文章
如今讓咱們開始實現吧--這會很簡單,由於咱們已經作了不少的準備工做。ui

將下列改動加入ScaryBugDoc.h:this

// After @interface- (BOOL)importFromURL:(NSURL *)importURL;

將下列代碼加入ScaryBugDoc.m:編碼

// Add new function- (BOOL)importFromURL:(NSURL *)importURL {
    NSData *zippedData = [NSData dataWithContentsOfURL:importURL];    return [self importData:zippedData];    
}

下列代碼加入RootViewController.h:

// After @interface- (void)handleOpenURL:(NSURL *)url;

還有將以下代碼加入RootViewController.m:

// New method- (void)handleOpenURL:(NSURL *)url {
    [self.navigationController popToRootViewControllerAnimated:YES];
    ScaryBugDoc *newDoc = [[[ScaryBugDoc alloc] init] autorelease];    if ([newDoc importFromURL:url]) {
        [self addNewDoc:newDoc];       
    }}

最後,將下列代碼加入ScaryBugsAppDelegate.m:

// Add at end of application:didFinishLaunchingWithOptionsNSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];if (url != nil && [url isFileURL]) {
        [rootController handleOpenURL:url];                
} // Add new method-(BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    RootViewController *rootController = (RootViewController *) [navigationController.viewControllers objectAtIndex:0];    if (url != nil && [url isFileURL]) {
        [rootController handleOpenURL:url];                
    }     
    return YES;
 }

這些都不難理解,可是要注意幾點。
首先,咱們在ScaryBugDoc中加入了一個方法來將文件從URL引入。從系統中傳給咱們的這個URL實際上咱們應用的目錄中的文件的副本。因此咱們用NSData來讀取它,並將它傳給以前寫好的importData方法。
在RootViewController中,咱們彈回到root view controller(除非咱們是在detail view的某處),生成一個新的文件,並從給定的URL引入文件。
在ScaryBugsAppDelegate中,在可以接收到咱們須要的URL的地方,若是這是一個文件URL(而不是隊列字符串,咱們也許之後會有專門的教程講解),咱們會通知root view controller如今能夠進行引入了。
如今編譯而且運行你的應用吧,若是一切順利的話,你應該能夠打開郵件的附件而且看到引入的應用的bug!
Imported Bug

輸出應用數據

引入數據是比較難的部分 -- 輸出數據將會簡單不少。
在EditBugViewController.h中進行以下改動:

// Add to the top of the file#import <MessageUI/MessageUI.h>// Modify EditBugViewController to have two new protocols: UIActionSheetDelegate and MFMailComposeViewControllerDelegate@interface EditBugViewController : UIViewController <UITextFieldDelegate, RateViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIAlertViewDelegate, UIActionSheetDelegate, MFMailComposeViewControllerDelegate> {

而後在EditBugViewController.m中進行以下改動:

// Replace exportTapped with the following:- (void)exportTapped:(id)sender { 
    UIActionSheet *actionSheet = [[[UIActionSheet alloc]
                                   initWithTitle:@"" 
                                   delegate:self 
                                   cancelButtonTitle:@"Cancel" 
                                   destructiveButtonTitle:nil 
                                   otherButtonTitles:@"Export via File Sharing", @"Export via Email", nil] autorelease];    [actionSheet showInView:self.view];
 }// Add new methods- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {     if (buttonIndex == actionSheet.firstOtherButtonIndex + 0) {         [DSBezelActivityView newActivityViewForView:self.navigationController.navigationBar.superview withLabel:@"Exporting Bug..." width:160];   
        [_queue addOperationWithBlock: ^{
            BOOL exported = [_bugDoc exportToDiskWithForce:FALSE];            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [DSBezelActivityView removeViewAnimated:YES];                if (!exported) {
                    UIAlertView *alertView = [[[UIAlertView alloc] 
                                               initWithTitle:@"File Already Exists!" 
                                               message:@"An exported bug with this name already exists.  Overwrite?" 
                                               delegate:self 
                                               cancelButtonTitle:@"Cancel" 
                                               otherButtonTitles:@"Overwrite", nil] autorelease];                    [alertView show];                }
            }];        }]; 
     } else if (buttonIndex == actionSheet.firstOtherButtonIndex + 1) {         [DSBezelActivityView newActivityViewForView:self.navigationController.navigationBar.superview withLabel:@"Exporting Bug..." width:160];   
        [_queue addOperationWithBlock: ^{
            NSData *bugData = [_bugDoc exportToNSData];            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [DSBezelActivityView removeViewAnimated:YES];                if (bugData != nil) {
                    MFMailComposeViewController *picker = [[[MFMailComposeViewController alloc] init] autorelease];                    [picker setSubject:@"My Scary Bug"];                    [picker addAttachmentData:bugData mimeType:@"application/scarybugs" fileName:[_bugDoc getExportFileName]];                    [picker setToRecipients:[NSArray array]];                    [picker setMessageBody:@"Check out this scary bug!  You'll need a copy of ScaryBugs to view this file, then tap and hold to open." isHTML:NO];                    [picker setMailComposeDelegate:self];                    [self presentModalViewController:picker animated:YES];                    
                }             }];        }]; 
     } }- (void)mailComposeController:(MFMailComposeViewController *)controller
		  didFinishWithResult:(MFMailComposeResult)result
						error:(NSError *)error {
    [self dismissModalViewControllerAnimated:YES];}

在這裏咱們改變了輸出按鍵彈出窗口詢問用戶但願經過以前同樣的文件分享仍是電子郵件來輸出。
若是用戶選擇經過郵箱分享文件,咱們會使用MFMailComposeViewController來生成一個郵件信息,而且加入含有bug數據的附件。是否是很簡單?
咱們開始測試前的最後一件事情:右鍵單擊Frameworks,選擇」AddExisting Framework…」,並從下拉列表中選擇」MessageUI.framework」。
下面就編譯運行你的應用吧,你應該已經能夠經過郵件自動的從應用輸出一個「Scary Bug」了!
Emailing Bug

來點好玩的!

若是你已經作了這麼多,何不來點更好玩的?
經過應用來生成一個Scary Bug,而後把它用郵件發送給我,郵箱地址在上圖的截圖中,我會把它加入這片教程!讓咱們看看咱們都製造了什麼恐怖的生物!:]
更新: 這是一個由Alex Hedley發來的不怎麼恐怖bug!:]

何去何從?

這裏 就是咱們這個教程系列到目前爲止的代碼。
個人計劃是Scary Bugs應用就這麼多了,可是誰知道呢,也許我會再增長點什麼。
同時,若是你有什麼問題,評論,或者你想分享你以爲什麼bug最恐怖,請讓我知道!:]

另一篇文章也不錯:

http://blog.spritebandits.com/2011/12/14/importing-csv-data-file-into-an-ios-app-via-email-attachment/
http://blog.spritebandits.com/2011/12/21/importing-csv-data-file-into-an-ios-app-via-email-attachment-part-2/
相關文章
相關標籤/搜索