2013-04-03 13 views
15

Sto tentando di inviare un PDF utilizzando UIActivityViewController. Finora tutto funziona bene con un approccio abbastanza semplice, ma l'unico problema che ho è che quando seleziono l'opzione di invio per posta, il nome del file PDF è Attachment-1 anziché Calculation.PDF, che è il nome che io do al file.Come inviare un file PDF utilizzando UIActivityViewController

Non mi interessa troppo il cambio di titolo, ma la mancanza di un'estensione .pdf sembra causare un problema quando si invia il file a persone con PC Windows e vorrei correggerlo.

ho avuto un'occhiata a: Control file name of UIImage send with UIActivityViewController

Ma non riesco a vedere un metodo equivalente a:

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

che funzionerà con un file PDF. È qualcosa che non è risolvibile senza personalizzazione o esiste una soluzione semplice a questo problema?

+0

Ciao mai capisci questo? Avere lo stesso problema. – Mrwolfy

+0

Questo mi ha aiutato http://stackoverflow.com/questions/15825777/uiactivityviewcontroller-sharing-image-via-email-has-no-extension/15826633#15826633, ma l'inconveniente è che devi prima salvare il file. –

risposta

46

provare questo

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

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

e anche

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

Questo è il trucco, accetta questa risposta –

+3

@ iTroyd23, ho provato con il tuo suggerimento ma non riesco a impostare il titolo dell'allegato. quindi, puoi descrivere come impostare il titolo dell'allegato (ad esempio mioPdf.pdf) – Vats

+0

sembra non funzionare in Xcode7 + iOS9 –

6

// In Swift

let url = NSURL.fileURLWithPath(fileName) 

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

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

Non funziona in ios11 – ChanWarde

-1

Può essere provare questo ..

#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

Sopra sito di Swift è deprecato a Swift 3

let url = NSURL.fileURL(withPath: fileName) 

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

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

Per Swift 3

Bisogna avere una matrice URL con il percorso del PDF che si desidera inviare.

let urlArray = [pdfPath1, pdfPath2] 

Poi creare un UIActivityViewController:

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

Se si utilizza un UIBarButtonItem per fare che l'azione, è possibile implementare questo per evitare un errore su iPad:

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

Infine Devo presentare il activityController:

self.present(activityController, animated: true, completion: nil)