2013-04-03 2 views
15

Я пытаюсь отправить PDF с помощью UIActivityViewController. Пока все работает отлично, используя довольно простой подход, но одна из проблем заключается в том, что при выборе опции отправки по почте имя файла PDF составляет Attachment-1, а не Calculation.PDF, которое является именем, которое я даю этому файлу.Как отправить файл PDF с помощью UIActivityViewController

Я не возражаю против изменения названия, но отсутствие расширения .pdf, похоже, вызывает проблему при отправке файла людям с ПК с ОС Windows, и я хотел бы исправить это.

Я имел взгляд на: Control file name of UIImage send with UIActivityViewController

Но не может видеть эквивалентный метод для:

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

, который будет работать с файлом PDF. Является ли это чем-то, что невозможно устранить без настройки или есть простое решение этой проблемы?

+0

Привет, никогда не задумывайтесь об этом? Имеет ту же проблему. – Mrwolfy

+0

Это помогло мне http://stackoverflow.com/questions/15825777/uiactivityviewcontroller-sharing-image-via-email-has-no-extension/15826633#15826633, но недостатком является то, что вам нужно сначала сохранить файл. –

ответ

46

попробовать это

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

Это трюк, принимайте этот ответ –

+3

@ iTroyd23, я попробовал с вашим предложением, но я не могу установить заголовок приложения. поэтому, можете ли вы описать, как установить заголовок вложения (например, myPdf.pdf) – Vats

+0

выглядит так, как будто он не работает в Xcode7 + iOS9 –

6

// В Swift

let url = NSURL.fileURLWithPath(fileName) 

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

    presentViewController(activityViewController, 
     animated: true, 
     completion: nil) 
+0

Не работает в ios11 – ChanWarde

-1

Может быть попробовать это ..

#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; 
    } 
6

выше список о Swift осуждается в Swift 3

let url = NSURL.fileURL(withPath: fileName) 

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

present(activityViewController, 
    animated: true, 
    completion: nil) 
1

Для Swift 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) 
Смежные вопросы