Posted at

WKWebView Objective-C版サンプル

More than 1 year has passed since last update.

まとまった記事が意外となかったので。


宣言


MyWebView.h

#import <UIKit/UIKit.h>

#import <WebKit/WebKit.h>

@interface MyWebView : UIView <WKNavigationDelegate, WKUIDelegate>
@property (strong) WKWebView *webView;
@end


初期化


MyWebView.m

_webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];

_webView.navigationDelegate = self;
_webView.UIDelegate = self;
[self addSubview:_webView];


ロード


MyWebView.m

[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];



進む、戻る、リロード


MyWebView.m

[_webView canGoBack];

[_webView canGoForward];
[_webView reload];
[_webView goForward];
[_webView goBack];


デリゲート


shouldStartLoadWithRequest


MyWebView.m

- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;



didStartLoad


MyWebView.m

- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;



didFinishLoad


MyWebView.m

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;



didFailWithError


MyWebView.m

- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error;



Basic認証

UIAlertControllerWrapperはUIAlertControllerをラップしたクラスです。

こちらを参考に作りました。


MyWebView.m

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(nonnull NSURLAuthenticationChallenge *)challenge completionHandler:(nonnull void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic] == YES){
NSLog(@"didReceiveAuthenticationChallenge");

[UIAlertControllerWrapper showAlertViewWithIdAndPassword:@"Authentication" message:@"Input username and password." ok:^(UIAlertAction *action, UIAlertController *cntr){
NSURLCredential *credential = [NSURLCredential credentialWithUser:[cntr.textFields objectAtIndex:0].text password:[cntr.textFields objectAtIndex:1].text persistence:NSURLCredentialPersistenceForSession];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);

}cancel:^(UIAlertAction *cancel){
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}];
}else{
completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, nil);
}
}



Javascript実行


MyWebView.m

[webView evaluateJavaScript:@"document.title"

completionHandler:^(NSString *result, NSError *error){
}];