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
/*
 * WVWebViewProtocol.h
 *
 * Created by WindVane.
 * Copyright (c) 2017年 阿里巴巴-淘宝技术部. All rights reserved.
 */
 
#import "WVNavigation.h"
#import "WVWebViewBasicProtocol.h"
#import <Foundation/Foundation.h>
 
@class WVPageMeta;
@protocol WVWebViewDelegate;
 
// WebView 的 viewport-fit 设置。
typedef NS_ENUM(NSInteger, WVWebViewViewportFit) {
    WVWebViewViewportFitAuto,    // 自动设置 Viewport。
    WVWebViewViewportFitContain, // 保证 Viewport 完整可见。
    WVWebViewViewportFitCover,   // 覆盖到物理屏幕的矩形之上。
};
 
// WebView 可见性。
typedef NS_ENUM(NSInteger, WVWebViewVisiblity) {
    WVWebViewVisiblilityUnknown = 0, // 可见性未知。
    WVWebViewInvisible = 1,          // 不可见。
    WVWebViewVisible = 2,            // 可见。
};
 
/**
 包含了 WindVane WebView 功能的协议。
 */
@protocol WVWebViewProtocol <NSObject, WVWebViewBasicProtocol>
 
@required
 
#pragma mark - Configuration
 
/**
 挂载的归属源 UIViewController。
 */
@property (nonatomic, weak, nullable) UIViewController * sourceViewController;
 
/**
 [仅限 DEBUG 包]JavaScript 日志的级别,默认为 WVLogLevelOff。
 请在 WebView 初始化时就设置好,后期再修改不一定能生效。
 */
@property (nonatomic, assign) WVLogLevel JSLogLevel;
 
/**
 WebView 在所属 ViewController 中的可见性。
 */
@property (nonatomic, assign) WVWebViewVisiblity visibleInViewController;
 
/**
 WebView 的内容是否允许拖拽超过边缘再回弹,默认为 YES。
 需要禁止拖拽效果时,请使用本属性,不要对 ScrollView 的 bounces 属性进行设置。
 与 forbiddenPullScroll 属性作用相同,但值恰好相反。
 */
@property (nonatomic, assign) BOOL bounces;
 
/**
 是否启用下拉刷新,默认为 NO。
 启用下拉刷新之后,才允许自定义下拉刷新的视图样式。
 */
@property (nonatomic, assign, getter=isUsePullToRefresh) BOOL usePullToRefresh;
 
/**
 是否使用自定义的下拉刷新组件(仅支持 SVPullToRefresh 开源库),默认为 NO,会使用 WVPullToRefresh 和 WVInfiniteScrolling。
 请在使用任何下拉刷新或上拉加载前设置,并且不要在中途修改,否则会发生错误。
 */
@property (nonatomic, assign, getter=isUseCustomPullToRefresh) BOOL useCustomPullToRefresh;
 
/**
 WebView 的业务代码。
 */
@property (nonatomic, strong, nullable) NSString * bizCode;
 
/**
 是否响应点击 status bar 自动滚动到顶端。
 */
@property (nonatomic, assign) BOOL scrollsToTop;
 
/**
 是否允许 WebKit 长按事件(选择、弹出菜单),默认为 YES。
 */
@property (nonatomic, assign, getter=isOpenWebKitLongPress) BOOL openWebKitLongPress;
 
/**
 是否开启长按保存图片,默认为 YES
 */
@property (nonatomic, assign, getter=isOpenLongPressSaveImage) BOOL openLongPressSaveImage;
 
/**
 是否允许内联播放媒体,默认为 YES。
 
 @discussion 对于 WKWebView,必须在 initWithFrame:configuration: 的 configuration 中设置 allowsInlineMediaPlayback,初始化之后再设置可能无法生效。
 */
@property (nonatomic, assign) BOOL allowsInlineMediaPlayback;
 
/**
 媒体是否需要用户交互才能自动播放,默认为 NO。
 
 @discussion 对于 WKWebView,必须在 initWithFrame:configuration: 的 configuration 中设置 mediaPlaybackRequiresUserAction,初始化之后再设置可能无法生效。
 */
@property (nonatomic, assign) BOOL mediaPlaybackRequiresUserAction;
 
/**
 是否允许 Air Play,默认为 YES。
 */
@property (nonatomic, assign) BOOL mediaPlaybackAllowsAirPlay;
 
/**
 是否要求用户操作后才能弹出键盘,默认为 YES。
 */
@property (nonatomic, assign) BOOL keyboardDisplayRequiresUserAction;
 
#pragma mark - Request
 
/**
 当前加载的请求,是主页面的请求,而非 iframe。
 WKWebView 中只提供了 URL 属性,因此请优先使用 URL 属性,并总是以 URL 属性为准,request 有时可能并不完全准确(例如服务端 302 时)。
 */
@property (nonatomic, readonly, copy, nullable) NSURLRequest * request;
 
/**
 估计的加载进度。
 
 @discussion 该属性支持 KVO。
 */
@property (nonatomic, assign, readonly) double estimatedProgress;
 
#pragma mark - Content
 
/**
 当前 WebView 加载页面的 title。
 
 @discussion 该属性支持 KVO。
 */
@property (nonatomic, copy, readonly, nullable) NSString * title;
 
/**
 当前导航信息,仅在 WVWebViewDelegate 的回调中生效。
 */
@property (nonatomic, strong, readonly, nullable) WVNavigation * navigation;
 
/**
 WebView 的可见性,会由 ViewController 的可见性和 WebView 在 ViewController 中的可见性综合计算得到。
 
 @discussion 该属性支持 KVO。
 */
@property (nonatomic, assign, readonly) WVWebViewVisiblity visiblity;
 
/**
 WebView 的主页面内容类型,会忽略 iframe 内容的类型。
 */
@property (nonatomic, assign, readonly) WVURLContentType contentType;
 
/**
 WebView 当前页面内容是否为空,该属性并不会实时反应页面的白屏状况,实时信息请使用 [WebView isPageEmpty:] 方法。
 */
@property (nonatomic, assign, getter=isPageEmpty, readonly) BOOL pageEmpty;
 
/**
 检查 WebView 的页面是否为空。
 
 @param callback 检查结果的回调。
 */
- (void)isPageEmpty:(void (^_Nonnull)(BOOL isPageEmpty))callback;
 
/**
 当前页面的元数据。
 */
@property (nonatomic, strong, readonly, nonnull) WVPageMeta * pageMeta;
 
/**
 当前页面的 viewport-fit 设置。
 */
@property (nonatomic, assign, readonly) WVWebViewViewportFit viewportFit;
 
#pragma mark - Delegate
 
/**
 当前 WebView 的委托。
 */
@property (nonatomic, weak, nullable) id<WVWebViewDelegate> windVaneDelegate;
 
#pragma mark - Life cycle
 
/**
 [注意:必须在 ViewController 的 viewWillDisappear 中调用!!!] 释放 WebView 的服务。
 */
- (void)releaseWebViewService;
 
/**
 [注意:必须在 ViewController 的 viewWillAppear 中调用!!!] 重新绑定 WebView 的服务。
 */
- (void)bindingWebViewService;
 
@end