OC与JS交互 — 原生

OC与JS交互 — 原生本文只是介绍简单的 OC 与 JS 交互

本文只是介绍简单的OC与JS交互

一、OC调用JS

<html> <header> <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8"/> <title>zhaoName制作的网页 
   title>  
   header> <script Type = "text/javascript"> function login() { 
     return 100; }  
   script> <body> 电话:10086 <button style="background:red; width:120px; height:30px;">call 
   button>  
   body>  
   html>

调用webView的方法

// 获取网页的标题 self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; // 调用JS中的函数 NSLog(@"%@", [webView stringByEvaluatingJavaScriptFromString:@"login();"]);

这里写图片描述


二、JS调用OC

<html> <header> <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8"/> <title>zhaoName制作的网页 
    title>  
    header> <script Type = "text/javascript"> function login() { 
      location.href = 'zhaoName://openLibrary'; }  
    script> <body> 电话:10086 <button style="background:red; width:120px; height:30px;" onclick="login();">call 
    button> <br> <a href="https://github.com/zhaoName">zhaoName的Git 
    a>  
    body>  
    html>

以下都是点击webView上的按钮”call”,调用OC中的方法

1、没有参数

/ * 通过这个方法完成JS调OC */ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = @"zhaoname://"; if ([request.URL.absoluteString hasPrefix:url]) { NSString *methodName = [request.URL.absoluteString substringFromIndex:url.length]; [self performSelector:NSSelectorFromString(methodName) withObject:nil]; return NO; } NSLog(@"想加载网络请求,不想做JS调用OC"); return YES; } - (void)openLibrary { NSLog(@"JS调用OC方法--%s", __func__); }

这里写图片描述


2、一个参数

上面HTML中函数修改为

function login() { location.href = 'zhaoName://sendMessage_?How are you'; }

OC获取的路径path会自动删除’:’,所以此处用’_’代替。参数用?分割。(实际开发中需要你和写HTML的人共同制定JS调OC的规则)

