Search code examples
iphoneiosios4iphone-sdk-3.0

How to monitor pdf download process in iphone sdk


In my application i need to download pdf file from url.i know how to download pdf file from url and store in local document directory.But i need to show downloading process and i want to know whether download is completed.Please any body give an idea..

Here My code:

 NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.msy.com.au/Parts/PARTS.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];

Solution

  • Use ASIHTTPRequest for download file. for below code I had used ASIHTTPRequest

    float currentProgress;
    UILabel *dwnLbl;
    UIProgressView * myProgressIndicator;
    UIProgressView *progressBar;
    @property (nonatomic, retain) ASIHTTPRequest *rqstForAudio;
    
    
    -(void)viewDidLoad{
         self.av=[[UIAlertView alloc] initWithTitle:@"Downloading.." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
        [self.actV setFrame:CGRectMake(125, 60, 37, 37)];
    
        dwnLbl = [[UILabel alloc] initWithFrame:CGRectMake(45, 30, 200, 37)];
        dwnLbl.textAlignment = UITextAlignmentCenter;
        dwnLbl.font = [UIFont boldSystemFontOfSize:20];
        dwnLbl.backgroundColor = [UIColor clearColor];
        dwnLbl.textColor = [UIColor whiteColor];
    
        progressBar = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
       [progressBar setFrame:CGRectMake(45, 65, 200, 20)];
       progressBar.progress = 0;
       [self.av addSubview:dwnLbl];
       [self.av addSubview:progressBar];
     }
     -(void)downLoadBook{
        NSString *strAudioURL=@"http://www.msy.com.au/Parts/PARTS.pdf"
        // check first locally exists or not
        NSString *strPathToAudioCache=[NSString stringWithFormat:@"%@/%@",
                                       [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],
                                       AudioFolder];
    
        NSDictionary *dOfAudios=[NSDictionary dictionaryWithContentsOfFile:strPathToAudioCache];
        if([dOfAudios valueForKey:strAudioURL]) {
        } else {
            self.av.title = @"Downloading..";
            [self.av show];
            NSString  *pdf = @"bookTitle.pdf";
    
    
            NSURL *audioURL = [NSURL URLWithString:strAudioURL];
            NSString *strPathToDownload=[NSString stringWithFormat:@"%@/%@",[(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],pdf];
            [self.rqstForAudio setDownloadProgressDelegate:myProgressIndicator];
    
            if(!self.rqstForAudio || [self.rqstForAudio isFinished]) {
                self.rqstForAudio=[ASIHTTPRequest requestWithURL:audioURL];
                [self.rqstForAudio setDelegate:self];
                [self.rqstForAudio setDownloadProgressDelegate:self];
                [self.rqstForAudio setAllowResumeForFileDownloads:YES];
                [self.rqstForAudio setCachePolicy:ASIUseDefaultCachePolicy];
                [self.rqstForAudio setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
                [self.rqstForAudio setDidFailSelector:@selector(failedToLoad:)];
                [self.rqstForAudio setDidFinishSelector:@selector(finishedLoading:)];
                [self.rqstForAudio setDownloadCache:[ASIDownloadCache sharedCache]];
                [self.rqstForAudio setDownloadDestinationPath:strPathToDownload];
                [self.rqstForAudio startAsynchronous];
            }
        }
    }
    
    
    
    - (void)failedToLoad:(ASIHTTPRequest*)request {
        [self.av dismissWithClickedButtonIndex:0 animated:YES];
        NSLog(@"failed to download");
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"MESSAGE" message:@"Failed to Download" delegate:self cancelButtonTitle:RETRY otherButtonTitles:nil, nil];
        av.delegate = self;
        [av show];
    }
    
    - (void)finishedLoading:(ASIHTTPRequest*)request {
      NSLog(@"finished loading");
      NSString *strPathToAudioCache=[NSString stringWithFormat:@"%@",
                                   [(NSArray*)NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]];
    
     NSMutableDictionary *dOfAudios=[NSMutableDictionary dictionaryWithContentsOfFile:strPathToAudioCache];
    
     if([dOfAudios allKeys].count>0) {
        [dOfAudios setValue:[request downloadDestinationPath] forKey:[[request url] description]];
     } else {
        dOfAudios=[NSMutableDictionary dictionary];
        [dOfAudios setValue:[request downloadDestinationPath] forKey:[[request url] description]];
     }
      [self.av dismissWithClickedButtonIndex:0 animated:YES];
      [dOfAudios writeToFile:strPathToAudioCache atomically:YES];
    }
    
    - (void)request:(ASIHTTPRequest *)request didReceiveBytes:(long long)bytes{
        [self setProgress:[myProgressIndicator progress]];
    }
     - (void)setProgress:(float)progress
    {
       currentProgress = progress;
       if (!progress == 0.0) {
       }
       if(currentProgress*100 == 100.00){
          self.av.title = @"Finishing..";
       }
       progressBar.progress = currentProgress;
       dwnLbl.text = [NSString stringWithFormat:@"%.2f%%",currentProgress*100];
    }
    

    EDIT

    You can used the NSURLSession method to implement such scenario NSURLSession