How to download PDF and store it locally on iPhone

2019-01-10 04:41发布

I am able to successfully view a PDF from a website. I want to be able to download that PDF to the device, then access that file locally.

When the app is opened, it will check the online PDF's date. If it is newer than the locally-stored PDF, the app will download the new one, otherwise it opens the locally-stored PDF.

The code I am currently using:

PDFAddress = [NSURL URLWithString:@"http://www.msy.com.au/Parts/PARTS.pdf"];
request = [NSURLRequest requestWithURL:PDFAddress];
[webView loadRequest:request];
webView.scalesPageToFit = YES;

How am I able to achieve this?

6条回答
冷血范
2楼-- · 2019-01-10 05:17

With Swift version 3.0 syntax:

let url = NSURL(fileURLWithPath: "http://example.com/examplePDF.pdf")

    if let pdfData = NSData(contentsOf: url as URL) {

        let resourceDocPath = NSHomeDirectory().appending("/Documents/yourPDF.pdf")

        unlink(resourceDocPath)

        pdfData.write(toFile: resourceDocPath, atomically: true)

    }
查看更多
甜甜的少女心
3楼-- · 2019-01-10 05:22

You need to read the File and Data Management Guide from Apple. It will describe which locations are available in the application sandbox for saving files locally and how to get a reference to those locations. It also has a section for reading and writing :)

Enjoy!

查看更多
爷、活的狠高调
4楼-- · 2019-01-10 05:30

In Swift 4.1

// Url in String format
let urlStr = "http://www.msy.com.au/Parts/PARTS.pdf"

// Converting string to URL Object
let url = URL(string: urlStr)

// Get the PDF Data form the Url in a Data Object
let pdfData = try? Data.init(contentsOf: url!)

// Get the Document Directory path of the Application
let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL

// Split the url into a string Array by separator "/" to get the pdf name
let pdfNameFromUrlArr = urlStr.components(separatedBy: "/")

// Appending the Document Directory path with the pdf name
let actualPath = resourceDocPath.appendingPathComponent(pdfNameFromUrlArr[
    pdfNameFromUrlArr.count - 1])

// Writing the PDF file data to the Document Directory Path
do {
    _ = try pdfData.write(to: actualPath, options: .atomic) 
}catch{

    print("Pdf can't be saved")
}

// Showing the pdf file name in a label
lblPdfName.text = pdfNameFromUrlArr[pdfNameFromUrlArr.count - 1]

// URLRequest for the PDF file saved in the Document Directory folder
let urlRequest = URLRequest(url: actualPath)

webVw.isUserInteractionEnabled = true
webVw.delegate = self
webVw.loadRequest(urlRequest)

If you want to save the Pdf's in a particular folder/directory inside Main Document Directory

let resourceDocPath = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL

// The New Directory/folder name
let newPath = resourceDocPath.appendingPathComponent("QMSDocuments")

// Creating the New Directory inside Documents Directory
do {
    try FileManager.default.createDirectory(atPath: newPath.path, withIntermediateDirectories: true, attributes: nil)
} catch let error as NSError {
    NSLog("Unable to create directory \(error.debugDescription)")
}

// Split the url into a string Array by separator "/" to get the pdf name
pdfNameFromUrlArr = urlStr.components(separatedBy: "/")

// Appending to the newly created directory path with the pdf name
actualPath = newPath.appendingPathComponent(pdfNameFromUrlArr[pdfNameFromUrlArr.count - 1])

Happy Coding :)

查看更多
太酷不给撩
5楼-- · 2019-01-10 05:33

I have found one method which I tried myself:

// Get the PDF Data from the url in a NSData Object
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[
    NSURL URLWithString:@"http://www.example.com/info.pdf"]];

// Store the Data locally as PDF File
NSString *resourceDocPath = [[NSString alloc] initWithString:[
    [[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent]
        stringByAppendingPathComponent:@"Documents"
]];

NSString *filePath = [resourceDocPath 
    stringByAppendingPathComponent:@"myPDF.pdf"];
[pdfData writeToFile:filePath atomically:YES];


// Now create Request for the file that was saved in your documents folder
NSURL *url = [NSURL fileURLWithPath:filePath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

[webView setUserInteractionEnabled:YES];
[webView setDelegate:self];
[webView loadRequest:requestObj];

This will store your PDF locally and load it into your UIWebView.

Hope this solves your problem.

查看更多
可以哭但决不认输i
6楼-- · 2019-01-10 05:39

I found a swift version for it:

let url = "http://example.com/examplePDF.pdf"
if let pdfData = NSData(contentsOfURL: url) {
    let resourceDocPath = NSHomeDirectory().stringByAppendingString("/Documents/yourPDF.pdf")
    unlink(resourceDocPath)
    pdfData.writeToFile(resourceDocPath, atomically: true)
}

Just remember to save the path file and you'll be able to fetch it whenever you need it.

查看更多
劫难
7楼-- · 2019-01-10 05:42

I'd also recommend taking a look at ASIHTTPRequest for easy file downloading.

查看更多
登录 后发表回答