/ * 通过这个方法完成JS掉OC */ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = @"zhaoname://"; if ([request.URL.absoluteString hasPrefix:url]) { // 路径 NSString *path = [request.URL.absoluteString substringFromIndex:url.length]; NSArray *subPaths = [path componentsSeparatedByString:@"?"]; // 获取方法名 NSString *methodName = [subPaths.firstObject stringByReplacingOccurrencesOfString:@"_" withString:@":"]; // 参数 NSString *para = subPaths.lastObject; [self performSelector:NSSelectorFromString(methodName) withObject:para]; return NO; } NSLog(@"想加载网络请求,不想做JS调用OC"); return YES; } - (void)sendMessage:(NSString *)message { NSLog(@"JS调用OC方法--%s 参数:%@", __func__, message); }

这里写图片描述


3、两个参数

上面HTML中函数修改为

function login() { location.href = 'zhaoName://sendMessage_sendName_?hehe&zhaoName'; }

‘:’用’_’代替,方法名和参数用’?’分割,参数之间用’&’分割

/ * 通过这个方法完成JS掉OC */ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = @"zhaoname://"; if ([request.URL.absoluteString hasPrefix:url]) { // 路径 NSString *path = [request.URL.absoluteString substringFromIndex:url.length]; NSArray *subPaths = [path componentsSeparatedByString:@"?"]; // 获取方法名 NSString *methodName = [subPaths.firstObject stringByReplacingOccurrencesOfString:@"_" withString:@":"]; // 参数 NSArray *paras = nil; // 防止出现无参数的情况 if(subPaths.count == 2 || [subPaths.lastObject containsString:@"&"]) { paras = [subPaths.lastObject componentsSeparatedByString:@"&"]; } // 防止出现参数为空的情况 NSString *firstPara = paras.firstObject; NSString *secondPara = paras.count <= 1 ? nil : paras.lastObject; [self performSelector:NSSelectorFromString(methodName) withObject:firstPara withObject:secondPara]; return NO; } NSLog(@"想加载网络请求,不想做JS调用OC"); return YES; } - (void)sendMessage:(NSString *)message sendName:(NSString *)sendName { NSLog(@"JS调用OC方法--%s 参数:%@ %@", __func__, message, sendName); }

这里写图片描述


4、三个及以上的参数

系统自带的方法performSelector最多只能传两个参数,所以有三个及以上的参数我们要借助NSInvocation类。

NSObject+Invocation.h文件

#import 
       
       @interface NSObject (Invocation) 
       / * 基于NSObject封装一个可用于JS调用OC方法的分类,适用于参数可有可无,可有多个  @param selector 方法名  @param parameters 参数  @return 返回值 */ - (id)performSelector:(SEL)selector withParameters:(NSArray *)parameters; 
       @end 
      

NSObject+Invocation.m文件

#import "NSObject+Invocation.h" @implementation NSObject (Invocation) - (id)performSelector:(SEL)selector withParameters:(NSArray *)parameters { // 方法签名 NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector]; if(signature == nil) return nil; // 利用NSIvocation可以包装一次方法调用(设置方法调用者、方法名、参数、返回值) NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; // 设置方法调用者 invocation.target = self; // 设置方法名 invocation.selector = selector; // 设置方法参数 注意参数下标从2开始,0、1被系统占用 for(int i=0; i 
      
        .count; i++) { 
       id object = parameters[i]; 
       if([object isKindOfClass:[NSNull class]]) 
       continue; [invocation setArgument:&object atIndex:i+ 
       2]; } 
       // 执行 [invocation invoke]; 
       // 设置返回值 
       id returnValue = 
       nil; 
       // 兼顾没有返回值的方法 
       if(signature 
       .methodReturnLength != 
       0) { [invocation getReturnValue:&returnValue]; 
       // 说明此方法有返回值 } 
       return returnValue; } 
       @end 
      

上面HTML中函数修改为

function login() { location.href = 'zhaoName://sendMessage_sendName_reviceName_?hehe&zhaoName&nicai'; }
/ * 通过这个方法完成JS掉OC */ - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSString *url = @"zhaoname://"; if ([request.URL.absoluteString hasPrefix:url]) { // 路径 NSString *path = [request.URL.absoluteString substringFromIndex:url.length]; NSArray *subPaths = [path componentsSeparatedByString:@"?"]; // 获取方法名 NSString *methodName = [subPaths.firstObject stringByReplacingOccurrencesOfString:@"_" withString:@":"]; // 参数 NSArray *paras = [subPaths.lastObject componentsSeparatedByString:@"&"]; // 调用OC中的方法 并获取返回值 NSString *result = [self performSelector:NSSelectorFromString(methodName) withParameters:paras]; NSLog(@"%@", result); return NO; } NSLog(@"想加载网络请求,不想做JS调用OC"); return YES; } - (NSString *)sendMessage:(NSString *)message sendName:(NSString *)sendName reviceName:(NSString *)reviceName { NSLog(@"JS调用OC方法--%s 参数:%@ %@ %@", __func__, message, sendName, reviceName); return @"发信息"; }

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210870.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午11:43
下一篇 2026年3月18日 下午11:43


相关推荐

  • activexobject是什么意思_session函数

    activexobject是什么意思_session函数什么是ActiveX控件?ActiveX控件广泛用于Internet。它们可以通过提供视频、动画内容等来增加浏览的乐趣。不过,这些程序可能出问题或者向您提供不需要的内容。在某些情况下,这些程序可被用来以您不允许的方式从计算机收集信息、破坏您的计算机上的数据、在未经您同意的情况下在您的计算机上安装软件或者允许他人远程控制您的计算机。考虑到这些风险,您应该在完全信任发行商的情况下才安装

    2022年10月14日
    4
  • asp.net MVC简单图片上传

    asp.net MVC简单图片上传asp.netMVC简单图片上传01、创建控制器HomeController.csusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Web;usingSystem.Web.Mvc;namespacemvcTuPianShangChuang.Controllers{publicclassHomeController:Controller{

    2022年7月22日
    10
  • 关于后台动态模板添加内容的总结 Builder使用

    关于后台动态模板添加内容的总结 Builder使用

    2021年10月21日
    44
  • jquery实现更多内容效果

    体验效果:http://hovertree.com/texiao/jquery/33/写个“更多内容的展开/收起”的js代码如下:转自:http://hovertree.com/h/bjaf/6

    2021年12月22日
    46
  • Eamcs ditaa基于字符图形产生的图像上

    Eamcs ditaa基于字符图形产生的图像上

    2022年1月5日
    57
  • js保留两位小数四舍五入_js保留两位小数不四舍五入

    js保留两位小数四舍五入_js保留两位小数不四舍五入首先我们来看2个方法:1、tofixed方法toFixed()方法可把Number四舍五入为指定小数位数的数字。但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则。银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下:简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。如…

    2025年6月19日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号