登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

GSWebView是集成了UIWebView和WKWebView最好用的网页JS交互框架之一

[复制链接]
来自: xoeshinekonggu 分类: iOS精品源码 上传时间: 2016-10-28 15:33:45
Tag:webview 网页 网络 版本兼容 UIWebView

项目介绍:


1.为何要从UIWebView更新到WKWebView?

性能测试:
UIWebViewWKWebView备注
iOS 版本8.48.4———
iPhone66真机测试
测试网页天猫首页天猫首页———
内存占用峰值132.2MB8.4MB———
加载耗时3.1s2.6smach_absolute_time();
FPS无明显差异无明显差异Instruments (core animation)
测试次数22———

单<font size=4>内存占用</font>这一点考虑,使用WKWebView便是明智的选择。


2.如UIWebView一样使用WKWebView,用熟悉的API开发

  • GSWebView被设计成UIWebView相同的样式,意在降低开发者的使用难度。

  • 引入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;

形神皆似的协议方法

#prama mark - GSWebViewDelegate
- (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;
    • *

3.服务端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中,必须这样:

//获取客户端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)
} 

4.提醒与注意事项

如果之前使用了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);
} 

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

本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可。

    • *

code4app

相关源码推荐:

我来说两句
*滑动验证:
所有评论(80)
kengsir 2016-10-28 15:42:16
code4app好的内容真的很多~赞
回复
AlonMessi 2016-10-28 15:42:45
code4app好的代码demo真的很多,谢谢啦~
回复
littleRed 2016-10-28 15:42:48
mark,收藏了
回复
phoiu 2016-10-28 15:43:07
学习...学习...
回复
hellokenken 2016-10-28 15:44:03
虽不明,但觉厉...
回复
BlueManlove 2016-10-28 15:44:48
code4app好的代码demo真的很多,谢谢啦~
回复
王颖博 2016-10-28 17:45:55
感谢分享,Code4App有你更精彩
回复
3300 2016-10-29 08:44:34
感谢分享,Code4App有你更精彩:)
回复
passer-by-1 2016-10-29 16:44:55
楼主用心了,内容非常精彩。
回复
提取码:  下载次数:152 状态:已购或VIP 售价:0(原价:10)金钱 下载权限:初级码农 
2901 1 152
联系我们
首页/微信公众账号投稿

帖子代码编辑/版权问题

QQ:435399051,742864542

如何获得代码达人称号?

代码贡献英雄榜
用户名 下载数
通过邮件订阅最新 Code4App 信息
上一条 /4 下一条
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表