WKWebViewでJavaScriptを読み込み前後に仕込むサンプル

  • 36
    Like
  • 0
    Comment
More than 1 year has passed since last update.

WKWebViewをinit時にJavaScriptを設置します。設置したJavaScriptはページ読み込みのたびに実行されます。

window.webkit.messageHandlers.yourKeyPath.postMessage("文字列/配列など");
上記のJavaScriptを使うと、userContentController:didReceiveScriptMessage:が応答するので、yourKeyPath部分をもとに処理できます。

サンプルとして新規作成、"Single View Application"テンプレートからViewController.mに以下を貼り付けると試せます。

結果としてデバッグエリアにUserAgentが表示されるはずです。

#import "ViewController.h"
#import <WebKit/WebKit.h>

@interface ViewController ()
<WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler>

@property (nonatomic, strong) WKWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // JavaScript
    // didGetUserAgentの部分は後で使用する(任意のキャメルケース)
    NSString *getUserAgent
    = @"window.webkit.messageHandlers.didGetUserAgent.postMessage(window.navigator.userAgent);";

    // JavaScript挿入タイミング: ページの読み込み前かあとか
    // injectionTime: WKUserScriptInjectionTimeAtDocumentStart / WKUserScriptInjectionTimeAtDocumentEnd
    WKUserScript *getUserAgentScript
    = [[WKUserScript alloc] initWithSource:getUserAgent
                             injectionTime:WKUserScriptInjectionTimeAtDocumentStart
                          forMainFrameOnly:YES];

    WKUserContentController *userContentController = [[WKUserContentController alloc] init];
    [userContentController addUserScript:getUserAgentScript];
    [userContentController addScriptMessageHandler:self name:@"didGetUserAgent"];

    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = userContentController;

    _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
    _webView.UIDelegate = self;
    _webView.navigationDelegate = self;
    [self.view addSubview:_webView];

    NSString *urlString = @"http://www.yahoo.co.jp/";
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [_webView loadRequest:request];

}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    id body = message.body;
    NSString *keyPath = message.name;

    if ([body isKindOfClass:[NSString class]]) {
        if ([keyPath isEqualToString:@"didGetUserAgent"]) {
            NSLog(@"UserAgent: %@", body);
        }
    }
}


@end

こちらも設定しておくといいと思います。
WKWebViewでwindow.webkit.messageHandlersが効かないサイトへの対処法