您的位置:首页 > 移动开发 > Objective-C

Objective-C和JS交互

2015-09-25 15:10 411 查看

一、核心原理

1. OC–>JS

stringByEvaluatingJavaScriptFromString,其参数是一NSString 字符串内容是js代码(这又可以是一个js函数、一句js代码或他们的组合),当js函数有返回值或一句js代码有值返回可通过stringByEvaluatingJavaScriptFromString的返回值获取。

2. JS–>OC

利用webView的重定向原理(即重新在js中指定document.location的值,此为一url),只要在这个url字符串中按自定义的规则指定好所需调用oc中的函数和参数,然后通过OC中的shouldStartLoadWithRequest函数去捕获处理请求。



二、OC源代码

1. ViewController.h 实现

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIWebViewDelegate>

@end


2. ViewController.m实现

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 初始化UIWebView
    UIWebView *web = [[UIWebView alloc] initWithFrame:self.view.bounds];
    web.delegate = self;
    [web setScalesPageToFit:YES];
    [self.view addSubview:web];

    //加载网页
    NSURL *url = [NSURL URLWithString:@"http://192.192.102.111:8080/test.html"];
    [web loadRequest:[NSURLRequest requestWithURL:url]];
}

#pragma mark - UIWebViewDelegate实现
#pragma mark 开始加载网页
- (void)webViewDidStartLoad:(UIWebView *)webView
{
    NSLog(@"开始加载网页");
}

#pragma mark 网页加载完成
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSLog(@"网页加载完成,调用JS代码\n--------------");
    [webView stringByEvaluatingJavaScriptFromString:@"ocUICall('阳君')"];
}

#pragma mark 网页加载出错
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    NSLog(@"网页加载出错:%@", error);
}

#pragma mark 网页监听
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    // 过滤
    NSString *requestString = [[request.URL absoluteString]stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];;
    // 分割
    NSArray *urlComps = [requestString componentsSeparatedByString:@"::"];
    if ([urlComps count] == 3 && [@"ios" isEqualToString:[urlComps objectAtIndex:0]])
    {
        //解析约定的指令
        // 方法名
        NSString *methods = [NSString stringWithFormat:@"%@:", [urlComps objectAtIndex:1]];
        // 携带的参数
        NSString *params = [urlComps objectAtIndex:2];
        NSLog(@"JS调用OC代码->UIWebView\n方法名:%@,参数:%@", methods, params);
        SEL selector = NSSelectorFromString(methods);
        // 判断类是否有方法
        if ( [ViewController instancesRespondToSelector:selector]) {
            // 执行方法,携带参数
            [self performSelector:selector withObject:params];
        } else {
            NSLog(@"没有提供调用的%@方法名",methods);
        }
        return NO;
    }
    return YES;
}

@end


三、JS源代码

// UIWebView调用
function ocUICall(params) 
{
    //  方法名
    var method = "test";
    // 组装请求数据
    var url = "ios::" + method + "::" + params;
    // 发起请求
    document.location = url;
}


四、运行输出

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: