iOS中,JS于OC的相互调用

1.

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>OCJS互调</title>

</head>

<body>

周杰伦

110

<button style="background:red; width:100px; height: 30px" onclick="jsCallOc()">

        Call

    </button>

<br>

<a href="https://www.baidu.com/">百度一下就知道了</a>

</body>

<script type="text/javascript">

function ocCallJsNoParams() {

alert("oc调用js无参数");

}

function ocCallJsHsParams(name , address){

alert(name+"的地址是:"+address);

}

function jsCallOc(){

location.href = 'InternetProtocol://Parameter1_withParameter2_?name&age';

}

</script>

</html>

用WebView加载以上的静态网页。

2.

#import "NSObject+JSCallOC.h"


@implementation NSObject (JSCallOC)

-(id)t_performSelector:(SEL)aSelector withObject:(NSArray *)objects{

    

//    signature 记录方法的返回值和参数类型

    NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:aSelector];

    if (signature == nil) {

//        签名没有抛出异常

        NSString *reason = [NSString stringWithFormat:@"没有%@的方法",NSStringFromSelector(aSelector)];

        NSException *exception = [NSException exceptionWithName:@"错误" reason:reason userInfo:nil];

        @throw exception;

    }

//    NSInvocation 包装了一次方法的调用(方法的调用者,方法名, 参数 返回值)

    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];

    invocation.target = self;//指定方法的调用

    invocation.selector = aSelector;//指定方法名

    

//    设置参数

    NSInteger parameterCount =  signature.numberOfArguments -2;

    parameterCount = MIN(parameterCount, objects.count);

    for (int i = 0 ; i < parameterCount; i ++) {

        id param = objects[i];

//        剔除空参数

        if (![param isKindOfClass:[NSNull class]]) {

            [invocation setArgument:&param atIndex:i +2];

        }

    }

    

//    调用

    [invocation invoke];

    

//    设置方法的返回值

    id returnValue = nil;

    if (signature.methodReturnLength) {

        [invocation getReturnValue:&returnValue];

    }

    return returnValue;

}


3.

#import "ViewController.h"

#import "NSObject+JSCallOC.h"


@interface ViewController ()<UIWebViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    [self.webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"ocjs.html" withExtension:nil]]];

    self.webView.delegate = self;

}


#pragma mark -- webViewDelegate


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

    //获取url全路径

    NSString *url = request.URL.absoluteString;

    NSString *protocol = @"internetprotocol://";

    

    if ([url hasPrefix:protocol]) {

        //获取协议后的路径

        NSString *path = [url substringFromIndex:protocol.length];

        //利用占位符分割方法名 参数

        NSArray *subPath = [path componentsSeparatedByString:@"?"];

        //获取方法名

        NSString *methodName = [subPath.firstObject stringByReplacingOccurrencesOfString:@"_" withString:@":"];

        //获取参数

        NSArray *params = nil;

        if (subPath.count == 2) {

            params = [subPath.lastObject componentsSeparatedByString:@"&"];

        }

        SEL sel = sel_registerName([methodName UTF8String]);

        //调用方法

        [self t_performSelector:sel withObject:params];

        return NO;

    }

    

    return YES;

}


//oc -----> js

-(void)webViewDidFinishLoad:(UIWebView *)webView{

    NSString *javaScript = @"ocCallJsNoParams()";

//    NSString *javaScript = [NSString stringWithFormat:@"ocCallJsHsParams('%@' , '%@')",@"无限",@"WIFI"];

    [webView stringByEvaluatingJavaScriptFromString:javaScript];

}


//js --- >oc

-(void)call:(NSString *)name{

    NSLog(@"参数是:%@",name);

    NSLog(@"%s",__FUNCTION__);

}


-(void)Parameter1:(NSString *)parameter1 withParameter2:(NSString *)parameter2{

    NSLog(@"%@---%@",parameter1,parameter2);

}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七尺天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值