web-dev-qa-db-ja.com

iOSでHTMLファイルをダウンロードして保存する

Webページ(html)をダウンロードし、ダウンロードされたローカルHTMLをUIWebViewに表示しようとしています。

これは私が試したものです-

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.

ただし、これにより「SIGABRT」エラーが発生します。

私が何を間違えたのかよくわかりませんか?

任意の助けいただければ幸いです。ありがとう!

17
AveragePro

UIWebViewに渡されたパスが正しくありません。前述のFreerunneringのように、代わりにこれを試してください。

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

注:正しいエラー処理を追加する必要があります。

23
Anne

NSDocumentDirectoryはiCloudにバックアップされます。 NSCachesDirectory https://developer.Apple.com/library/ios/#qa/qa1719/_index.html を使用したほうがよい場合があります。

8
Keab42

アプリは、末尾に.app拡張子が付いたフォルダーです。 iPhoneをインストールすると、このフォルダを変更することはできません。そのため、ドキュメントディレクトリに保存する必要があります。

サンプルコードでは、ファイルをDocuments/index.htmlに保存し、appname.app /index.htmlをロードするように依頼します。

[NSBundle mainBundle]は、.appフォルダー(アプリ、ドキュメント、その他のフォルダーを含むフォルダーである可能性があります)を提供するdocumentsディレクトリを提供しません。

与えるために、この行を変更したいと思うでしょう。

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

(これがコードの他の部分と同じメソッドである場合は、オブジェクト 'filePath'を再作成します)

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

Swift 2.xバージョン:

    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