私はPDFを使用してUIActivityViewController
を送信しようとしています。これまでのところ、かなり基本的なアプローチを使用してすべてが正常に機能しますが、1つの問題は、メールオプション、PDFのファイル名はAttachment-1
のではなく Calculation.PDF
は、ファイルに付ける名前です。
タイトルの変更はあまり気にしませんが、.pdf拡張子がないことで、Windows PCを使用している人にファイルを送信するときに問題が発生するようですので、修正したいと思います。
私は見てきました: IImageの制御ファイル名、UIActivityViewControllerで送信
しかし、以下と同等のメソッドを見ることができません。
[mailComposer addAttachmentData: UIImagePNGRepresentation(viewImage) mimeType:@"" fileName:@"myImage.png"];
これはPDFファイルで動作します。これはカスタマイズなしでは修正できないものですか、それともこの問題の簡単な解決策はありますか?
これを試して
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];
// Swiftで
let url = NSURL.fileURLWithPath(fileName)
let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
presentViewController(activityViewController,
animated: true,
completion: nil)
上記のSwiftは、Swift 3
let url = NSURL.fileURL(withPath: fileName)
let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
present(activityViewController,
animated: true,
completion: nil)
ここにコードを添付しました。実際のデータをロードする前にこのビューコントローラーが存在するため、現在の「activityViewController」にスレッド処理を追加しました。
let url = NSURLfileURL(withPath:fileName)
let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
DispatchQueue.main.async {
self.present(activityViewController, animated: true, completion: nil)
}
For Swiftの場合
送信するPDFのパスを含むURL
配列が必要です。
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)
Objective-Cでテストされたコードで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;
}
以下のような関数を呼び出す
[self downloadPDFfile:@"yourFileName" withFileURL:shareURL];
ムルガナンダムKの返信はシンプルで非常にエレガントです。ただし、iOS 9では機能しません。機能させるために、@[@"Test"
そしてpdfDataを渡すだけで、添付ファイルが作成されます。
NSData *pdfData = [NSData dataWithContentsOfFile:pdfFilePath];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:pdfData applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];