web-dev-qa-db-ja.com

PDFファイルをUIActivityViewControllerを使用して送信する方法

私はPDFを使用してUIActivityViewControllerを送信しようとしています。これまでのところ、かなり基本的なアプローチを使用してすべてが正常に機能しますが、1つの問題は、メールオプション、PDFのファイル名はAttachment-1 のではなく Calculation.PDFは、ファイルに付ける名前です。

タイトルの変更はあまり気にしませんが、.pdf拡張子がないことで、Windows PCを使用している人にファイルを送信するときに問題が発生するようですので、修正したいと思います。

私は見てきました: IImageの制御ファイル名、UIActivityViewControllerで送信

しかし、以下と同等のメソッドを見ることができません。

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

これはPDFファイルで動作します。これはカスタマイズなしでは修正できないものですか、それともこの問題の簡単な解決策はありますか?

29
Ian Turner

これを試して

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]; 
57
Muruganandham K

// Swiftで

    let url = NSURL.fileURLWithPath(fileName)

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

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

上記のSwiftは、Swift 3

let url = NSURL.fileURL(withPath: fileName)

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

present(activityViewController,
    animated: true,
    completion: nil)
8
gm_

Swift 4.0

ここにコードを添付しました。実際のデータをロードする前にこのビューコントローラーが存在するため、現在の「activityViewController」にスレッド処理を追加しました。

let url = NSURLfileURL(withPath:fileName)

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

DispatchQueue.main.async {

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

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)
2
pableiros

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];
2
Hardik Thakkar

ムルガナンダム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];
0
Wardy