2013-04-03 74 views
15

我正在嘗試使用UIActivityViewController發送PDF。到目前爲止一切工作正常使用相當基本的方法,但我有一個問題是,當我選擇郵件發送選項時,PDF的文件名是Attachment-1而不是Calculation.PDF這是我給該文件的名稱。如何使用UIActivityViewController發送PDF文件

我不介意標題的變化太多,但當向Windows PC用戶發送文件時,似乎並沒有導致出現.pdf擴展名的問題,我想解決該問題。

我看了一下: Control file name of UIImage send with UIActivityViewController

,但不能看到一個等效的方法:

[mailComposer addAttachmentData: UIImagePNGRepresentation(viewImage) mimeType:@"" fileName:@"myImage.png"]; 

將與PDF文件工作。這是不是沒有定製的解決方案,或者是否有解決這個問題的簡單方法?

+0

你有想過這一個嗎?有同樣的問題。 – Mrwolfy

+0

這幫助我http://stackoverflow.com/questions/15825777/uiactivityviewcontroller-sharing-image-via-email-has-no-extension/15826633#15826633,但缺點是,你必須先保存文件。 –

回答

46

試試這個

NSData *pdfData = [NSData dataWithContentsOfFile:pdfFilePath]; 
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[@"Test", pdfData] applicationActivities:nil]; 

[self presentViewController:activityViewController animated:YES completion:nil]; 

NSString *str = [[NSBundle mainBundle] pathForResource:@"AppDistributionGuide" ofType:@"pdf"]; 
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[@"Test", [NSURL fileURLWithPath:str]] applicationActivities:nil]; 
+1

這是訣竅,接受這個答案 –

+3

@ iTroyd23,我試着用你的建議,但我不能設置附件的標題。所以,你能描述一下如何設置附件的標題(例如myPdf.pdf) – Vats

+0

看起來好像在Xcode7 + iOS9中不起作用 –

6

//在斯威夫特

let url = NSURL.fileURLWithPath(fileName) 

    let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil) 

    presentViewController(activityViewController, 
     animated: true, 
     completion: nil) 
+0

不適用於ios11 – ChanWarde

-1

可能是試試這個..

#define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 

    // Validate PDF using NSData 
    - (BOOL)isValidePDF:(NSData *)pdfData { 
     BOOL isPDF = false; 
     if (pdfData.length >= 1024) { 

      int startMetaCount = 4, endMetaCount = 5; 
      // check pdf data is the NSData with embedded %PDF & %%EOF 
      NSData *startPDFData = [NSData dataWithBytes:"%PDF" length:startMetaCount]; 
      NSData *endPDFData = [NSData dataWithBytes:"%%EOF" length:endMetaCount]; 
      // startPDFData, endPDFData data are the NSData with embedded in pdfData 
      NSRange startRange = [pdfData rangeOfData:startPDFData options:0 range:NSMakeRange(0, 1024)]; 
      NSRange endRange = [pdfData rangeOfData:endPDFData options:0 range:NSMakeRange(0, pdfData.length)]; 

      if (startRange.location != NSNotFound && startRange.length == startMetaCount && endRange.location != NSNotFound && endRange.length == endMetaCount) { 
       // This assumes the checkstartPDFData doesn't have a specific range in file pdf data 
       isPDF = true; 

      } else { 
       isPDF = false; 
      } 
     } 
     return isPDF; 
    } 

    // Download PDF file in asynchronous way and validate pdf file formate. 
    - (void)downloadPDFfile:(NSString *) fileName withFileURL:(NSString *) url { 
     NSString *filePath = @""; 
     dispatch_async(dispatch_get_main_queue(),^{ 
      NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
      filePath = [documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"/Attachments/%@",[self generateName:fileName withFiletype:@"pdf"]]]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
      [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
       if (error) { 
         NSLog(@"Download Error:%@",error.description); 
       } else if (data && error == nil) { 
        bool checkPdfFormat = [self isValidePDF:data]; 
        if (checkPdfFormat) { 
         //saving is done on main thread 
         dispatch_async(dispatch_get_main_queue(), ^{ 
          [data writeToFile:filePath atomically:YES]; 
          NSURL *url = [NSURL fileURLWithPath:filePath]; 
          [self triggerShare:fileName withFilepath:filePath]; 
         }); 
        } 
       } 
      }]; 
     }); 
    } 

    // Trigger default share and print functionality using UIActivityViewController 
    -(void) triggerShare:(NSString*)fileName withFilepath:(NSString*)filePath { 
      * Set this available field on the activity controller */ 
      NSMutableArray *items = [NSMutableArray array]; 

      if (filePath) { 
       [items addObject:[NSURL fileURLWithPath:filePath]]; 
      } 

      UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; 
      [activityViewController setValue:fileName forKey:@"subject"]; // Set the mail subject. 


      if (IS_IPAD) { 
       activityViewController.modalPresentationStyle = UIModalPresentationPopover; 
       UIPopoverPresentationController *popPC = activityViewController.popoverPresentationController; 
       popPC.sourceView = self.view; 
       CGRect sourceRext = CGRectZero; 
       sourceRext.origin = CGPointMake(self.view.frame.size.width-30, 0); // I have share button in navigation bar. ;) 
       popPC.sourceRect = sourceRext; 
       popPC.permittedArrowDirections = UIPopoverArrowDirectionUp; 
      } 


      [activityViewController setCompletionWithItemsHandler: 
      ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { 
      }]; 
      [self presentViewController:activityViewController animated:YES completion:nil]; 
    } 

    -(NSString*) generateName:(NSString*)title withFiletype:(NSString*)type { 

     NSString *subject = [title stringByReplacingOccurrencesOfString:@" " withString:@"_"]; 
     subject = [NSString stringWithFormat:@"%@.%@",subject,type]; 
     return subject; 
    } 
6

以上列示有關斯威夫特斯威夫特3

let url = NSURL.fileURL(withPath: fileName) 

let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil) 

present(activityViewController, 
    animated: true, 
    completion: nil) 
1

棄用斯威夫特3

你必須有一個URL陣列要發送PDF的路徑。

let urlArray = [pdfPath1, pdfPath2] 

然後創建一個UIActivityViewController

let activityController = UIActivityViewController(activityItems: urlArray, applicationActivities: nil) 

如果您使用的是UIBarButtonItem做出那個動作,就可以實現該功能防止iPad上的錯誤:

if let popover = activityController.popoverPresentationController { 
    popover.barButtonItem = self.barButtonItem 
} 

最後你必須出示activityController

self.present(activityController, animated: true, completion: nil) 
相關問題