iOS和JS交互

https://blog.csdn.net/dolacmeng/article/details/79623708

h5代码

<html>
    <head>
        <meta charset='utf-8'/>
        <title></title>
        
        <script>
            function showAlert(String){
                alert(String);
            }
        
            function onClickOC(String){
                app.onClickOC(String);
            }
        
            function clickCallBack(result){
                document.getElementById("result").innerHTML="点击结果:"+result;
            }
        </script>
    </head>
    
    <body>
        <button type="button" onclick="onClickOC('html')">click me</button>
        <a href="tt://showmsg">showmsg</a>
        <p id="result">点击结果:</p>
    </body>
</html>
拦截URL

适用于UIWebView和WKWebView,适用于带有超链接的h5标签,比如上面h5代码中的‘a’标签。

web调OC

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *requestStr = request.URL.absoluteString;
    if ([requestStr isEqualToString:@"tt://showmsg"]) {
        NSLog(@"show OC msg");
        
        //OC调JS,将OC处理结果返回给web页面
        [webView stringByEvaluatingJavaScriptFromString:@"clickCallBack('点击结束')"];
        return NO;
    }
    
    return YES;
}
JavaScriptCore

方法1:使用block

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
     context[@"onClickOC"] = ^(NSString *string) {
     NSLog(@"onClickOC--%@", string);
     };
}

方法2:

  • 新建类继承自NSObject(如AppJSObject)。 
  • .h文件中声明一个代理并遵循JSExport,代理内的方法和js定义的方法名一致。 
  • .m文件中实现<2>代理中对应的方法,可以在方法内处理事件或通知代理。
  • 在UIWebView加载完成的代理中把AppJSObject实例对象类注入到JS中,那么在js中调用方法就会调用到原生AppJSObject实例对象中对应的方法了。
//APPJSObject.h

#import <Foundation/Foundation.h>
#import <JavaScriptCore/JavaScriptCore.h>

@protocol APPJSObjectDelegate <JSExport>

-(void)onClickOC:(NSString *)name;

@end

@interface APPJSObject : NSObject<APPJSObjectDelegate>

@property (nonatomic, weak) id<APPJSObjectDelegate> delegate;
@end
//APPJSObject.m

#import "APPJSObject.h"

@implementation APPJSObject

-(void)onClickOC:(NSString *)name
{
    [self.delegate onClickOC:name];
}
@end
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
    APPJSObject *obj = [[APPJSObject alloc] init];
    obj.delegate = self;
    context[@"app"] = obj;
}

OC调JS

JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//js字符串是要调用的JavaSCript函数
NSString *js = [NSString stringWithFormat:@"clickCallBack('点击结束')"];
[context evaluateScript:js];

转载于:https://my.oschina.net/mexiaobai1315/blog/1925251

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值