LoginSignup
3
1

More than 3 years have passed since last update.

【Swift・Objective-C】WKWebViewでJavaScriptからの通知を受ける

Posted at

JavaScriptによるNativeの操作

今回はWeb側からJavaScriptにより通知を受け、Nativeの操作をする方法をまとめていきます。

1: WKWebViewConfigurationをインスタンス化します

Swift

let webConfiguration = WKWebConfiguration()

Objective-C

WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];

2: WKUserContentControllerをインスタンス化します

Swift

let userController = WKUserContentController()

Objective-C

WKUserContentController *userController = [[WKUserContentController alloc] init];

3: userControllerにJavaScriptが叩くhandler(どのメソッドを叩いているか判断するもの)を登録します。

Swift

userController.add(self, name: "startMusic")
userController.add(self, name: "stopMusic")
userController.add(self, name: "installMusic")
userController.add(self, name: "randamMusic")

Objective-C

[userContentController addScriptMessageHandler:self name:@"startMusic"];
[userContentController addScriptMessageHandler:self name:@"stopMusic"];
[userContentController addScriptMessageHandler:self name:@"installMusic"];
[userContentController addScriptMessageHandler:self name:@"randamMusic"];

4: ViewControllerはデリゲート先としてWKUserContentControllerに渡され登録されているので、WKScriptMessageHandlerプロトコルに準拠させます。

Swift

extension ViewController: WKScriptMessageHandler {

Objective-C

@interface ViewController ()
<WKScriptMessageHandler>

5: configurationにuserControllerを登録します。

Swift

webConfiguration.userController = userController

Objective-C

webConfiguration.userController = userController;

6: webViewにconfigurationを登録します

Swift

let webView = WKWebView(frame: .zero, configuration: webConfiguration)

Objective-C

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

7: WKScriptMessageHandlerプロトコルの実装

JavaScript

window.webkit.messageHandlers.installMusic

Swift

import Foundation
import WebKit

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
        case "startMusic":
            print("startRecordingが呼ばれる")
        case "stopMusic":
            print("toggleMicInputが呼ばれる")
        case "installMusic":
            print("youtubeStartが呼ばれる")
        case "randamMusic":
            print("ランダム再生します。")
        default:
            print("default")
        }
    }

Objective-C

@interface ViewController ()
<WKScriptMessageHandler>

@property (nonatomic, strong) WKWebView *webView;

@end 

@implementation ViewController

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
    switch (message.name) {
        case @"startMusic":
            NSLog("startRecordingが呼ばれる")
        case @"stopMusic":
            NSLog("toggleMicInputが呼ばれる")
        case @"installMusic":
            NSLog("youtubeStartが呼ばれる")
        case @"randamMusic":
            NSLog("ランダム再生します。")
        default:
            NSLog("default")
    }
}

@end

参考

https://qiita.com/mss634/items/170d3cb401eee4ec1253
https://qiita.com/ShingoFukuyama/items/54d839038794dd592145
https://www.sirochro.com/note/swift-swiftyjson-parse/
https://rc-code.info/ios/post-194/

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1