当前位置: 首页 > 软件库 > iOS代码库 > 网页(Webview) >

GSWebView

GWebView是集成了两代Web引擎的最好用的网页JS交互框架之一
授权协议 MIT
开发语言 Objective-C
所属分类 iOS代码库、 网页(Webview)
软件类型 开源软件
地区 国产
投 递 者 百里成仁
操作系统 iOS
开源组织
适用人群 未知
 软件概览

GWebView是集成了两代Web引擎的最好用的网页JS交互框架之一

GSWebView文档:https://github.com/xorshine/GSWebView

GSWebView下载地址:https://github.com/xorshine/GSWebView.git

如UIWebView一样使用GSWebView,用熟悉的API开发

  1.  GSWebView被设计成UIWebView相同的样式,意在降低开发者的使用难度。
  2.  引入WebKit与JavaScriptCore库,即刻出发,开始使用GSWebView。
@property (nonatomic, readonly, strong) UIScrollView *scrollView;
@property (nonatomic, readonly) BOOL canGoBack;
@property (nonatomic, readonly) BOOL canGoForward; 

- (void)reload;
- (void)stopLoading;
- (void)goBack;
- (void)goForward;

- (BOOL)gswebView:(GSWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(GSWebViewNavigationType)navigationType;
- (void)gswebViewDidStartLoad:(GSWebView *)webView;
- (void)gswebViewDidFinishLoad:(GSWebView *)webView;
- (void)gswebView:(GSWebView *)webView didFailLoadWithError:(NSError *)error;

JS交互重点

GSWebView定义了两套协议GSWebViewDelegate和GSWebViewJavaScript,GSWebViewDelegate定义了加载状态,GSWebViewJavaScript则只定义了JS交互。
 
#prama mark - GSWebViewJavaScript
 /**
   交互协议
 */
@protocol GSWebViewJavaScript <NSObject>
@optional

/**
   调用OC方法
 	
     - (NSArray<NSString *>*)gswebViewRegisterObjCMethodNameForJavaScriptInteraction
     {
        return @[@"getCurrentUserId"];
     }
     //当JS调用一个'- (void)getCurrentUserName:(NSString *)name'的OC方法时,参数name由JS传来,
     //那么在实现该OC方法时,只需要正确知道参数类型或基本结构,你也可以写为id类型做普适,在方法内部做转换。
     - (void)getCurrentUserId:(NSString *)Id
     {
        NSLong@(@"JS调用到OC%@",Id);
     }
 */
- (NSArray<NSString *>*)gswebViewRegisterObjCMethodNameForJavaScriptInteraction;

服务端JavaScript源码必须的改动



  •  改动并非是为了增加复杂度,而是GSWebView内部的WKWebView必须通过Apple.Inc指定的方法  

> Adding a scriptMessageHandler adds a function window.webkit.messageHandlers.<name>.postMessage(<messageBody>) for all frames.

举例说明:
JS中有一个getConsultationInfo(id)方法,客户端获取到id实现该方法,这是UIWebView时代
但是在GSWebView中,必须这样:
```javascript
//获取客户端iOS版本



var version = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);  
version = parseInt(ver[1], 10);  

if(version >= 7.0 && version < 8.0){
	getConsultationInfo(id);
}else if(version>=8.0){
	window.webkit.messageHandlers.getConsultationInfo.postMessage(id)
}

提醒与注意事项

如果之前使用了UIWebView,如今使用GSWebView,在服务端对JS源码做出改动后,必须要考虑客户端老版本的兼容情况。当改动服务端的JS代码,势必导致老版本中的UIWebView交互失效。在下有个建议:
当GSWebView加载成功,我们调用服务端预先写好的方法 function shouldUseLatestWebView(isBool);
NSString * shouldUseLatestWebView;
if (IS_IOS_8) {
    shouldUseLatestWebView = [NSString stringWithFormat:@"shouldUseLatestWebView('%@')", @"1"];
}else{
    shouldUseLatestWebView = [NSString stringWithFormat:@"shouldUseLatestWebView('%@')", @"0"];
} 
[self.webview excuteJavaScript:jsGetCurrentUserId completionHandler:^(id  _Nonnull params, NSError * _Nonnull error) {
     if (error) {
   	 NSLog(@"注入JS方法shouldUseLatestWebView出错:%@",[error localizedDescription]);
    }
}];



服务端用一个全局变量保存isBool的值,当isBool为字符串1时,说明需要使用的是第二代WebView,服务端必须使用最新的交互方式代码,如果为字符串0或者空,则依旧使用原来的代码交互:
 
//一个全局的变量
var isBool = "";

function shouldUseLatestWebView(isBool){ 
	isBool = isBool;
}

if(isBool == "0" || isBool == ""){ 
	getConsultationInfo(id); 
}else if(isBool == "1"){ 
 	window.webkit.messageHandlers.getConsultationInfo.postMessage(id);
}



如此一来,就可以做到老版本的兼容。



 相关资料
  • 问题内容: 我目前使用Apache Axis。但是我正在Intellij IDEA中创建一个新项目,并且可以选择添加以下内容之一: 阿帕奇轴心 Glassfish / JAX-WS 2.x RI / Metro 1.x / JWSDP 2.0 宁静的Web服务 我之所以选择Axis,是因为它是我惯用的一种,但是我仍然想知道它是否是更简单的选择。 问题答案: 我会选择JAX-WS 2.x RI /

  • 本文向大家介绍10款最好的Web开发的 Python 框架,包括了10款最好的Web开发的 Python 框架的使用技巧和注意事项,需要的朋友参考一下   Python 是一门动态、面向对象语言。其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性。除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还自带服务器。其它方面,Python拥有足够多

  • 先进行通用配置, 【第十章】集成其它Web框架 之 10.1 概述 10.4 集成JSF 10.4.1 概述 JSF(JavaServer Faces)框架是Java EE标准之一,是一个基于组件及事件驱动的Web框架,JSF只是一个标准(规范),目前有很多厂家实现,如Oracle的默认标准实现Mojarra、Apache的MyFaces、Jboss的RichFaces 等。 本示例将使用Orac

  • 杭州,自研引擎,技术中台,非项目内引擎组。 技术一面(90min):10月9日 图形渲染基础、Cpp八股、场景题考察算法。一面基本全是基础,图形相关的会深挖,如:你刚刚提到xxx,能说说xxx么?然后大概问道你不太清楚为止。面试官感觉还是比较友好的。 技术二面(60min):10月12日 没开摄像头。主要是项目方面,三个相关项目挨个介绍,中途有稍微深入的询问。总体感觉深度不大。问了我对引擎开发更感

  • 先进行通用配置, 【第十章】集成其它Web框架 之 10.1 概述 10.3 集成Struts2.x 10.3.1 概述 Struts2前身是WebWork,核心并没有改变,其实就是把WebWork改名为struts2,与Struts1一点关系没有。 Struts2中通过ObjectFactory接口实现创建及获取Action实例,类似于Spring的IoC容器,所以Action实例可以由Obje

  • 先进行通用配置, 【第十章】集成其它Web框架 之 10.1 概述 10.2 集成Struts1.x 10.2.1 概述 Struts1.x是最早实现MVC(模型-视图-控制器)模式的Web框架之一,其使用非常广泛,虽然目前已经有Struts2.x等其他Web框架,但仍有很多公司使用Struts1.x框架。 集成Struts1.x也非常简单,除了通用配置外,有两种方式可以将Struts1.x集成到

  • 本文向大家介绍为什么Ember.js是最好的javascript框架?,包括了为什么Ember.js是最好的javascript框架?的使用技巧和注意事项,需要的朋友参考一下 ember成为javascript顶级Web开发框架之一的原因很多。其中一些原因是- 由于内置了模板解决方案,因此无需编写太多代码。 灰烬的固执己见的体系结构可避免在不重要的决策上浪费时间。 友好的API,使应用程序开发高效

  • 问题内容: 您是否知道可以在Go中创建交互式网页?例如,是否具有一个或多个按钮,或者一个组合框可以根据选择过滤正在刷新的数据的页面?我试图寻找它,但是没有找到任何相关的东西。 提前致谢。 问题答案: 浏览器无法直接运行Go代码。客户端的交互式网页使用不同的技术,例如HTML,Javascript和CSS。 但是,在客户端使用上述语言并在服务器端使用Go执行所有操作是可行的技术堆栈。 话虽这么说,仍