iOS WebView远程html与本地图像文件

2024-01-16

以前也有人问过类似的问题,但我一直找不到解决方案。

这是我的情况 - 我的 UIWebView 加载远程 html 页面。网页中使用的图像在构建时是已知的。为了使页面加载速度更快,我想将iOS应用程序中的图像文件打包并在运行时替换它们。

[请注意,html 是远程的。我总是得到从本地加载 html 和图像文件的答案 - 我已经这样做了]

我得到的最接近的建议是在 html 页面和 iOS 应用程序中使用自定义 url 方案,例如 myapp://images/img.png,使用 NSURLProtocol 子类拦截 myapp:// URL 并将图像替换为本地图像图像。理论上听起来不错,但我还没有遇到完整的代码示例来证明这一点。

我有 Java 背景。我可以使用自定义内容提供程序轻松地为 Android 完成此操作。我确信 iOS/Objective-C 一定存在类似的解决方案。我在 Objective-C 方面没有足够的经验,无法在短时间内自己解决这个问题。

任何帮助将不胜感激。


好的,这是一个如何子类化的示例NSURL协议 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html并提供图像(图片1.png) 已经在捆绑包中。下面是子类的标头、实现以及如何在 viewController(不完整的代码)和本地 html 文件(可以轻松与远程文件交换)中使用它的示例。我调用了自定义协议:myapp://正如您在底部的 html 文件中看到的那样。

谢谢你的提问!我自己问了这个问题很长一段时间,为了弄清楚这个问题所花费的每一秒都是值得的。

EDIT:如果有人在当前的 iOS 版本下运行我的代码遇到困难,请查看 sjs 的答案。当我回答这个问题时,它正在工作。他指出了一些有用的补充并纠正了一些问题,所以也给他支持。

这就是它在我的模拟器中的样子:

MyCustomURLProtocol.h

@interface MyCustomURLProtocol : NSURLProtocol
{
    NSURLRequest *request;
}

@property (nonatomic, retain) NSURLRequest *request;

@end

MyCustomURLProtocol.m

#import "MyCustomURLProtocol.h"

@implementation MyCustomURLProtocol

@synthesize request;

+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
{
    if ([theRequest.URL.scheme caseInsensitiveCompare:@"myapp"] == NSOrderedSame) {
        return YES;
    }
    return NO;
}

+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)theRequest
{
    return theRequest;
}

- (void)startLoading
{
    NSLog(@"%@", request.URL);
    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL] 
                                                        MIMEType:@"image/png" 
                                           expectedContentLength:-1 
                                                textEncodingName:nil];

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];  
    NSData *data = [NSData dataWithContentsOfFile:imagePath];

    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [[self client] URLProtocol:self didLoadData:data];
    [[self client] URLProtocolDidFinishLoading:self];
    [response release];
}

- (void)stopLoading
{
    NSLog(@"something went wrong!");
}

@end

MyCustomProtocolViewController.h

@interface MyCustomProtocolViewController : UIViewController {
    UIWebView *webView;
}

@property (nonatomic, retain) UIWebView *webView;

@end

MyCustomProtocolViewController.m

...

@implementation MyCustomProtocolViewController

@synthesize webView;

- (void)awakeFromNib
{
    self.webView = [[[UIWebView alloc] initWithFrame:CGRectMake(20, 20, 280, 420)] autorelease];
    [self.view addSubview:webView];
}

- (void)viewDidLoad
{   
    // ----> IMPORTANT!!! :) <----
    [NSURLProtocol registerClass:[MyCustomURLProtocol class]];

    NSString * localHtmlFilePath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"html"];

    NSString * localHtmlFileURL = [NSString stringWithFormat:@"file://%@", localHtmlFilePath];

    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:localHtmlFileURL]]];

    NSString *html = [NSString stringWithContentsOfFile:localHtmlFilePath encoding:NSUTF8StringEncoding error:nil]; 

    [webView loadHTMLString:html baseURL:nil];
}

文件.html

<html>
<body>
    <h1>we are loading a custom protocol</h1>
    <b>image?</b><br/>
    <img src="myapp://image1.png" />
