UIWebView的实际成员变量都由UIWebViewInternal保存,UIWebViewInternal的声明如下:
- @interface UIWebViewInternal : NSObject
- {
- UIScrollView *scroller;
- UIWebBrowserView *browserView;
- UICheckeredPatternView *checkeredPatternView;
- id <UIWebViewDelegate> delegate;
- unsigned int scalesPageToFit:1;
- unsigned int isLoading:1;
- unsigned int hasOverriddenOrientationChangeEventHandling:1;
- unsigned int drawsCheckeredPattern:1;
- unsigned int webSelectionEnabled:1;
- unsigned int drawInWebThread:1;
- unsigned int inRotation:1;
- NSURLRequest *request;
- int clickedAlertButtonIndex;
- UIWebViewWebViewDelegate *webViewDelegate;
- UIWebPDFViewHandler *pdfHandler;
- }
- @end
UIWebViewWebViewDelegate的声明为:(代码很长,点此跳过)
- @interface UIWebViewWebViewDelegate : NSObject
- {
- UIWebView *uiWebView;
- }
- - (void)_clearUIWebView;
- - (void)webView:(id)arg1 didChangeLocationWithinPageForFrame:(id)arg2;
- - (BOOL)webView:(id)arg1 resource:(id)arg2 canAuthenticateAgainstProtectionSpace:(id)arg3 forDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didCancelAuthenticationChallenge:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didReceiveAuthenticationChallenge:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didFailLoadingWithError:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didFinishLoadingFromDataSource:(id)arg3;
- - (id)webView:(id)arg1 identifierForInitialRequest:(id)arg2 fromDataSource:(id)arg3;
- - (void)webView:(id)arg1 decidePolicyForGeolocationRequestFromOrigin:(id)arg2 frame:(id)arg3 listener:(id)arg4;
- - (id)webView:(id)arg1 runJavaScriptTextInputPanelWithPrompt:(id)arg2 defaultText:(id)arg3 initiatedByFrame:(id)arg4;
- - (BOOL)webView:(id)arg1 runJavaScriptConfirmPanelWithMessage:(id)arg2 initiatedByFrame:(id)arg3;
- - (void)webView:(id)arg1 runJavaScriptAlertPanelWithMessage:(id)arg2 initiatedByFrame:(id)arg3;
- - (void)webViewClose:(id)arg1;
- - (void)webView:(id)arg1 didFirstLayoutInFrame:(id)arg2;
- - (void)webView:(id)arg1 didFailLoadWithError:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didFinishLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 decidePolicyForMIMEType:(id)arg2 request:(id)arg3 frame:(id)arg4 decisionListener:(id)arg5;
- - (void)webView:(id)arg1 didFailProvisionalLoadWithError:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didReceiveServerRedirectForProvisionalLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 didClearWindowObject:(id)arg2 forFrame:(id)arg3;
- - (id)webView:(id)arg1 resource:(id)arg2 willSendRequest:(id)arg3 redirectResponse:(id)arg4 fromDataSource:(id)arg5;
- - (id)webView:(id)arg1 connectionPropertiesForResource:(id)arg2 dataSource:(id)arg3;
- - (void)webViewSupportedOrientationsUpdated:(id)arg1;
- - (void)webView:(id)arg1 didReceiveTitle:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didCommitLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 didStartProvisionalLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 printFrameView:(id)arg2;
- - (void)webView:(id)arg1 exceededApplicationCacheOriginQuotaForSecurityOrigin:(id)arg2 totalSpaceNeeded:(unsigned int)arg3;
- - (void)webView:(id)arg1 frame:(id)arg2 exceededDatabaseQuotaForSecurityOrigin:(id)arg3 database:(id)arg4;
- - (void)webView:(id)arg1 unableToImplementPolicyWithError:(id)arg2 frame:(id)arg3;
- - (void)webView:(id)arg1 decidePolicyForNavigationAction:(id)arg2 request:(id)arg3 frame:(id)arg4 decisionListener:(id)arg5;
- - (void)webView:(id)arg1 decidePolicyForNewWindowAction:(id)arg2 request:(id)arg3 newFrameName:(id)arg4 decisionListener:(id)arg5;
- - (id)webView:(id)arg1 createWebViewWithRequest:(id)arg2;
- - (id)initWithUIWebView:(id)arg1;
- @end
它负责接收很多来自WebView的通知,并转发给UIWebView。如第一节概貌中提到,它实现了多个WebView的delegate。
UIWebView的non-public declaration为: (代码很长,点此跳过)
- @interface UIWebView : UIView <NSCoding, UIScrollViewDelegate>
- {
- UIWebViewInternal *_internal;
- }
- + (void)_updatePersistentStoragePaths;
- + (void)_fixPathsForSandboxDirectoryChange;
- + (id)_relativePathFromAbsolutePath:(id)arg1 removingPathComponents:(unsigned int)arg2;
- - (void)_addShortcut:(id)arg1;
- - (void)_define:(id)arg1;
- - (void)selectAll:(id)arg1;
- - (void)select:(id)arg1;
- - (void)copy:(id)arg1;
- - (BOOL)canPerformAction:(SEL)arg1 withSender:(id)arg2;
- - (void)configureWithSettings:(id)arg1;
- - (unsigned int)_audioSessionCategoryOverride;
- - (void)_setAudioSessionCategoryOverride:(unsigned int)arg1;
- - (BOOL)_alwaysDispatchesScrollEvents;
- - (void)_setAlwaysDispatchesScrollEvents:(BOOL)arg1;
- - (unsigned int)_pageCount;
- - (void)_setGapBetweenPages:(float)arg1;
- - (float)_gapBetweenPages;
- - (void)_setPageLength:(float)arg1;
- - (float)_pageLength;
- - (void)_setPaginationBehavesLikeColumns:(BOOL)arg1;
- - (BOOL)_paginationBehavesLikeColumns;
- - (void)_setPaginationMode:(int)arg1;
- - (int)_paginationMode;
- - (void)_setDrawInWebThread:(BOOL)arg1;
- - (void)_setWebSelectionEnabled:(BOOL)arg1;
- - (void)_setDrawsCheckeredPattern:(BOOL)arg1;
- - (void)_setOverridesOrientationChangeEventHandling:(BOOL)arg1;
- - (id)_pdfViewHandler;
- - (id)_scrollView;
- - (id)_documentView;
- - (id)_browserView;
- - (id)_initWithWebView:(id)arg1;
- - (struct CGImage *)newSnapshotWithRect:(struct CGRect)arg1;
- - (struct CGImage *)createSnapshotWithRect:(struct CGRect)arg1;
- - (void)webView:(id)arg1 didChangeLocationWithinPageForFrame:(id)arg2;
- - (BOOL)webView:(id)arg1 resource:(id)arg2 canAuthenticateAgainstProtectionSpace:(id)arg3 forDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didCancelAuthenticationChallenge:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didReceiveAuthenticationChallenge:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didFailLoadingWithError:(id)arg3 fromDataSource:(id)arg4;
- - (void)webView:(id)arg1 resource:(id)arg2 didFinishLoadingFromDataSource:(id)arg3;
- - (id)webView:(id)arg1 identifierForInitialRequest:(id)arg2 fromDataSource:(id)arg3;
- - (void)webView:(id)arg1 decidePolicyForGeolocationRequestFromOrigin:(id)arg2 frame:(id)arg3 listener:(id)arg4;
- - (id)webView:(id)arg1 runJavaScriptTextInputPanelWithPrompt:(id)arg2 defaultText:(id)arg3 initiatedByFrame:(id)arg4;
- - (BOOL)webView:(id)arg1 runJavaScriptConfirmPanelWithMessage:(id)arg2 initiatedByFrame:(id)arg3;
- - (void)webView:(id)arg1 runJavaScriptAlertPanelWithMessage:(id)arg2 initiatedByFrame:(id)arg3;
- - (id)_makeAlertView;
- - (void)webViewClose:(id)arg1;
- - (void)alertView:(id)arg1 didDismissWithButtonIndex:(int)arg2;
- - (void)webView:(id)arg1 didFirstLayoutInFrame:(id)arg2;
- - (void)webView:(id)arg1 didFailLoadWithError:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didFinishLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 didFailProvisionalLoadWithError:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didReceiveServerRedirectForProvisionalLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 didClearWindowObject:(id)arg2 forFrame:(id)arg3;
- - (id)webView:(id)arg1 resource:(id)arg2 willSendRequest:(id)arg3 redirectResponse:(id)arg4 fromDataSource:(id)arg5;
- - (id)webView:(id)arg1 connectionPropertiesForResource:(id)arg2 dataSource:(id)arg3;
- - (void)webView:(id)arg1 didReceiveTitle:(id)arg2 forFrame:(id)arg3;
- - (void)webView:(id)arg1 didCommitLoadForFrame:(id)arg2;
- - (void)webView:(id)arg1 didStartProvisionalLoadForFrame:(id)arg2;
- - (void)_updateRequest;
- - (void)webViewSupportedOrientationsUpdated:(id)arg1;
- - (void)webView:(id)arg1 printFrameView:(id)arg2;
- - (void)webView:(id)arg1 exceededApplicationCacheOriginQuotaForSecurityOrigin:(id)arg2 totalSpaceNeeded:(unsigned int)arg3;
- - (void)webView:(id)arg1 frame:(id)arg2 exceededDatabaseQuotaForSecurityOrigin:(id)arg3 database:(id)arg4;
- - (void)webView:(id)arg1 unableToImplementPolicyWithError:(id)arg2 frame:(id)arg3;
- - (void)webView:(id)arg1 decidePolicyForMIMEType:(id)arg2 request:(id)arg3 frame:(id)arg4 decisionListener:(id)arg5;
- - (void)webView:(id)arg1 decidePolicyForNavigationAction:(id)arg2 request:(id)arg3 frame:(id)arg4 decisionListener:(id)arg5;
- - (void)webView:(id)arg1 decidePolicyForNewWindowAction:(id)arg2 request:(id)arg3 newFrameName:(id)arg4 decisionListener:(id)arg5;
- - (void)_reportError:(id)arg1;
- - (void)scrollViewWasRemoved:(id)arg1;
- - (void)scrollViewDidScrollToTop:(id)arg1;
- - (void)scrollViewDidEndDecelerating:(id)arg1;
- - (void)scrollViewDidEndDragging:(id)arg1 willDecelerate:(BOOL)arg2;
- - (void)_didCompleteScrolling;
- - (void)scrollViewWillBeginDragging:(id)arg1;
- - (void)scrollViewDidEndZooming:(id)arg1 withView:(id)arg2 atScale:(float)arg3;
- - (void)scrollViewDidZoom:(id)arg1;
- - (void)scrollViewWillBeginZooming:(id)arg1 withView:(id)arg2;
- - (id)viewForZoomingInScrollView:(id)arg1;
- - (void)restoreStateFromHistoryItem:(id)arg1 forWebView:(id)arg2;
- - (void)saveStateToHistoryItem:(id)arg1 forWebView:(id)arg2;
- - (void)webViewMainFrameDidFailLoad:(id)arg1 withError:(id)arg2;
- - (void)webViewMainFrameDidFinishLoad:(id)arg1;
- - (void)webViewMainFrameDidCommitLoad:(id)arg1;
- - (void)webViewMainFrameDidFirstVisuallyNonEmptyLayoutInFrame:(id)arg1;
- - (void)_updateScrollerViewForInputView:(id)arg1;
- - (void)view:(id)arg1 didSetFrame:(struct CGRect)arg2 oldFrame:(struct CGRect)arg3;
- - (BOOL)_appliesExclusiveTouchToSubviewTree;
- - (void)setBackgroundColor:(id)arg1;
- - (void)setOpaque:(BOOL)arg1;
- - (void)_updateOpaqueAndBackgroundColor;
- - (void)setBounds:(struct CGRect)arg1;
- - (void)setFrame:(struct CGRect)arg1;
- - (void)_frameOrBoundsChanged;
- - (void)_rescaleDocument;
- - (void)_finishRotation;
- - (void)_beginRotation;
- - (struct CGSize)sizeThatFits:(struct CGSize)arg1;
- - (void)_updateCheckeredPattern;
- @property(nonatomic) BOOL suppressesIncrementalRendering;
- @property(readonly, nonatomic, getter=canGoForward) BOOL canGoForward;
- @property(readonly, nonatomic, getter=canGoBack) BOOL canGoBack;
- - (void)goForward;
- - (void)goBack;
- - (void)stopLoading;
- - (void)reload;
- @property(readonly, nonatomic) NSURLRequest *request;
- - (void)loadData:(id)arg1 MIMEType:(id)arg2 textEncodingName:(id)arg3 baseURL:(id)arg4;
- - (void)loadHTMLString:(id)arg1 baseURL:(id)arg2;
- - (void)loadRequest:(id)arg1;
- @property(readonly, nonatomic) UIScrollView *scrollView;
- @property(nonatomic) id <UIWebViewDelegate> delegate;
- @property(readonly, nonatomic, getter=isLoading) BOOL loading;
- @property(nonatomic) BOOL scalesPageToFit;
- @property(nonatomic) BOOL mediaPlaybackAllowsAirPlay;
- @property(nonatomic) BOOL mediaPlaybackRequiresUserAction;
- @property(nonatomic) BOOL allowsInlineMediaPlayback;
- @property(nonatomic) unsigned int dataDetectorTypes;
- @property(nonatomic) BOOL detectsPhoneNumbers;
- - (id)stringByEvaluatingJavaScriptFromString:(id)arg1;
- - (void)dealloc;
- - (void)encodeWithCoder:(id)arg1;
- - (void)_populateArchivedSubviews:(id)arg1;
- - (id)initWithCoder:(id)arg1;
- - (id)initWithFrame:(struct CGRect)arg1;
- - (id)_initWithFrame:(struct CGRect)arg1 enableReachability:(BOOL)arg2;
- - (void)_webViewCommonInitWithWebView:(id)arg1 scalesPageToFit:(BOOL)arg2 shouldEnableReachability:(BOOL)arg3;
- - (void)_updateViewSettings;
- - (void)_setRichTextReaderViewportSettings;
- - (void)_setScalesPageToFitViewportSettings;
- - (void)_didRotate:(id)arg1;
- @property(nonatomic) BOOL keyboardDisplayRequiresUserAction;
- - (void)decodeRestorableStateWithCoder:(id)arg1;
- - (void)encodeRestorableStateWithCoder:(id)arg1;
- - (BOOL)isElementAccessibilityExposedToInterfaceBuilder;
- - (Class)_printFormatterClass;
- @end
从函数名看其主要作用,只列non-public API:
- 选择/全选/复制网页内容
- 维护设置项
- 设置是否在WebThread渲染页面
- 设置是否允许选择网页内容
- 提供截图的接口(newSnapshotWithRect)
- 在UIWebDocumentView传过来的回调通知中做进一步处理
- 展示alertView,包括由js alert发起的对话框
- 响应UIScrollViewDelegate的回调,传递消息给UIWebBrowserView
- 处理旋转屏幕的逻辑
- 序列化/反序列化
有一些API虽然名字看懂了,但没办法猜出意义,后面做反编译研究时再详细说吧。这个系列都是浅探。