developer
2023-05-20 e12c7b4c22df631ebdcd16b2f98fbef8f738f92f
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
//
//  WVViewControllerProtocol.h
//  Basic
//
//  Created by lianyu.ysj on 2018/1/25.
//  Copyright © 2018年 WindVane. All rights reserved.
//
 
#import <WindVaneCore/WVWKWebView.h>
#import <WindVaneCore/WVWebViewProtocol.h>
#import <Foundation/Foundation.h>
 
typedef NS_ENUM(NSInteger, WVUseWKWebView) {
    WVUseWKWebViewNever,  // 从不使用 WKWebView
    WVUseWKWebViewAlways, // 总是使用 WKWebView
    WVUseWKWebViewCustom  // 由 decideIsUseWKWebView 方法的结果决定是否使用 WKWebView
};
 
/**
 WindVane ViewController 协议。
 */
@protocol WVViewControllerProtocol <NSObject>
 
@required
 
/**
 是否使用 WKWebView,默认为 WVUseWKWebViewNever。
 */
@property (nonatomic, assign, getter=isUseWKWebView) WVUseWKWebView useWKWebView;
 
#pragma mark - WebView
 
/**
 当前 ViewController 包含的 WebView,不存在时会自动创建。
 */
@property (nonatomic, strong, readonly, nonnull) UIView<WVWebViewProtocol> * webView;
 
/**
 当前 ViewController 包含的 WebView,不存在时会返回 nil,而不是自动创建。
 */
@property (nonatomic, strong, readonly, nullable) UIView<WVWebViewProtocol> * internalWebView;
 
/**
 WebView 的 UIScrollView 对象。
 */
@property (nonatomic, weak, readonly, nullable) UIScrollView * webViewScrollView;
 
/**
 WebView 的内容是否允许拖拽超过边缘再回弹,默认为 YES。
 需要禁止拖拽效果时,请使用本属性,不要对 ScrollView 的 bounces 属性进行设置。
 与 forbiddenPullScroll 属性作用相同,但值恰好相反。
 */
@property (nonatomic, assign) BOOL bounces;
 
#pragma mark - WebView Content
 
/**
 WebView 是否正在加载内容。
 */
@property (nonatomic, assign, readonly, getter=isWebViewLoading) BOOL webViewLoading;
 
/**
 WebView 当前加载的请求,是主页面的请求,而非 iframe。
 */
@property (nonatomic, copy, readonly, nullable) NSURLRequest * webViewRequest;
 
/**
 WebView 当前加载的 URL,是主页面的 URL,而非 iframe。
 */
@property (nonatomic, copy, readonly, nullable) NSURL * webViewURL;
 
/**
 是否允许 WebKit 长按事件(选择、弹出菜单),默认为 NO。
 */
@property (nonatomic, assign, getter=isOpenWebKitLongPress) BOOL openWebKitLongPress;
 
/**
 是否开启长按保存图片,默认为 YES
 */
@property (nonatomic, assign, getter=isOpenLongPressSaveImage) BOOL openLongPressSaveImage;
 
/**
 是否允许内联播放媒体,默认为 YES。
 
 @discussion 对于 WKWebView,WebView 初始化之后再设置可能无法生效。
 */
@property (nonatomic, assign) BOOL allowsInlineMediaPlayback;
 
/**
 媒体是否需要用户交互才能自动播放,默认为 NO。
 
 @discussion 对于 WKWebView,WebView 初始化之后再设置可能无法生效。
 */
@property (nonatomic, assign) BOOL mediaPlaybackRequiresUserAction;
 
/**
 获取 WebView 是否可以回退。
 */
@property (nonatomic, assign, readonly) BOOL webViewCanGoBack;
 
/**
 获取 WebView 是否可以前进。
 */
@property (nonatomic, assign, readonly) BOOL webViewCanGoForward;
 
#pragma mark - WVWebViewDelegate
 
/**
 在加载指定页面之前执行的行为。
 会在 webView:shouldStartLoadWithRequest:navigationType: 方法中调用,根据子类具体实现的不同,可能不会调用此 Block。
 */
@property (nonatomic, copy, nullable) BOOL (^shouldStartLoadAction)(UIView<WVWebViewProtocol> * _Nonnull, NSURLRequest * _Nonnull, WKNavigationType);
 
/**
 在开始加载新页面前执行的行为。
 会在 webViewDidStartLoad: 方法中调用,根据子类具体实现的不同,可能不会调用此 Block。
 */
