项目作者: xlsd

项目描述 :
针对WKWebView进行的封装、支持和H5交互、通过属性获取cookie、H5图片预览、包括调用js方法,以及WKWebview图片预览、WKWebView图片浏览、预览、图片保存等功能,Base on the WKWebView,this lib support handle javaScript, web photo browse and on.
高级语言: Objective-C
项目地址: git://github.com/xlsd/SDWebView.git
创建时间: 2017-02-25T09:38:35Z
项目社区:https://github.com/xlsd/SDWebView

开源协议:MIT License

下载


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

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

image

功能支持

  1. 一.支持H5页面图片预览
  2. 二.支持H5调用OC OC调用H5
  3. 三.更多!!!
  1. //给webView添加监听title和进度条
  2. [self.webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
  3. [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
  4. //kvo监听进度条
  5. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
  6. if ([object isKindOfClass:[SDWebView class]]) {
  7. if ([keyPath isEqualToString:@"estimatedProgress"]) {
  8. CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue];
  9. if (newprogress == 1) {
  10. self.webView.progressView.hidden = YES;
  11. [self.webView.progressView setProgress:0 animated:NO];
  12. }else {
  13. self.webView.progressView.hidden = NO;
  14. [self.webView.progressView setProgress:newprogress animated:YES];
  15. }
  16. }
  17. if ([keyPath isEqualToString:@"title"]) {
  18. if (self.webView.title.length > 10) {
  19. self.navigationItem.title = [self.webView.title substringToIndex:14];
  20. } else {
  21. self.navigationItem.title = self.webView.title;
  22. }
  23. }
  24. } else {
  25. [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
  26. }
  27. }
  28. //移除监听
  29. [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
  30. [self.webView removeObserver:self forKeyPath:@"title"];
  31. //js调OC时,需要让前端人员写如下js代码
  32. //👇 AppModel是我们所注入的对象 也就是SDWebView的jsHandlers
  33. window.webkit.messageHandlers.AppModel.postMessage({body: response});
  34. //对象可以注入多个,所以jsHandlers是个数组 如下代码:注入三个对象到页面中
  35. self.webView.jsHandlers = @[TOLOGIN,TOPAY,TOYATI];
  36. //如果注入了对象 要调用如下方法,注销handle 不然会creash
  37. [self.webView removejsHandlers];
  38. //OC调用js时,可以调用如下方法:
  39. - (void)callJS:(nonnull NSString *)jsMethodName;
  40. //可能使用的属性及方法如下:
  41. /**
  42. 需要加载的urlStr
  43. */
  44. @property (nonatomic, copy) NSString *URLString;
  45. /**
  46. web页面中的图片链接数组
  47. */
  48. @property (nonatomic, strong) NSMutableArray *imgSrcArray;
  49. /**
  50. 进度条
  51. */
  52. @property (strong, nonatomic) UIProgressView *progressView;
  53. /**
  54. webView的标题、如果navigationItemTitle需要和webView保持一致、直接getter方法即可
  55. */
  56. @property (nonatomic, copy) NSString *webViewtitle;
  57. /**
  58. 注入H5页面的交互模型
  59. */
  60. @property (nonatomic, strong) NSArray<NSString *> *jsHandlers;
  61. /**
  62. 获取交互的参数代理
  63. */
  64. @property (nonatomic, weak) id<SDWebViewDelegate> delegate;
  65. /**
  66. 根据URL初始化
  67. @param urlString URLString
  68. @return WebviewVc实例
  69. */
  70. - (instancetype)initWithURLString:(NSString *)urlString;
  71. /**
  72. * 加载本地HTML页面
  73. *
  74. * @param htmlName html页面文件名称
  75. */
  76. - (void)loadLocalHTMLWithFileName:(nonnull NSString *)htmlName;
  77. /**
  78. 移除jsHandler
  79. */
  80. - (void)removejsHandlers;
  81. /**
  82. 清除所有cookie
  83. */
  84. - (void)removeCookies;
  85. /**
  86. 清除指定域名中的cookie
  87. @param cookieName 域名
  88. */
  89. - (void)removeCookieWithHostName:(NSString *)hostName;
  90. /**
  91. * 调用JS方法(无返回值)
  92. *
  93. * @param jsMethod JS方法名称
  94. */
  95. - (void)callJS:(nonnull NSString *)jsMethodName;
  96. /**
  97. * 调用JS方法(可处理返回值)
  98. *
  99. * @param jsMethod JS方法名称
  100. * @param handler 回调block
  101. */
  102. - (void)callJavaScript:(nonnull NSString *)jsMethodName handler:(nullable void(^)(__nullable id response))handler;
  103. //如果前端人员不知道OC调用js 的方法怎么写 可参考如下代码 ↓
  104. function configer() {
  105. reture {'c':"100"}
  106. }
  107. callJS方法中直接让前端人员返回一个json 或者 其他返回值 OC即可在handler这个blcok 中获取 这个返回值
  1. Support Cocopods: pod 'SDWebView'

特别说明

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