webview与js交互

在iOS移动开发过程中,有时会遇到在ios客户端中嵌入web页面的场景。


多数时候该web页面是由第三方应用维护的,此时,如果客户端想触发web页面的某个方法,或者web页面想触发客户端的某个方法,就会涉及以下内容。


简单来说webview与js交互涉及到两方面,C端(客户端)调B端(web页面)js方法,和B端调C端方法。

举两个栗子:

1.某支付app中嵌入了某商城购物页面,该商场要使用app的支付方式进行支付。于是,在app客户端中内嵌的商城订单页面发起支付。

在发起支付的时候,商城页面(即B端)发送url给app(C端),app通过判断url方式,调用其原生方法进行支付。该流程及为B端调C端。

支付成功之后,商城根据app告知的支付结果,即app调用商城页面上的js方法,在页面上弹出支付成功。该流程为C端调B端。

2.某app中嵌入某应用个人资料页面,该应用要使用app中的照相功能或者照片库中的图片。流程参考栗子1。


代码如下:

1.work.html为嵌入app的web页面。(该栗子的web页面放入了app工程中,真实情况大多数为http协议的url)

2.ios中视图控制器中的实现,核心是 shouldStartLoadWithRequest代理方法,对url的判断

@interface ViewController ()
{
    UIWebView * webView_js;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    webView_js = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    [self.view addSubview:webView_js];
    webView_js.delegate = self;
    NSString *path = [[NSBundle mainBundle]pathForResource:@"work" ofType:@"html"];
    
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
    [webView_js loadRequest:request];
    // Do any additional setup after loading the view, typically from a nib.
}

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    NSString *host = [[request URL] host];
    NSString *scheme = [[[request URL]scheme]lowercaseString];
    //B调C,通过B页面传来的URL,触发C页面的方法
    if ([scheme isEqualToString:@"native"]) {
        if([host isEqualToString:@"openCamera"]){
            NSLog(@"打开照相机...");
            NSString *callbackJs = [NSString stringWithFormat:@"alert('%@')",@"成功打开照相机"];
            //C调B,触发B页面JS方法
            [webView stringByEvaluatingJavaScriptFromString:callbackJs];
        }
    }
    return YES;
}

-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    if (error.code==101) {
        return;
    }
    NSLog(@"错误代码:%ld",(long)error.code);
}


    test
    
   
   

<script>
function testLoad(){
window.location = 'native://openCamera';
}
</script>


   
   
[测试页面]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值