Yo estoy tratando de enviar un PDF con un UIActivityViewController. Hasta ahora todo funciona bien, el uso de una forma bastante básica, pero el problema que tengo es que cuando yo seleccione enviar por correo, la opción de PDF del nombre de archivo es Attachment-1 en lugar de Calculation.PDF que es el nombre que le doy al archivo.

No me importa demasiado el cambio en el título, pero la falta de una .pdf extensión no parecen causar un problema al enviar el archivo a la gente con un PC con Windows y me gustaría arreglar eso.

He echado un vistazo a:
Control de nombre de archivo de UIImage enviar con UIActivityViewController

Pero no puede ver un método equivalente a:

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

que va a trabajar con un archivo PDF. Es esto algo que no se puede arreglar sin personalización o hay una solución simple a este problema?

Hola alguna vez la figura de este uno? Teniendo el mismo problema.
Esto me ayudó stackoverflow.com/questions/15825777/… , pero el inconveniente es que tienes que guardar el archivo primero.

OriginalEl autor Ian Turner | 2013-04-03

8 Comentarios

  1. 55

    probar este

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

    y también

    NSString *str = [[NSBundle mainBundle] pathForResource:@"AppDistributionGuide" ofType:@"pdf"];   
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[@"Test", [NSURL fileURLWithPath:str]] applicationActivities:nil]; 
    Esto hace el truco, acepte esta respuesta
    he probado con tu sugerencia pero no puedo establecer el apego del título. así que, ¿puede describir cómo establecer el apego del título (por ejemplo, myPdf.pdf)
    parece que no funciona en Xcode7 + iOS9
    Sólo para decir que he intentado tanto y NSURL funcionado mejor para mí de un archivo XML.

    OriginalEl autor Muruganandham K

  2. 9

    //En Swift

        let url = NSURL.fileURLWithPath(fileName)
    
        let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
    
        presentViewController(activityViewController,
            animated: true,
            completion: nil)
    No trabajo en ios11

    OriginalEl autor Roger Hjartholm

  3. 8

    Listado de más arriba acerca de Swift está en desuso en Swift 3

    let url = NSURL.fileURL(withPath: fileName)
    
    let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
    
    present(activityViewController,
        animated: true,
        completion: nil)

    OriginalEl autor gm_

  4. 6

    Swift 4.0

    Aquí os adjunto el código.Acabo de añadir manejo de hilos en presentar «activityViewController» porque de esta viewcontroller presente antes de la carga de datos reales.

    let url = NSURLfileURL(withPath:fileName)
    
    let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
    
    DispatchQueue.main.async {
    
        self.present(activityViewController, animated: true, completion: nil)
    }

    OriginalEl autor V D Purohit

  5. 2

    Para Swift 3

    Usted tiene que tener un URL matriz con la ruta de acceso del archivo PDF que desea enviar.

    let urlArray = [pdfPath1, pdfPath2]

    A continuación, crear un UIActivityViewController:

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

    Si usted está usando un UIBarButtonItem para hacer que la acción, usted puede implementar esto para evitar un error en el iPad:

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

    Finalmente, usted tiene que presentar el activityController:

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

    OriginalEl autor pableiros

  6. 0

    Para Objective-C probado el código para compartirlo PDF

    - (void)downloadPDFfile:(NSString *)fileName withFileURL:(NSString *)shareURL {
    dispatch_async(dispatch_get_main_queue(), ^ {
    NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@",[self generateName:fileName withFiletype:@"pdf"]]];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:shareURL]];
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request
    completionHandler:
    ^(NSData *data, NSURLResponse *response, NSError *error) {
    if (error) {
    NSLog(@"Download Error:%@",error.description);
    } else if (data && error == nil) {
    dispatch_async(dispatch_get_main_queue(), ^{
    [data writeToFile:filePath atomically:YES];
    [self shareFile:fileName withFilepath:filePath];
    });
    }
    }];
    [task resume];
    });
    }
    -(void)shareFile:(NSString*)withfileName withFilepath:(NSString*)filePath {
    NSMutableArray *items = [NSMutableArray array];
    if (filePath) {
    [items addObject:[NSURL fileURLWithPath:filePath]];
    }
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
    [activityViewController setValue:withfileName forKey:@"subject"];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    activityViewController.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController *popPC = activityViewController.popoverPresentationController;
    popPC.sourceView = self.view;
    CGRect sourceRext = CGRectZero;
    sourceRext.origin = CGPointMake(self.view.frame.size.width-30, 0);
    popPC.sourceRect = sourceRext;
    popPC.permittedArrowDirections = UIPopoverArrowDirectionDown;
    }
    [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;
    }

    una llamada a la función como la siguiente

    [self downloadPDFfile:@"yourFileName" withFileURL:shareURL];

    OriginalEl autor Hardik Thakkar

  7. 0

    La respuesta Muruganandham K es simple y muy elegante. Sin embargo, no funciona en iOS 9. Con el fin de hacer que funcione, si se quita la @[@"Test" y acaba de pasar la pdfData, un accesorio está hecho.

    NSData *pdfData = [NSData dataWithContentsOfFile:pdfFilePath];
    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:pdfData applicationActivities:nil];
    [self presentViewController:activityViewController animated:YES completion:nil];

    OriginalEl autor Wardy

  8. -2

    Se puede probar esto..

        #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;
    }

    OriginalEl autor Vignesh Kumar

Dejar respuesta

Please enter your comment!
Please enter your name here