• Stars
    star
    242
  • Rank 167,048 (Top 4 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 7 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

针对WKWebView进行的封装、支持和H5交互、通过属性获取cookie、H5图片预览、包括调用js方法,以及WKWebview图片预览、WKWebView图片浏览、预览、图片保存等功能,Base on the WKWebView,this lib support handle javaScript, web photo browse and on.

Demo中包含两个组件,SDWebView 和 PhotoBrowser。

   SDWebView组件 是针对WKWebView进行的深度封装、支持和H5交互、包括调用js方法等。挺全面的,有不当之处,请多指教,微信:xue-zhi-yin-you-ni。 PhotoBrowser组件 是早些时候我从耀源项目YYKit中抽离出来的图片浏览器,并做了类的重命名,防止和项目中继承YYKit的同学发生文件冲突,比我写的好用,就干脆移植过来,创建简单易用,可以复制demo中的代码。 demo是使用SDWebView加载的图片页面,然后使用PhotoBrowser组件进行图片预览,需要用到WKWebView中图片预览的这个demo就在合适不过了!

image

功能支持

   一.支持H5页面图片预览    二.支持H5调用OC  OC调用H5    三.更多!!!

//给webView添加监听title和进度条
[self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
[self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

//kvo监听进度条
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    if ([object isKindOfClass:[SDWebView class]]) {
        if ([keyPath isEqualToString:@"estimatedProgress"]) {
            CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
            if (newprogress == 1) {
                self.webView.progressView.hidden = YES;
                [self.webView.progressView setProgress:0 animated:NO];
            }else {
                self.webView.progressView.hidden = NO;
                [self.webView.progressView setProgress:newprogress animated:YES];
            }
        }
        if ([keyPath isEqualToString:@"title"]) {
            if (self.webView.title.length > 10) {
                self.navigationItem.title = [self.webView.title substringToIndex:14];
            } else {
                self.navigationItem.title = self.webView.title;
            }
        }
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}
//移除监听
[self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
[self.webView removeObserver:self forKeyPath:@"title"];


//js调OC时,需要让前端人员写如下js代码   
                              //👇 AppModel是我们所注入的对象   也就是SDWebView的jsHandlers
window.webkit.messageHandlers.AppModel.postMessage({body: response});

//对象可以注入多个,所以jsHandlers是个数组  如下代码:注入三个对象到页面中
self.webView.jsHandlers = @[TOLOGIN,TOPAY,TOYATI];

//如果注入了对象 要调用如下方法,注销handle 不然会creash
[self.webView removejsHandlers];


//OC调用js时,可以调用如下方法:
- (void)callJS:(nonnull NSString *)jsMethodName;

//可能使用的属性及方法如下:


/**
 需要加载的urlStr
 */
@property (nonatomic, copy) NSString *URLString;

/**
 web页面中的图片链接数组
 */
@property (nonatomic, strong) NSMutableArray *imgSrcArray;

/**
 进度条
 */
@property (strong, nonatomic) UIProgressView *progressView;

/**
 webView的标题、如果navigationItemTitle需要和webView保持一致、直接getter方法即可
 */
@property (nonatomic, copy) NSString *webViewtitle;

/**
 注入H5页面的交互模型
 */
@property (nonatomic, strong) NSArray<NSString *> *jsHandlers;

/**
 获取交互的参数代理
 */
@property (nonatomic, weak) id<SDWebViewDelegate> delegate;

/**
 根据URL初始化
 @param urlString URLString
 @return WebviewVc实例
 */
- (instancetype)initWithURLString:(NSString *)urlString;

/**
 *  加载本地HTML页面
 *
 *  @param htmlName html页面文件名称
 */
- (void)loadLocalHTMLWithFileName:(nonnull NSString *)htmlName;

/**
 移除jsHandler
 */
- (void)removejsHandlers;

/**
 清除所有cookie
 */
- (void)removeCookies;

/**
 清除指定域名中的cookie
 
 @param cookieName 域名
 */
- (void)removeCookieWithHostName:(NSString *)hostName;

/**
 *  调用JS方法(无返回值)
 *
 *  @param jsMethod JS方法名称
 */
- (void)callJS:(nonnull NSString *)jsMethodName;

/**
 *  调用JS方法(可处理返回值)
 *
 *  @param jsMethod JS方法名称
 *  @param handler  回调block
 */
- (void)callJavaScript:(nonnull NSString *)jsMethodName handler:(nullable void(^)(__nullable id response))handler;

//如果前端人员不知道OC调用js 的方法怎么写 可参考如下代码 ↓
function configer() {
    reture {'c':"100"}
}
在callJS方法中直接让前端人员返回一个json 或者 其他返回值 OC即可在handler这个blcok 中获取 这个返回值
Support Cocopods: pod 'SDWebView'

特别说明

SDWebView中注入的js只对部分H5页面有效,如果当前的H5页面中的图片是在iframe中引用的另外一个URL中的图片,那么SDWebView是不支持的,请自行参考交互代码和前端人员指定交互方式,特此说明。

More Repositories

1

SDDemo

1.TableViewCell图文混排,图片大小自适应,限制最大宽度,使用indexPath缓存行高。支持tableViewcell编辑插入、收藏、点赞、置顶、删除功能。2.增加iOS补位动画
Objective-C
16
star
2

SDTableViewHeaderAnimation

Most tableViewHeader animation has been include in this demo, you can use it inherit the HeaderAnimationTableView. demo中包含了大部分经常用到的tableViewHeader的动画效果,包括:tableViewHeader下拉跟随、放大、折叠效果等。另外,结合另一个个人项目SDLayoutDemo,可以让更好的理解TableView.
Swift
16
star
3

SDRouter

SDRouter use for decoupling.use simple code bridge native to native or H5 to native by AppSchema with parameter, like this "asone://oneController?url=http://www.baidu.com" SDRouter 可以用来在模块与模块间的解耦及通信,也可以作为H5和原生的交互、跳转、传参。SDRouter的设计是参照[一水流年](http://dzpqzb.com) 的想法来实现的,总体和他的想法保持一致。
Objective-C
11
star
4

SDFPS

a iOS tool use to examine fps.一行代码的fps.
Objective-C
4
star
5

SDLabel

How to implementation a label? like UILabel that subclass UIView. SDLabel is a way to get it.当开始思考怎么实现一个系统控件,如UILabel一样,继承自UIView。我开始尝试很多方法,SDLabel是其中一种思路,当然我并没有完 全实现UIlabel的所有功能。 SDLabel并不是一个完整的功能齐全的控件,但可以提供一种解决方案。该Label在股大咖项目中得到了应用,在整个UITableView的性能优 化中,起到了比较重要的作用,使60fps成为常态。
Objective-C
4
star
6

SDTextFiledAnimation

TextFiled动画,支持纯代码创建的TextFiled,点击登陆框,动画
Objective-C
3
star
7

SDPickerView

选关、设置计划、日期等自定义的pickerView、字体、描边字体。
Objective-C
3
star
8

iOSPush

使用Nodejs调试iOS的APNS通知推送,如此简单。Use Node.js language test iOS apns pusn.
JavaScript
3
star
9

SDLottery

Use a different plist to load the same controller
Objective-C
2
star
10

MMDrawerControllerDemo

MMDrawerController侧滑demo
Objective-C
1
star
11

SDGuard

This tool is design for Objective-C, a category for NSObject to guard dealloc method, add block, when system call the dealloc, call this block first.通过分类的形式给OC对象添加一个block,在对象销毁执行dealloc方法时,执行这个block。具有较小的侵入性
Objective-C
1
star