0%

TWebKit

很久之前写的一个很简单的库,最近整理了一下发到github了

特点

兼容Objective-Cswift

TWebView

  • 支持自动根据系统版本选择使用UIWebView还是WKWebView加载网页
  • 使用方法简单,与UIWebView的使用方法极其类似,简化WKWebView的使用
  • 双代理模式,支持使用通用的代理commonDelegate(通用代理的类建议使用singleton单例模式),也支持同时设置普通的代理delegate

    默认情况下普通代理delegate里实现的方法会优先于通用代理commonDelegate里实现的同名方法;

    在普通代理delegate中实现某个方法的情况下不会去调用通用代理commonDelegate中的同名方法。(如果需要可以在普通代理delegate的该方法中使用[webView.commonDelegate someFunc..]主动调用通用代理commonDelegate的该方法)

  • 支持显示ProgressViewUIWebView的Progress使用了NJKWebViewProgress中的部分代码进行模拟进度,支持配置ProgressView的颜色
  • 支持配置是否允许滑动返回(canScrollBack)
  • 支持配置是否可以放大缩小网页(canScrollChangeSize)
  • 支持配置是否屏蔽长按链接显示ActionSheet和MenuController(blockTouchCallout)
  • 支持配置是否屏蔽链接的3DTouch预览(block3DTouch)

TWebViewController

  • TWebViewController返回键为后退网页,后退到首个网页则popViewController
  • TWebViewController点击返回键后退网页则会出现关闭controller的按钮
  • TWebViewController在Debug包中包含清空缓存和输入网址按钮(自动保存最后一次手动输入的网址),在Release包中自动屏蔽。

TWebViewDelegate

  • 全是@optional的代理方法,更容易使用

导入项目

源文件

如果你的项目支持iOS 7以及之前版本,请下载Source目录中的所有文件和TWebKit.bundle,之后将他们放入你的项目中,无须其他配置即可使用。

如果你的项目仅支持iOS 8+,建议使用CocoaPods或者Carthage方式。

CocoaPods

CocoaPods是一个Cocoa项目管理器。你可以使用以下命令去安装CocoaPods:

1
$ gem install cocoapods

要使用CocoaPods将TWebKit集成到您的Xcode项目中,请在Podfile中加入:

1
2
3
4
5
6
7
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '6.0'
use_frameworks!

target '<Your Target Name>' do
pod 'TWebKit'
end

然后运行一下命令:

1
$ pod install

Carthage

Carthage是一个去中心化的依赖管理器,它构建并提供所使用的库的framework。

你可以使用 Homebrew并运行下面的命令安装Carthage

1
2
$ brew update
$ brew install carthage

要将TWebKit集成到使用Carthage的Xcode项目中,请在Cartfile中加入:

1
github "tobedefined/TWebKit"

运行carthage update构建framework,并将编译的TWebKit.framework拖入Xcode项目中。

使用方法

  • swift

在swift的<Your Target Name>-Bridging-Header.h中加入

1
#import <TWebKit/TWebKit.h>
  • Objective-C
1
#import <TWebKit/TWebKit.h>

你可以在demo中看具体的使用方法,下面是具体的介绍

TWebView

大部分参数和方法与UIWebView的参数相同,使用方式也相同,下面介绍一些不同的参数和方法。

property
  • delegate:id <TWebViewDelegate>,代理,遵守TWebViewDelegate协议的任何对象,若设置,则其实现的方法优先级高于commonDelegate中的方法
  • commonDelegate:id <TWebViewDelegate>,通用代理,遵守TWebViewDelegate协议的任何对象,建议使用singleton的对象作为通用代理
  • contentWebView: UIView,如果 < iOS 8.0,返回 TWebView 中的 UIWebView;如果 ≥ iOS 8.0,返回 TWebView 中的 WKWebView
  • uiWebView: UIWebView,如果 < iOS 8.0,返回 TWebView 中的 UIWebView;如果 ≥ iOS 8.0,返回 nil
  • wkWebView: WKWebView,如果 < iOS 8.0,返回 nil;如果 ≥ iOS 8.0,返回 TWebView 中的 WKWebView
  • scrollView: UIScrollView,网页的 scrollViewreadonly ,返回UIWebView 或者 WKWebViewscrollView
  • showProgress:BOOLgetter=isShowProgress,是否显示进度条
  • progressTintColor:UIColor,进度条颜色
  • progressViewHeight: CGFloat, 设置进度条的高度
  • canSelectContent:BOOL,设置是否可以长按选择网页中的内容
  • canScrollChangeSize:BOOL,是否可以拖动改变网页大小
  • blockTouchCallout:BOOL,是否屏蔽长按链接出现actionSheet和menuController
  • canScrollBack:BOOL,iOS8+支持,是否可以滑动返回上一个网页
  • block3DTouch:BOOL,iOS9+支持,是否屏蔽3DTouch预览链接
  • confirmText:NSString,网页弹出框的确定按钮文字
  • cancelText:NSString,网页弹出框的取消按钮文字
  • loadingDefaultTitle:NSString,网页加载中默认返回的title文字
  • successDefaultTitle:NSString,网页加载成功默认返回的title文字
  • failedDefaultTitle:NSString,网页加载失败默认返回的title文字
