iOS与JS交互实战篇(Swift/ObjC)

前言

ObjectiveC与Js交互是常见的需求,可对于新手或者所谓的高手而言,其实并不是那么简单明了。这里只介绍iOS7.0后出来的JavaScriptCore framework。

关于JavaScriptCore

本教程中所涉及到的几种类型:

  • JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码
  • JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等
  • JSExport, JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用

ObjC与JS交互方式

通过JSContext,我们有两种调用JS代码的方法:

  • 1、直接调用JS代码
  • 2、在ObjC中通过JSContext**注入模型**,然后调用模型的方法

直接调用JS代码

 // 一个JSContext对象,就类似于Js中的window,
 // 只需要创建一次即可。
 self.jsContext = [[JSContext alloc] init];

 //  jscontext可以直接执行JS代码。
 [self.jsContext evaluateScript:@"var num = 10"];
 [self.jsContext evaluateScript:@"var squareFunc = function(value) { return value * 2 }"];
 // 计算正方形的面积
 JSValue *square = [self.jsContext evaluateScript:@"squareFunc(num)"];

 // 也可以通过下标的方式获取到方法
 JSValue *squareFunc = self.jsContext[@"squareFunc"];
 JSValue *value = [squareFunc callWithArguments:@[@"20"]];
 NSLog(@"%@", square.toNumber);
 NSLog(@"%@", value.toNumber);

这种方式是没有注入模型到JS中的。这种方式使用起来不太合适,通常在JS中有很多全局的函数,为了防止名字重名,使用模型的方式是最好不过了。通过我们协商好的模型名称,在JS中直接通过模型来调用我们在ObjC中所定义的模型所公开的API。

此处省略10000字…

本文内容较多,要完整阅读文章内容,请移步微信公众号文章:iOS与JS交互实战篇(ObjC版)

如果您正在学习Swift或者正在使用Swift开发,可以阅读Swift版的文章:Swift与JS交互实战篇

公众号搜索「iOS开发技术分享」快速关注,微信号:iOSDevShares

QQ群:324400294

时间: 2025-01-21 19:19:49

iOS与JS交互实战篇(Swift/ObjC)的相关文章

iOS与Javascript交互实战

下面内容已不再在此更新,请 关注微信公众号:iOSDevShares 加QQ群:324400294 加个人微信:huangyibiao520 Swift版与JS交互实战篇: http://mp.weixin.qq.com/s?__biz=MzIzMzA4NjA5Mw==&mid=214070747&idx=1&sn=57b45fa293d0500365d9a0a4ff74a4e1#rd OC版与JS交互实战篇: http://mp.weixin.qq.com/s?__biz=MzI

Android WebView使用方法详解 附js交互调用方法_Android

目前很多Android app都内置了可以显示web页面的界面,会发现这个界面一般都是由一个叫做WebView的组件渲染出来的,学习该组件可以为你的app开发提升扩展性. 先说下WebView的一些优点: --可以直接显示和渲染web页面,直接显示网页 --webview可以直接用html文件(网络上或本地assets中)作布局 --和JavaScript交互调用  一.基本使用 首先layout中即为一个基本的简单控件: <WebView android:id="@+id/webView

Node.js Stream - 进阶篇

上篇(基础篇)主要介绍了Stream的基本概念和用法,本篇将深入剖析背后工作原理,重点是如何实现流式数据处理和 back pressure 机制. 目录 本篇介绍 stream 是如何实现流式数据处理的. 数据生产和消耗的媒介 为什么使用流取数据 下面是一个读取文件内容的例子: const fs = require('fs') fs.readFile(file, function (err, body) { console.log(body) console.log(body.toString(

Node.js Stream - 基础篇

背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务.譬如,shell通过管道|连接各部分,其输入输出的规范是文本流. 在Node.js中,内置的Stream模块也实现了类似功能,各部分通过.pipe()连接. 鉴于目前国内系统性介绍Stream的文章较少,而越来越多的开源工具都使用了Stream,本系列文章将从以下几方面来介绍相关内容: 流的基本类型,以及Stream模块的基本使用方法 流式处理与back pres

WKWebView新特性及JS交互

声明 本博文原始地址在: http://mp.weixin.qq.com/s?__biz=MzIzMzA4NjA5Mw==&mid=400327803&idx=1&sn=2a09fa94dd605a9f03bbc16f998e5717#rd 本博客不会在此处更新文章,请关注微信公众号,更新的内容只会是在原文更新. 引言 一直听说WKWebView比UIWebView强大许多,可是一直没有使用到,今天花了点时间看写了个例子,对其API的使用有所了解,为了日后能少走弯路,也为了让大家更

Swift入门篇-swift简介

原文:Swift入门篇-swift简介   潜水博客园很多年,闲来无事,聊一下自己的经历,语文不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 在前期   ios入门篇 -hello Word(1) 文章中介绍我这半年准备写一些ios文章,一开始是准备写一些object-c方面的,但是最近苹果推出最近一门新的编程语言Swift.我也决定重新写一下Swift的方面的知识和苹果保持同步.   swift是一门什么语言了?   swift语言是苹果2014年6月3日正式推出一门新的的语言

ios-js和iOS之间的交互的问题

问题描述 js和iOS之间的交互的问题 在js端发出一个请求,在iOS的原生代码中,也就是webView去加载链接的时候,先去拦截url,拦截后,在iOS端去请求数据,请求下来数据后,把拿到的数据再去给js,然后js开始发出的链接的请求就会在js端返回iOS的请求数据.注意的是在js端并没有什么方法名之类的,js仅仅只是发出个url的请求. 解决方案 iOS UIWeb与JS之间的交互iOS和JS之间的交互 解决方案二: 这个没办法做到,只能js和iOS互相调用.没办法修改hook 解决方案三:

关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题

原文:关于FlexPaper 2.1.2版本 二次开发 Logo .打印.搜索.缩略图.添加按钮.js交互.右键菜单等相关问题 先废话几句.最近用到文档在线浏览功能,之前用的是print2flash(一个工具,文档直接转flash,自带翻页搜索等一系列功能),由于无法与js进行交互,所以改用flexpaper. 由于之前没接触过Flex,了解不多,所以文章难免有不合适的地方.希望各位给予指正. 首先感谢ajava.org的mark,一系列文章有很多的帮助,少走很多弯路.   开发工具:1.Ado

iOS瀑布流的简单实现(Swift)_IOS

这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及会介绍第一种实现的bug. <1>第一种 效果图如下所示: 这种实现方法的思路:  1)首先调用随机函数,产生随机高度,并把它保存到数组中 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectio