본문 바로가기

iOS/Objective-c

[ObjC]UIActivityViewController를 사용한 파일 저장/공유

#import <Foundation/Foundation.h>

 

@interface FileManager : NSFileManager

 

+ (FileManager *)shared;

- (void)downloadDocs:(NSString *)fileName withFileURL:(NSString *)shareURL;

 

@end

-----------------------------------------------------------------------------------------

#import "FileManager.h"

 

@implementation FileManager

 

+ (FileManager *)shared {

    

    static FileManager *fm = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        fm = [[self alloc] init];

    });

    return fm;

}

 

- (void)downloadDocs:(NSString *)fileName withFileURL:(NSString *)shareURL {

 

    NSString *fileType;

    if ([shareURL hasSuffix:@"pdf"]) {

        fileType = @"pdf";

    }

    else if ([shareURL hasSuffix:@"hwp"]) {

        fileType = @"hwp";

    }

    

    dispatch_async(dispatch_get_main_queue(), ^ {

        

        NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

        

        NSString *file = [self generateName:fileName withFiletype:fileType];

        NSString *filePath = [documentDir stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@", file]];

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

                                              return;

                                          }

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

    

    UIWindow *win = [[[UIApplication sharedApplication] delegate] window];

    UINavigationController *navi = (UINavigationController*)win.rootViewController;

 

    [activityViewController setCompletionWithItemsHandler:

     ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) {

         if (completed) {

             NSLog(@"completed");

         }

         else {

             NSLog(@"fail");

         }

     }];

    

    [navi 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;

}

 

@end

-----------------------------------------------------------------------------------------------------

if ([requestString rangeOfString:@".pdf"].location != NSNotFound) {

        [[FileManager shared] downloadDocs:@"docs" withFileURL:requestString];

    }

 

 

출처: https://stackoverflow.com/questions/15781877/how-to-send-a-pdf-file-using-uiactivityviewcontroller