function
  • - (instancetype)init

    创建一个默认的TWebViewConfig对象,并调用- (instancetype)initWithConfig:(TWebViewConfig *)config

  • - (instancetype)initWithConfig:(TWebViewConfig *)config

    使用config中的参数,进行初始化创建TWebView

  • - (void)clearCache

    清空cache和cookie

  • - (void)resetCookieForceOverride:(BOOL)forceOverride

    取出NSHTTPCookieStorage中的cookies设置TWebView的cookie,forceOverride参数控制是否强制使用NSHTTPCookieStorage中的cookie值重设TWebView之前存在的同名的cookie

  • - (void)getDocumentTitle:(void (^)(NSString * _Nullable))completion

    取出网页的title放入block completion,使用JavaScript获得网页HTML中的document.title

  • + (nullable NSString *)getJavascriptStringWithFunctionName:(NSString *)function data:(id)data

    类方法提供拼接JavaScript函数功能,function参数为要访问的JavaScript的方法名(不需要添加括号),data参数可以为JSON Object或者为普通的NSString,会自动进行转换拼接;返回拼接后的函数调用字符串。

  • - (void)runJavascript:(NSString *)js completion:(void (^__nullable)(id obj, NSError *error))completion

    运行JavaScript函数,与网页进行交互,js参数为运行的JavaScript代码,completion参数为回调。

TWebViewConfig

为了将配置参数更加清晰,所以添加了这个类,参数与TWebView的各个配置参数对应,你可以使用TWebViewConfig创建配置,然后使用配置来创建TWebView;也可以直接创建TWebView,然后对创建的对象进行参数赋值。

TWebViewConfig参数 -> TWebView参数
webViewCommonDelegate -> commonDelegate
webViewDelegate -> delegate
forceOverrideCookie -> forceOverrideCookie
showProgressView -> showProgress
progressTintColor -> progressTintColor
progressViewHeight -> progressViewHeight
canSelectContent -> canSelectContent
canScrollChangeSize -> canScrollChangeSize
blockTouchCallout -> blockTouchCallout
canScrollBack -> canScrollBack
block3DTouch -> block3DTouch
confirmText -> confirmText
cancelText -> cancelText
loadingDefaultTitle -> loadingDefaultTitle
successDefaultTitle -> successDefaultTitle
failedDefaultTitle -> failedDefaultTitle

TWebViewDelegate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
typedef NS_ENUM(NSUInteger, TWebViewLoadStatus) {
TWebViewLoadStatusIsLoading = 1,
TWebViewLoadStatusSuccess = 2,
TWebViewLoadStatusFailed = 3,
};

@protocol TWebViewDelegate <NSObject>

@optional

// 是否可以加载网页
- (BOOL)webView:(TWebView *)webView shouldStartLoadRequest:(NSURLRequest *)request;

// 开始加载网页
- (void)webView:(TWebView *)webView didStartLoadRequest:(NSURLRequest *)request;

// 加载网页成功
- (void)webView:(TWebView *)webView didFinishLoadRequest:(NSURLRequest *)request;

// 加载网页失败
- (void)webView:(TWebView *)webView didFailedLoadRequest:(NSURLRequest *)request withError:(NSError *)error;

// 当前状态:status,当前默认使用的title,
// 可以选择使用根据状态判断设定ViewController的title。或者可以将title字段设为ViewController的title。
// TWebViewLoadStatusIsLoading => 返回TWebView的loadingDefaultTitle
// TWebViewLoadStatusSuccess => 获取网页的title,如果不为空返回;为空返回TWebView的successDefaultTitle
// TWebViewLoadStatusFailed => 返回TWebView的failedDefaultTitle
- (void)webView:(TWebView *)webView loadStatus:(TWebViewLoadStatus)status title:(NSString *)title;

#pragma mark - 3D Touch Peek & Pop; iOS 10+ available
// 设置是否允许url进行预览;
// 如果返回NO,下面的两个方法将不会执行
// 如果返回YES,下面的两个方法将会在用户用力按压时候执行
- (BOOL)webView:(TWebView *)webView shouldPreviewURL:(nullable NSURL *)url API_AVAILABLE(ios(10.0));

// 如果返回NO, 将会在Safari中预览链接
// 如果你不想预览这个url, 请在 "- webView:shouldPreviewURL:" 方法中返回NO
// 参数 "actions" 是iOS默认支持的actions
- (nullable UIViewController *)webView:(TWebView *)webView previewingViewControllerForURL:(nullable NSURL *)url defaultActions:(NSArray<id <WKPreviewActionItem>> *)actions API_AVAILABLE(ios(10.0));

// 打开预览的ViewController
- (void)webView:(TWebView *)webView commitPreviewingURL:(nullable NSURL *)url controller:(UIViewController *)controller API_AVAILABLE(ios(10.0));

@end

TWebViewController

是否显示清除缓存和输入网址的按钮为自动控制(Debug显示,Release不显示),无需配置

property
  • webView:TWebViewTWebViewController中的TWebView对象,你可以修改一些属性符合你的配置要求。
  • navTitle:NSString,默认的navTitle,如果设置,则覆盖- (void)webView:(TWebView *)webView loadStatus:(TWebViewLoadStatus)status title:(NSString *)title回调,始终显示navTitle
  • backImage:UIImage,默认使用TWebKit.bundle中的back.png,可以自定义设置返回按钮。
function
  • - (instancetype)initWithConfig:(TWebViewConfig *)config

    根据TWebViewConfig配置来创建TWebViewController

  • - (void)loadURLFromString:(NSString *)urlString

    加载网址urlString

  • - (void)loadURLAndAutoConversionFromString:(NSString *)urlString

    加载网址urlString,会对urlString进行转码判断等操作,具体详见NSString *trueURLString(NSString *urlString)

  • - (void)resetWebViewCookieForceOverride:(BOOL)forceOverride

    调用TWebView- (void)resetCookieForceOverride:(BOOL)forceOverride方法,重设cookie