iOS-基于UIWebView的混合开发

基于UIWebview的混合编程是指同时使用原生的控件和UIWebView来展现应用界面。合理地使用该方案可以保证应用既有原生界面的流畅交互效果,又有Web界面的良好的动态修改和多平台复用的优势。

———以上摘抄自《iOS开发进阶》

这一章是非常实用的一章,本文将提炼其中精华部分。


15.1 混合编程简介

基于UIWebview的混合编程本来就是一个挺普通常见的技术框架,但是自从国外开始用Hybird来称呼它时,这个技术突然间就变得“高大上”起来。

什么时候使用Hybird

  • 排版复杂
  • 界面的变化需求频繁
  • 界面对用户的交互需求不复杂

15.2 使用模板引擎渲染HTML界面

有过网站开发经验的朋友都知道我们一般需要一个模板引擎来对界面进行渲染,如Django:

<html>
    <body>
        <h1>{{name}}</h1>
    </body>
</html>

Django的模板引擎将替换 {{}} 中的变量为字符创而对界面进行显示,在iOS中也有类似的模板引擎,我们在这里介绍一下GRMustache,GRMustache在github有很完整的使用教程,这里简单的提一下:

安装

  • [CocoaPod]
    这部分相当简单,这部分大家可以自己去github查阅。

使用

#import “GRMustache.h"

假设我们的html文件是这样的,template.html:

<html>
    <body>
        <h1>{{name}}</h1>
    </body>

</html>

基本上所有的逻辑就是:

  • 从html获取到内容
  • 通过模板引擎进行字符串替换
  • 讲渲染后的字符串在webview上显示
-(NSString *)getTemplateFromName:(NSString *)name data:(NSDictionary *)data{    
    NSString *path = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:name];   //获取到.html文件地址    
    NSString *template = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];  //获取.html文件内容    
    NSString *content = [GRMustacheTemplate renderObject:data fromString:template error:nil]; //进行渲染  
    return content;
}

获取到渲染后的模板我们需要在webview上进行显示:


NSString *content = [self getTemplateFromName:@"template.html" data:@{@"name":@"StrongX"}];
NSString *path = [[NSBundle mainBundle] bundlePath];    
NSURL *baseURL = [NSURL fileURLWithPath:path]; 
[self.webview loadHTMLString:content baseURL:baseURL];

OC与JS互调

OC通知JS

UIWebview有一个方法
-(nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
假设我们的JS方法是这样的:


function funcName(userid){

    …….

}

那么我们使用OC调用这个方法就是这样的:


        [_webView stringByEvaluatingJavaScriptFromString:@“funcName(123456)"];

JS通知OC

JS通知OC并没有直接的方法,但是我们可以通过更新url的方式在UIWebview的delegate中拿到消息。

我们在js中调用方法

//js通知OC
function js_call_oc(){      
     var iFrame;      
     iFrame = document.createElement("iframe");        
     iFrame.setAttribute("src", "ios://StrongX");   
     iFrame.setAttribute("style", "display:none;");        
     iFrame.setAttribute("height", "0px");    
     iFrame.setAttribute("width", "0px");     
     iFrame.setAttribute("frameborder", "0");        
    document.body.appendChild(iFrame);   
     // 发起请求后这个iFrame就没用了,所以把它从dom上移除掉               
    iFrame.parentNode.removeChild(iFrame);     
    iFrame = null; 
}

我们可以看到我们设置一个“src”的属性,而这个属性就是我们在UIWebview的delegate中拿到字符串,如果传递一些简单的参数,也可以添加到这个字符串中。
我们在我们的OC代码中:


//

_webview.delegate = self;

//

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{   
 NSString *urlstr = request.URL.absoluteString;  
  NSRange range = [urlstr rangeOfString:@"ios://StrongX"]; 
   if (range.length!=0) {       //////////////

            你要执行的操作

        ////////////
    }
    return YES;
}

15.7 使用Safari进行调试

我们有时候可能会通过输出的方式来进行调试,在js中会使用console.log();方法,但是你会发现调用这个方法并不会在xcode的控制台输出(废话)。这个时候我们就可以通过safari来辅助我们进行开发。

  • 我们需要打开safari的调试模式:safari->偏好设置->高级->勾选在菜单中显示“开发”菜单
勾选开发菜单
  • 我们开需要在模拟器 或者真机上打开调试功能:设置->Safari->高级->Web检查器,打开开关:


    打开模拟器中的检查器

当你完成以上部分之后,当我们再运行项目,重新打开Safari(记得一定要重新启动Safari),在开发菜单中我们可以打开web检查器:


打开Web检查器

我们可以在web检查器中直接对html、css、js代码进行修改,同时在控制台会有对js等代码的调试、输出。(这个类似web开发时Chrome的检查功能)


Web检查器

欢迎加入iOS交流群537774852
更多文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容