写本文的原因是今天被要求「调研在iOS中加载本地HTML的相关技术」,好记性不如烂笔头,将一些东西给记录下来吧。
应用场景是这样的:手头的iOS App有一部分UI需要使用HTML完成,好处是这部分UI可以更灵活,即可以在任何不需要升级App的情况下更新这部分UI(包括样式、操作等等)。当下非常火的技术 – Facebook的React Native – 正是用来解决这种问题的,毕竟在传统的开发模式下,更新UI必须要升级App,而升级App是一个非常耗时的过程。使用Web App部分代替Native App已经成为当下移动客户端开发的一种思潮了。为了简便起见,也为了不给项目的接盘者制造更高的门槛,暂时决定不使用React Native(原因是多方面的)等著名框架去这种事情,从0开始探究。话说胡来,也许走了这么一遭之后,以后学习React Native会有更多的体会呢!
总之,目前的构想是这样的:
- App部分UI是由HTML+JS+CSS完成的,HTML+JS+CSS代码会随着App一起发布;
- 当后端决定更新App的部分UI(HTML)时,客户端从服务器下载最新的HTML+JS+CSS包,解压后代替本地的、旧的HTML+JS+CSS资源,将最新的呈现给用户,至此完成UI的更新;
因此有这么些问题需要考虑:
- 加载本地HTML+JS+CSS资源(在iOS中,通常使用UIWebView);
- 解压从服务端下载的压缩文件(HTML+JS+ CSS包);
- JS代码和OC代码的互相调用;
本文主要探究第一个问题!
UIWebView介绍
UIWebView是iOS中一个非常常用的控件,是内置的浏览器控件,可能也是最强大复杂的控件。可以用它来浏览网页、打开文档(譬如PDF文档)等等。
UIWebView既可以用来显示本地文档,也可以用来显示网络文档。无论是显示本地文件还是网络文件,此过程都可以统称为「加载」。与「加载」相关的方法不多,只有三个:
// Loading Local Content or Loading Content From the Network
- (void)loadRequest:(NSURLRequest *)request;
// 嵌入HTML结构的字符串
- (void)loadHTMLString:(NSString *)string
baseURL:(NSURL *)baseURL;
// Loading Local Content
- (void)loadData:(NSData *)data
MIMEType:(NSString *)MIMEType
textEncodingName:(NSString *)textEncodingName
baseURL:(NSURL *)baseURL;
|
与UIWebView相关的知识点并不多(从某种角度来看,也可以认为是Apple封装得比较好吧),除了上述的三个方法之外,还有必要了解的是UIWebViewDelegate定义的一些delegate方法:
// 开始加载前调用
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType;
// 开始加载时调用
- (void)webViewDidStartLoad:(UIWebView *)webView;
// 加载成功时调用
- (void)webViewDidFinishLoad:(UIWebView *)webView;
// 加载失败时调用
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error;
|
除此之外,UIWebView似乎有啥其他需要了解的内容,若有需要,以后再补充吧!