0

デバイスがオフラインのときにイメージ タグを読み込むために、html 文字列からイメージ タグをプリロードしようとしています。基本的に、すべての<img>タグからソース URL を削除し、URL をきれいにしてきれいなファイル名にしてから、画像をダウンロードします。

    __block   NSString *imageName = [[NSString alloc]init];

//Get the string after HTTP://
     NSArray *nohttp = [actualUrl componentsSeparatedByString:@"//"];
    imageName = [nohttp objectAtIndex:1];

//Clean any /.:
    imageName = [imageName stringByReplacingOccurrencesOfString:@"/" withString:@""];
    imageName = [imageName stringByReplacingOccurrencesOfString:@"." withString:@""];
    imageName = [imageName stringByReplacingOccurrencesOfString:@":" withString:@""];
//Add .png at the end as we will be saving it as a PNG
    imageName = [NSString stringWithFormat:@"%@.png", imageName];

//change the source url to the new filename of the image so the WebView will load it from the main bundle
    html = [html stringByReplacingOccurrencesOfString:actualUrl withString:imageName];

//save the image to the main bundle
    NSString *pathString = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle]bundlePath], imageName];

//this just checks if the image already exists                             
    BOOL test = [[NSFileManager defaultManager] fileExistsAtPath:pathString];

     if (!test){

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); dispatch_async(queue, ^(void) {

     NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:actualUrl]];
    UIImage* image = [[UIImage alloc] initWithData:imageData];

                                                                                          NSData *imageData2 = UIImagePNGRepresentation(image);
                                                [imageData2 writeToFile:pathString atomically:YES];


    });
 }

次に、HTML文字列をUIWebViewにロードした後、シミュレーターでは完全に機能しますが、デバイスでは画像がロードされません。なんで?

    NSURL *baseUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@",[[NSBundle mainBundle]bundlePath]]];


[self.webView loadHTMLString:self.htmlPage baseURL:baseUrl];

提案、考えはありますか?画像は iOS デバイス/シミュレーターで正常にダウンロードされますが、実際のデバイスの WebView には読み込まれません。シミュレーターに最適です。

4

1 に答える 1

2

それは正しいです。

iOS では、アプリのバンドルは読み取り専用です。変更をバンドルに保存しようとすると、iOS デバイスでは失敗します。

Mac OS では、バンドルは読み取り専用ではありませんが、読み取り専用として扱う必要があります。アプリのバンドルを変更することはお勧めできません。ユーザーがアプリ ストアからアプリを更新したり、バックアップから復元したりすると、バンドルに保存した変更は Mac OS でも失われます。

シミュレーターは Mac OS で動作し、Mac OS フレームワークと Mac ファイル システムに対して構築されています。

SIM とデバイス上での実行にはかなりの数の違いがあります。これは一つです。

別の例: iOS ファイル システムは常に大文字と小文字を区別します。Mac OS で実行されるシミュレーターは、デフォルトでは大文字と小文字が区別されません。(Mac OS は、異なるファイル システムを実行しているボリュームから読み取ることができます。デフォルトのファイル システムでは大文字と小文字が区別されませんが、大文字と小文字が区別されるように設定できます。)

ファイル「Foo.txt」は、ファイル「foo.txt」とは別のファイルです。両方とも同じディレクトリに存在できます。ファイルの名前が「Foo.txt」で、文字列「foo.txt」をロードしようとすると、iOS デバイスでは失敗しますが、Mac OS では動作します。

そのため、アプリは常に実際のデバイスでテストする必要があります。シムで何かが正しく動作するからといって、それが iOS デバイスでも正しいと思い込まないでください。そうではないかもしれません。

于 2015-05-04T13:35:39.627 に答える