zoukankan      html  css  js  c++  java
  • iOS--JavaScript和OC交互

    在iOS开发中很多时候我们会和UIWebView打交道,目前国内的很多应用都采用了UIWebView的混合编程技术,最常见的是微信公众号的内容页面。

    机制

    OC语言调用JavaScript语言,是通过UIWebView中的代理方法:- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;来实现的。该方法向UIWebView传递一段需要执行的JavaSript代码最后获取之行结果

    JavaScript语言调用OC语言,没有现成的API,但是使用某些方法可以达到相应的效果。具体是利用UIWebView的特性:UIWebView内发起的所有网络请求,都是通过delegate函数得到通知。

    (1)实例的HTML源码如下

    <html>
        <head>
            <meta http-equiv="content-type" content="text/html;charset=utf-8" />
            <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
            <meta content="always" name="referrer" />
            <title>测试网页</title>
        </head>
        <body>
            <br />
            <a href="devzeng://login?name=zengjing&password=123456">点击链接</a>
        </body>
    </html>
    

     (2)UIWebView Delegate回调方法

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        NSURL *url = [request URL];
        if([[url scheme] isEqualToString:@"devzeng"]) {
            //处理JavaScript和Objective-C交互
            if([[url host] isEqualToString:@"login"])
            {
                //获取URL上面的参数
                NSDictionary *params = [self getParams:[url query]];
                BOOL status = [self login:[params objectForKey:@"name"] password:[params objectForKey:@"password"]];
                if(status)
                {
                    //调用JS回调
                    [webView stringByEvaluatingJavaScriptFromString:@"alert('登录成功!')"];
                }
                else
                {
                    [webView stringByEvaluatingJavaScriptFromString:@"alert('登录失败!')"];
                }
            }
            return NO;
        }
        return YES;
    }
    重要说明:
    1、同步和异步的问题
    OC调用JavaScript代码的时候是同步的
    - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    JavaScript调用OC代码的时候是异步的
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
    2、常见的JS调用
    获取页面的title
    NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
    获取当前的URL
    NSString *url = [webview stringByEvaluatingJavaScriptFromString:@"document.location.href"];

  • 相关阅读:
    nginxWebUI
    c#通过串口及CAN模块实现上位及下位机通讯
    使用IDEA创建SpringBoot项目出现intellij idea No active profile set, falling back to default profiles: default
    linux服务器创建python环境
    在Linux服务器上安装anaconda
    牛客-小w的魔术扑克【并查集】
    bzoj#4161-Shlw loves matrixI【常系数线性齐次递推】
    CF903G-Yet Another Maxflow Problem【线段树,最大流】
    P4700-[CEOI2011]Traffic【tarjan,dp】
    CF1039D-You Are Given a Tree【根号分治,贪心】
  • 原文地址:https://www.cnblogs.com/cookiess/p/5434567.html
Copyright © 2011-2022 走看看