<body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS WebView远程html与本地图像文件 的相关文章

  • 动态更改复选框不会触发onChange?

    注意 jQuery 不是一个选项 我想检测复选框状态的变化 但是当我这样做时 onChange 事件似乎没有触发 document getElementById myCheckBox addEventListener change func
  • Metallib:读取模块时出错:无效的位码签名

    我有以下 Filter metal 文件 include
  • 如何使用 thymeleaf 和 spring 用列表填充下拉列表

    我需要用字符串列表中的所有值填充下拉列表 控制器类 RequestMapping value generateIds method RequestMethod GET public String launchPage Model model
  • 仅适用于 Firefox 的不同字体大小

    我只是为我的网站添加一个帐户标题 仅显示玩家的用户名 我正在使用自定义字体 它在 Chrome 和 IE 上运行良好 但是对于 Firefox 它不显示自定义字体 只显示下一个可用字体 即 Verdana 我不介意 但我的问题是 Verda
  • HTML/CSS - 使用图像作为输入类型=文件

    如何使用此图像 http h899310 devhost se proxy newProxy uplfile png http h899310 devhost se proxy newProxy uplfile png 而不是常规的
  • Polygonal Divs——让内容以特定形状溢出?

    这是我目前正在开发的网站 http willcrichton net http willcrichton net 如果单击中间六边形每一侧的箭头 您可以看到它使用 jQuery jQuery Cycle jQuery Easing 左右过渡
  • 内联 div 元素

    我试图将 div 元素放在一起 问题是 即使有足够的空间让两个元素位于同一行 新的 div 也会将自身移动到下一行 如果没有足够的空间 我只需要另一个 div 去到下一行 有人知道怎么做这个吗 将 CSS 显示样式设置为display in
  • 在 Android 和 iOS 上播放的视频/音频编解码器设置是什么

    哪些编解码器设置将生成可在 Android videoView 和 iOS UIWebView 上播放的有效视频 安卓 http developer android com guide appendix media formats html
  • numberOfRowsInSection:重新加载数据时未调用

    我有一个UITableView使用数组来列出数据 这很好用 我也有一个UISearchBar用于搜索那个tableview 当 tableviews 数组中的数据匹配时 这些行将添加到另一个可变数组中 并且cellForRowAtIndex
  • 保留rootViewController?

    我想知道是否有人可以帮助我解决下面代码中的内存管理问题 我对 rootController 特别感兴趣 当我执行 initWithRootViewController 时它是否会被保留 或者它是否 这是我的猜测 通过窗口 addSubVie
  • 从子视图导航控制器访问顶部导航控制器

    我有一个像这样设置的视图和控制器 标签 栏控制器 1 内是根视图控制器 2 内是一个以编程方式创建的导航控制器 它在根视图控制器中显示为子视图 我想做的是访问顶部选项卡栏 导航控制器 以便我可以将视图推送到上面 我尝试了parentView
  • 对于 SEO 而言,.html 扩展名是否比 .php 和 .aspx 更好?

    对于 SEO 而言 html 扩展名是否比 php 和 aspx 更好 或者少扩展名的 url 比全部更好 该扩展对排名和所有 SEO 影响不大 您页面的扩展名可能不一定表明内容是如何生成的 PHP 或 ASPX 虽然通常具有动态内容 但始
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • 如何停止在 div 外部显示图像

    考虑这段代码 div style width 100px height 100px border 1px solid black div img src http rabbitempire org wp content uploads Pe
  • 当用户输入/删除时,使文本字段中的提示消失/重新出现[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道我怎样才能在我的搜索栏中做出
  • GWT - 让 CellTable 单元格使用 HTML?

    我有一个 CellTable 我想将 HTML 代码放入单元格中 以下代码不起作用 空格已从输出中删除 TextColumn
  • 如何使CSS图像溢出其所在的div

    我在 css 中输入了一个图像 代码如下 imgtemp float right top 0px left 0px overflow visible width 100 我还在页面中添加了 div 标签 以便其显示 但由于设计原因 图像比
  • 延迟 HTML5:无效伪类直到第一个事件发生

    我最近发现 invalid伪类适用于required页面加载后立即生成表单元素 例如 如果您有以下代码
  • 如何以编程方式伪造 UIButton 的触摸事件?

    我正在编写一些单元测试 并且由于这个特定应用程序的性质 重要的是我要达到尽可能高的水平UI链尽可能 因此 我想做的是以编程方式触发按钮按下 就好像用户按下了按钮一样GUI 是的 是的 我could只需致电IBAction选择器 但同样 这个
  • Matlab下降低图像质量

    问候 我正在尝试找到一种简单的方法来处理图像 以便将其质量从 8 位降低到 3 位 实现这一目标的最简单方法是什么 干杯 如果要线性缩放 只需将每个像素值除以 255 7 即 如果原始图像存储在矩阵 I 中 则让低分辨率图像 J I 255

随机推荐