IOS WebView中JS和OC相互调用

  现在有很多项目中都涉及到HTML5,在一个普通的APP里面嵌入HTML5网页,嵌入的这些网页在服务器把页面修改之后同样也能跟着修改,这样就能很方便的修改程序的展示内容。如果使用tabelView或者其他的控件展示内容的话,当展示的内容的样式需要发生改变的时候必须修改程序本身才能够达到修改的效果。所以,在APP里面HTML5的嵌入可以更加方便的维护程序的内容,但是由于现在受网速啊,手机性能等因素的影响导致HTML5的用户体验没有系统原生代码修改的APP好,所以针对这个JS和OC的项目调用,这里只是简单的讲讲,方便大家以后的学习和使用。


1.JS调OC

  在JS调用OC的时候,其实我使用的是取巧的办法,当我们使用webView加载网页的时候,每一次请求都会被webView的

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

代理方法捕捉到,然后我们就可以在该代理方法里面进行相应的操作,这里我们先看看我写的一个简单测试代码,首先看测试网页的源代码:

<html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <br/><br/>
    <button onclick="fn_call();">打电话</button>
    <br/><br/>
    <button onclick="fn_getmethon();">获取参数</button>
    <script type="text/javascript">
    function fn_call(){
        window.location.href='sn://call';
    }
    function fn_getmethon(){
        window.location.href='sn://getValue';
    }
    function fn_alertMsg(msg){
        alert(msg);
    }
    </script>
    </body>
</html>

在这个页面里面,有两个按钮,按钮点击之后分别调用两个方法,在方法里面使用window.location.href='sn://getValue'发送一个请求,但是这个请求的协议不是http所以页面不会进行跳转;接着我们在webView的代理方法里面捕捉事件。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
    NSLog(@"打印请求的URL-->%@", url);
    NSRange range = [url rangeOfString:@"sn://"];
    NSUInteger location = range.location;
    if (location != NSNotFound) {
        NSString *methon = [url substringFromIndex:location + range.length];
        SEL fn = NSSelectorFromString(methon);
        [self performSelector:fn withObject:nil];
    }

    return YES;
}

- (void)call {
    NSLog(@"调用打电话");
}

当我们按了”打电话”这个按钮之后,控制台就会出现
这里写图片描述
这里我们就可以对得到的URL进行简单的截取啊,判断等操作,然后再执行需要执行的OC代码,我这里是调用了call()这个方法,这样就完成了JS对OC的调用。

2.OC调JS

  前面讲了JS对OC的调用,在这里OC调用JS的原理其实差不多,在最开始的html页面里面有一个”获取值”的按钮点击之后就会调用js方法,然后在OC里面捕捉到对应的方法

- (void)getValue {
    NSLog(@"调用获取值");
    NSMutableString *js = [NSMutableString string];
    [js appendString:[NSString stringWithFormat:@"fn_alertMsg('%@');", @"这是测试传值"]];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

这这个方面里面我们主要记住要在webView执行js代码就要调用- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;这个方法,我们只需要传入需要执行的JS代码然后就可以在webView里面执行。先看看执行的效果:
执行结果通过上面提到的的代码就完成了OC对JS的调用,在用OC对JS调用的时候我们要先测试JS代码的正确性,这样能提高我们的开发效率。

  好了,webView中JS和OC调用,以及OC和JS的调用就写到这里了,有不足的地方希望大家多提提,最后附上完整的代码,webView控件使用故事版拖的

@interface ViewController () <UIWebViewDelegate>
@property (strong, nonatomic) IBOutlet UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"test.html"]];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    self.webView.delegate = self;
    [self.webView loadRequest:request];
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = request.URL.absoluteString;
    NSLog(@"打印请求的URL-->%@", url);
    NSRange range = [url rangeOfString:@"sn://"];
    NSUInteger location = range.location;
    if (location != NSNotFound) {
        NSString *methon = [url substringFromIndex:location + range.length];
        SEL fn = NSSelectorFromString(methon);
        [self performSelector:fn withObject:nil];
    }

    return YES;
}

- (void)getValue {
    NSLog(@"调用获取值");
    NSMutableString *js = [NSMutableString string];
    [js appendString:[NSString stringWithFormat:@"fn_alertMsg('%@');", @"这是测试传值"]];
    [self.webView stringByEvaluatingJavaScriptFromString:js];
}

- (void)call {
    NSLog(@"调用打电话");
}

@end
UniWebView是用于移动Unity3D游戏的现代Web视图组件。将网页内容集成到游戏从未如此简单。什么是UniWebView UniWebView是一个Unity 3D插件,用于将Web视图组件添加到Unity 3D手机游戏。UniWebView在C#包含一组抽象的高级API,它们包装了iOS和Android平台的本机API。借助UniWebView,您可以在不了解本机开发的情况下将某些行为(例如浏览器)插入游戏。当您需要显示公告或通知,为玩家排名添加排行榜或仅向用户显示任何网页时,此功能非常有用。 #支持的平台 UniWebView支持运行: iOS 9.0或以上 Android 5.0(API级别21)或更高版本 在iOS上,UniWebView WKWebView用作渲染组件。在Android WebView上使用。 UniWebView还包含macOS上的Unity Editor支持,用于调试目的。如果要在Mac上开发游戏,则可以直接在Unity Editor的播放模式下打开独立的Web视图。如果您在Windows PC上工作,则仍可以在移动设备上构建和使用UniWebView,但是无法在Windows Unity编辑器直接查看结果。 该编辑器插件是功能齐全的各种移动版本。尽管UniWebView是为移动平台设计的,但如果需要,您也可以将其放入独立的macOS游戏。 #版本3 UniWebView项目始于2013年。UniWebView的原始版本支持Unity4。在Unity 5,Unity团队更改了本机插件工作方式的方法,并且无法在同一插件版本同时支持Unity 4和5。因此,我们决定对版本2进行重大升级。经过几年的开发,UniWebView 2现在非常稳定。但是,遗留代码仅UIWebViewiOS上支持旧样式(并且已弃用),并且我们还必须考虑向后兼容性,并且也必须使用过时的API WebView。 我们对这种情况不满意。如果我们使用最新技术,则性能和代码质量可能会大大提高。添加功能和解决问题也将更加容易和快捷。这就是我们决定从头开始重写UniWebView的原因。在版本3,我们再次从0开始,并重新设计了几乎所有API。凭借过去几年的发展经验,我们有机会使美好的事物变得更好,而糟糕的设计也就消失了。 已经在使用UniWebView 2?请查看第3版的重点内容,以了解它是如何从以前的版本演变而来的。请注意,版本3与版本2不兼容。如果要从UniWebView 2升级,则不妨对迁移指南进行简要介绍。大多数概念是相似的,但可能仍需要一段时间才能升级。我们还建议您阅读我们的文档,以将UniWebView的潜在功能带到您的项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值