web-dev-qa-db-fra.com

iOS télécharger et enregistrer le fichier HTML

J'essaie de télécharger une page Web (html), puis d'afficher le code html local téléchargé dans un UIWebView. 

C'est ce que j'ai essayé -

NSString *stringURL = @"url to file";
NSURL  *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData )
{
    NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString  *documentsDirectory = [paths objectAtIndex:0];  

    NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"index.html"];
    [urlData writeToFile:filePath atomically:YES];
}

    //Load the request in the UIWebView.
    [web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]];        // Do any additional setup after loading the view from its nib.

Mais cela donne une erreur 'SIGABRT'.

Pas trop sûr de ce que j'ai mal fait?

Toute aide serait appréciée. Merci!

17
AveragePro

Le chemin transmis à UIWebView est incorrect, comme mentionné par Freerunnering, essayez plutôt ceci:

// Determile cache file path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [NSString stringWithFormat:@"%@/%@", [paths objectAtIndex:0],@"index.html"];   

// Download and write to file
NSURL *url = [NSURL URLWithString:@"http://www.google.nl"];
NSData *urlData = [NSData dataWithContentsOfURL:url];
[urlData writeToFile:filePath atomically:YES];

// Load file in UIWebView
[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];      

Remarque: Le traitement correct des erreurs doit être ajouté.

23
Anne

NSDocumentDirectory sera sauvegardé sur iCloud. Vous feriez peut-être mieux d'utiliser NSCachesDirectory https://developer.Apple.com/library/ios/#qa/qa1719/_index.html

8
Keab42

Votre application est un dossier avec une extension .app à la fin. Sur l'iPhone une fois installé, vous ne pouvez pas modifier ce dossier. Par conséquent, sauvegardez-le dans le répertoire de documents.

Dans votre exemple de code, sauvegardez le fichier dans Documents/index.html et demandez-lui de charger appname.app/index.html.

[NSBundle mainBundle] ne vous donne pas le répertoire de documents qu'il vous donne (je pense) le dossier .app (bien qu'il puisse s'agir du dossier contenant l'application, les documents et d'autres dossiers).

Pour vous donner envie de changer cette ligne.

[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]];

To (à condition que ce soit la même méthode que le reste du code, sinon recréez l'objet 'filePath')

[web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath isDirectory:NO]]];
4
Kyle Howells

Voici la version 2.x de Swift:

    var paths: [AnyObject] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    var filePath: String = "\(paths[0])/\("index.html")"

    // Download and write to file
    var url: NSURL = NSURL(string: "http://www.google.nl")!
    var urlData: NSData = NSData.dataWithContentsOfURL(url)
    urlData.writeToFile(filePath, atomically: true)

    // Load file in UIWebView
    web.loadRequest(NSURLRequest(URL: NSURL.fileURLWithPath(filePath)))
0
code4latte