objective-c - 예제 - onmessagereceived




UIActivityViewController를 사용하여 PDF 파일을 보내는 방법 (6)

UIActivityViewController 사용하여 PDF를 보내려고합니다. 지금까지 모든 것은 꽤 기본적인 접근 방식을 사용하여 잘 작동하지만, 내가 가진 한 가지 문제는 메일로 보내기 옵션을 선택할 때 PDF의 파일 이름이 Attachment-1 제공하는 이름 인 Calculation.PDF 가 아닌 Attachment-1 이라는 것입니다.

제목의 변경은별로 신경 쓰지 않지만 .pdf 확장명이 없으면 파일을 Windows PC 사용자에게 보낼 때 문제가 발생하는 것으로 보입니다. 문제를 해결하고 싶습니다.

내가 한 번 봐 : UIImage의 제어 파일 이름은 UIActivityViewController와 함께 보낸다.

그러나 다음과 같은 방법을 사용할 수 없습니다.

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

그것은 PDF 파일과 함께 작동합니다. 사용자 정의없이 해결할 수 없거나이 문제에 대한 간단한 해결책이 있습니까?


스위프트 4.0

여기에 나는 실제 코드를로드하기 전에이 viewcontroller로 인해 "activityViewController"를 표시하기 위해 스레드 처리를 추가했습니다.

let url = NSURLfileURL(withPath:fileName)

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

DispatchQueue.main.async {

    self.present(activityViewController, animated: true, completion: 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)

이 시도

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]; 

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];

스위프트 3

보낼 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 를 제시해야 activityController .

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




uiactivityviewcontroller