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?
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];
// En rapide
let url = NSURL.fileURLWithPath(fileName)
let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
presentViewController(activityViewController,
animated: true,
completion: nil)
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)
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)
}
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)
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];
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];