GAJavaScript 1.0b1

GAJavaScript 1.0b1

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布最后发布2014年12月

未指明的用户维护。



  • 作者:
  • Andrew Goodale

概览

GAJavaScript是一个使从原生代码中操作JavaScript变得更简单的Cocoa Touch库。它有几个重要的设计目标

  1. 使操作JavaScript对象和函数更类似于操作Objective-C对象和方法。
  2. 允许iOS设备上的原生应用程序利用JavaScript支持跨平台共享代码或使应用程序更加动态。
  3. 让原生iOS开发者利用WebKit内部的某些优秀网络技术。

JavaScript通过UIWebView从Cocoa Touch进行访问。GAJavaScript有一个“脚本引擎”的概念,它提供了对UIWebView内部JavaScript运行时的主要接口。实质上,UIWebView是该库的一个实现细节,但您可能想要管理脚本引擎使用的UIWebView实例。

GAScriptEngine

该类为库的主要接口。它接受或创建一个UIWebView并将其准备用于库。它实现了UIWebViewDelegate,以便在WebView加载时加载库的JavaScript文件,并实现了从JavaScript调用Objective-C方法的支持。它还添加了创建新对象的方法,无论是简单的“new Object”还是使用构造函数。以这种方式创建新对象时,其生命周期与返回的GAScriptObject的生命周期绑定,除非您将其分配为另一个对象的属性。

通常,iOS应用程序将有一个GAScriptEngine实例。您可以将实例保存在全局可访问的地方,例如UIApplication代理,或者与负责管理隐藏的UIWebView的对象/views一起保存。

UIWebView+GAJavaScript

此类别添加了对HTML文档中在WebView中加载的“document”和“window”对象的访问器。然后您可以使用任何GAScriptObject功能对它们进行操作。

GAScriptObject

此对象在UIWebView中提供了一个JavaScript对象的包装。它提供了一个KVC视图用于JavaScript对象,因此您可以像使用其他Objective-C类一样使用[NSObject valueForKey:][NSObject setValue:forKey:]来获取和设置对象的属性。只有非函数属性通过KVC暴露。

GAScriptObject处理语言之间的数据传输。它将处理字符串的引号,传递日期值,处理子对象和数组。

有三种“callFunction”方法可以用来调用对象上的函数,可以是无参数、一个参数或一组参数。KVC代码支持的所有数据类型都可以用作函数参数和返回类型。

GAScriptObject实现了NSFast Enumeration,以便您可以编写迭代脚本对象属性名称和值的循环。

使用它

在“/Tests”文件夹中有单元测试,展示了如何使用各种功能(并且确保功能工作!)。

开始的一个简单方法是

  1. 在您的项目中,将“ga-js-runtime.js”作为打包资源添加。此文件包含该库所需的JavaScript代码。
  2. 创建一个隐藏的UIWebView。它可以作为应用程序的UIWindow或UIApplicationDelegate中的视图的父视图。
  3. 创建GAScriptEngine,并将UIWebView传递给[GAScriptEngine initWithWebView:]
  4. 将您的HTML + JavaScript加载到视图中。您应该加载一个包含/包含您想要提供给Objective-C代码的所有JavaScript的HTML文档。
  5. 现在,您可以通过GAScriptEngine实例访问“document”或“window”对象,或者使用[GAScriptEngine newScriptObject:]创建自己的对象。

使用您的JavaScript

如果您在JavaScript中有一个命名空间对象(例如,“mycompany.lib”),您可以使用GAScriptEngine方法([GAScriptEngine scriptObjectWithReference:@"mycompany.lib"])为它创建一个GAScriptObject包装器。

您可以使用返回的GAScriptObject访问子对象或调用函数。

GAJavaScript的一个有趣特性是将GAScriptObject上的任意消息调用转换为JavaScript调用。这意味着您可以使用“常规”Objective-C调用语法调用JavaScript,而不是使用[GAScriptObject callFunction:]。这是通过GAScriptObject实现NSObject方法的调用转发来实现的。所需的所有只是定义与JavaScript函数签名匹配的选择器和方法签名。

如果您查看“GAScriptMethodSignatures.h”,您将看到一个对象,它定义了一套用于常用的JavaScript函数和DOM接口的选择器。如果您将此头文件包含到使用脚本对象的源代码中,您可以直接调用这些函数。例如,假设您有一个表示HTML "document"对象的GAScriptObject实例

// Get the "document" object from the script engine
id document = [scriptEngine documentObject];

// Get a GAScriptObject that represents the DOM element with id="myelement"
id myElement = [document getElementById:@"myelement"];

// The above is the same as this, but nicer to read and write
id myElement2 = [document callFunction:@"getElementById" withObject:@"myelement"];