@property (nonatomic, copy, nullable) void (^didStartLoadAction)(UIView<WVWebViewProtocol> * _Nonnull);
 
/**
 在页面加载完毕后执行的行为。
 会在 webViewDidStartLoad: 方法中调用,根据子类具体实现的不同,可能不会调用此 Block。
 */
@property (nonatomic, copy, nullable) void (^didFinishLoadAction)(UIView<WVWebViewProtocol> * _Nonnull);
 
/**
 在页面加载失败时执行的行为。
 会在 webView:didFailLoadWithError: 方法中调用,根据子类具体实现的不同,可能不会调用此 Block。
 */
@property (nonatomic, copy, nullable) void (^didFailLoadAction)(UIView<WVWebViewProtocol> * _Nonnull, NSError * _Nonnull);
 
/**
 在接收到 JS 的 console 日志或错误信息时的行为。
 会在 webView:didReceiveJSLog:level: 方法中调用,根据子类具体实现的不同,可能不会调用此 Block。
 需要 WebView 主动开启 JSLog 级别,才能接收 console 日志。
 */
@property (nonatomic, copy, nullable) void (^didReceiveJSLogAction)(UIView<WVWebViewProtocol> * _Nonnull, NSString * _Nonnull, WVLogLevel);
 
/**
 WKWebView 的独立进程崩溃时的行为。
 */
@property (nonatomic, copy, nullable) void (^webContentProcessDidTerminateAction)(WVWKWebView * _Nonnull);
 
#pragma mark - LoadPage
 
/**
 加载指定的请求
 
 @param request 要加载的请求。
 */
- (void)loadPageByRequest:(NSURLRequest * _Nonnull)request;
 
/**
 加载指定的 URL。
 
 @param url 要加载的 URL。
 */
- (void)loadPageByUrl:(NSString * _Nonnull)url;
 
/**
 使用 POST 请求加载指定的 URL。
 
 @param url      要加载的 URL。
 @param postBody POST 请求内容。
 */
- (void)loadPageByUrl:(NSString * _Nonnull)url postBody:(NSString * _Nullable)postBody;
 
/**
 在 isUseWKWebView 为 WVUseWKWebViewCustom 时,决定是否使用 WKWebView。
 */
- (BOOL)decideIsUseWKWebView;
 
/**
 WebView 回退历史记录。
 */
- (void)webViewGoBack;
 
/**
 WebView 前进历史记录。
 */
- (void)webViewGoForward;
 
/**
 WebView 停止加载。
 */
- (void)webViewStopLoading;
 
/**
 WebView 刷新页面。
 */
- (void)webViewReload;
 
/**
 表示当前 ViewController 将要从指定来源唤起,会在下一次发送 WV.Event.APP.Active 事件时附上相关信息。
 
 @param activeFrom 唤起的来源。
 @param data       唤起时传递的数据。
 */
- (void)h5ActiveFrom:(NSString * _Nullable)activeFrom withData:(id _Nullable)data;
 
#pragma mark - 下拉刷新 & 上拉加载
 
/**
 是否启用下拉刷新,默认为 YES。
 启用下拉刷新之后,才允许自定义下拉刷新的视图样式。
 
 @discussion
 由于 iOS7 支持透明导航栏,需要在 viewDidLayoutSubviews 中配置下拉刷新,才可以正确处理 UIScrollView 的 contentInset。
 因此对于透明导航栏,下拉刷新会延迟到 viewDidLayoutSubviews 中初始化。
 对于不透明导航,下拉刷新仍然会在 loadView 中初始化。
 为了统一这一点,我们额外提供了 configPullToRefreshStyle 方法,供子方法重写下拉刷新的样式配置。
 */
@property (nonatomic, assign, getter=isUsePullToRefresh) BOOL usePullToRefresh;
 
/**
 是否启用上拉加载,默认为 YES。
 启用上拉加载之后,才允许自定义上拉加载的视图样式。
 */
@property (nonatomic, assign, getter=isUseInfiniteScrolling) BOOL useInfiniteScrolling;
 
/**
 是否使用自定义的下拉刷新组件(仅支持 SVPullToRefresh 开源库),默认为 NO,会使用 WVPullToRefresh 和 WVInfiniteScrolling。
 请在使用任何下拉刷新或上拉加载前设置,并且不要在中途修改,否则会发生错误。
 */
@property (nonatomic, assign, getter=isUseCustomPullToRefresh) BOOL useCustomPullToRefresh;
 
@end