web-dev-qa-db-fra.com

Comment envoyer un PDF fichier utilisant UIActivityViewController

J'essaie d'envoyer un PDF à l'aide de UIActivityViewController. Jusqu'à présent, tout fonctionne correctement avec une approche assez basique, mais l'un des problèmes que je rencontre est que lorsque je sélectionne l'option d'envoi par courrier, le nom du fichier PDF est Attachment-1 plutôt que Calculation.PDF, qui est le nom que je donne au fichier. 

Le changement de titre ne me dérange pas trop, mais l’absence d’extension .pdf semble poser un problème lors de l’envoi du fichier à des utilisateurs de PC Windows et j’aimerais remédier à cela. 

J'ai consulté: Nom du fichier de contrôle de l'envoi d'UIImage avec UIActivityViewController

Mais ne peut pas voir une méthode équivalente à:

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

cela fonctionnera avec un fichier PDF. Est-ce quelque chose qui n'est pas réparable sans personnalisation ou existe-t-il une solution simple à ce problème?

19
Ian Turner

essaye ça

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

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

et aussi

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

// En rapide 

    let url = NSURL.fileURLWithPath(fileName)

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

    presentViewController(activityViewController,
        animated: true,
        completion: nil)
9
Roger Hjartholm

La liste ci-dessus à propos de Swift est obsolète dans Swift 3

let url = NSURL.fileURL(withPath: fileName)

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

present(activityViewController,
    animated: true,
    completion: nil)
8
Grayson Martin

Swift 4.0

Ici, j'ai attaché le code.J'ai juste ajouté la gestion des threads pour présenter "activityViewController" à cause de la présence de ce contrôleur de vue avant le chargement des données réelles.

let url = NSURLfileURL(withPath:fileName)

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

DispatchQueue.main.async {

    self.present(activityViewController, animated: true, completion: nil)
}
6
V D Purohit

Pour Swift 3

Vous devez avoir un tableau URL avec le chemin du PDF que vous voulez envoyer.

let urlArray = [pdfPath1, pdfPath2]

Puis créez une UIActivityViewController:

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

Si vous utilisez une UIBarButtonItem pour effectuer cette action, vous pouvez l'implémenter pour empêcher une erreur sur iPad:

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

Enfin, vous devez présenter la activityController:

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

La réponse de Muruganandham K est simple et assez élégante. Toutefois, cela ne fonctionne pas sous iOS 9. Pour le faire fonctionner, si vous supprimez le @[@"Test" et transmettez simplement le pdfData, une pièce jointe est créée.

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

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

Pour le code testé par Objective-C, partager 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;
}

fonction d'appel comme ci-dessous

[self downloadPDFfile:@"yourFileName" withFileURL:shareURL];
0
Hardik Thakkar