将图像保存到 Main Bundle 然后将它们加载到 HTML 可以在模拟器上工作,但不能在真实设备上工作?

Saving images to Main Bundle and then loading them into HTML works on Simulator, but not on real Device?

我正在尝试从 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 device/simulator 上下载正常,但未加载到真实设备的 WebView 中。它非常适合模拟器。

没错。

在 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 上工作。

因此,您应该始终在实际设备上测试您的应用。不要假设如果某些东西在 sim 上正常工作,它对 iOS 设备也是正确的。可能不是。