我试图从html字符串预加载图片代码,以便在设备离线时加载它们。基本上,我从所有<img>
标签中删除源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中。它适用于模拟器。
答案 0 :(得分:2)
这是正确的。
在iOS上,App的捆绑包是只读的。任何将更改保存到捆绑包中的尝试都将在iOS设备上失败。
在Mac OS上,捆绑包不是只读的,但您仍应将其视为只读。修改你的应用程序包是个坏主意。如果用户从应用商店更新他们的应用,从备份中恢复等,那么即使在Mac OS上,您保存到捆绑包的更改也将丢失。
模拟器在Mac OS下运行,并且是针对Mac OS框架和Mac文件系统构建的。
SIM卡与设备上运行之间存在相当多的差异。这是一个。
另一个例子:iOS文件系统总是区分大小写。在Mac OS上运行的模拟器默认情况下不区分大小写。 (Mac OS可以读取运行不同文件系统的卷。默认文件系统不区分大小写,但您可以将其设置为区分大小写。)
文件&#34; Foo.txt&#34;是一个不同于文件&#34; foo.txt&#34;的文件。它们都可以存在于同一目录中。如果您的文件被调用&#34; Foo.txt&#34;并尝试使用字符串&#34; foo.txt&#34;加载它它会在iOS设备上失败,但在Mac OS上运行。
因此,您应该始终在实际设备上测试您的应用。不要假设如果某些内容在SIM卡上正常运行,那么它对iOS设备来说是正确的。它可能不是。