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"];

  • 相关阅读:
    IntelliJ IDEA 如何在同一个窗口创建多个项目--超详细教程
    spring IOC原理
    java工作错误总结
    java跬步积累
    简单易懂设计模式——简单工厂模式
    Argo 项目入驻 CNCF,一文解析 Kubernetes 原生工作流
    电子书下载 | 超实用!阿里售后专家的 K8s 问题排查案例合集
    在生产环境中,阿里云如何构建高性能云原生容器网络?(含 PPT 下载)
    SIG Cloud Provider Alibaba 网研会第 2 期顺利召开 | 云原生生态周报 Vol. 46
    提问赠书 | 我们请了 7 位云原生专家,等你来问
  • 原文地址:https://www.cnblogs.com/cookiess/p/5434567.html
Copyright © 2011-2022 走看看