37

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

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

私は見てきました: UIActivityViewControllerで送信されるUIImageの制御ファイル名

しかし、同等のメソッドが表示されません:

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

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

4

8 に答える 8

65

これを試して

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]; 
于 2014-03-26T14:02:56.573 に答える
16

迅速

let url = NSURL.fileURLWithPath(fileName)

let activityViewController = UIActivityViewController(activityItems: [url] , applicationActivities: nil)
        
presentViewController(activityViewController, animated: true, completion: nil)
于 2015-10-21T12:42:52.797 に答える
9

Swift に関する上記のリストは、Swift 3 で廃止されました

let url = NSURL.fileURL(withPath: fileName)

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

present(activityViewController,
    animated: true,
    completion: nil)
于 2016-10-01T20:20:32.857 に答える
2

スイフト3の場合

URL送信する PDF のパスを含む配列が必要です。

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)
于 2016-12-02T20:10:17.917 に答える
-3

これを試してみてください..

    #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;
    }
于 2016-04-29T04:32:48.863 に答える