Seoplee
개발의 섭리, Seoplee의 개발
Seoplee
  • 분류 전체보기 (54)
    • Android (26)
      • Architecture (12)
      • Compose (0)
      • Tips (11)
      • 트러블슈팅 (3)
    • IOS (1)
      • Tips (1)
    • Kotlin (1)
    • Coroutine (3)
      • Flow (3)
    • RxJava (12)
    • CI&CD (1)
    • WEB (8)
    • Network (1)
    • ETC (1)
    • (임시) (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Seoplee

개발의 섭리, Seoplee의 개발

IOS/Tips

웹뷰 (WKWebview)에서 Javascript로 데이터 전송하기

2022. 12. 7. 15:50

안드로이드는 JavascriptInterface를 사용하면 쉽게 native -> javascript로 데이터 전송이 가능한 반면,

IOS는 조금 더 설정해주어야 할 부분들이 있어서 정리하였다.

 

let configuration = WKWebViewConfiguration()
let contentController = WKUserContentController()
configuration.userContentController = contentController

//웹뷰 인스턴스 생성
let webview = WKWebView(frame: .zero, configuration: configuration)

웹뷰 인스턴스를 생성할 때, configuration을 먼저 설정해주어야 한다. 이때 반드시 WKUserContentController 객체를 먼저 생성하고 설정해주어야 late하게 userContentController를 할당해 줄 수 있다.

webview 객체를 먼저 생성하고 추후에 configuration에 controller를 할당하면 제대로 할당되지 않는다!

let wmHandler = WKController(webview)
contentController.add(wmHandler, name: "getDeviceToken")
        
webview.configuration.userContentController = contentController

class WKController: NSObject ,WKScriptMessageHandler {
        var webview: WKWebView
        
        init(_ webview: WKWebView) {
            self.webview = webview
        }

        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            if message.name == "getDeviceToken" {
                let fcmToken = String(UserDefaults.standard.string(forKey: "deviceToken") ?? "")
                print("fcmToken :", fcmToken)
                let myJsFuncName = "mergeAppUserInfo('\(fcmToken)')"
                webview.evaluateJavaScript(myJsFuncName)
            }
        }
    }

WKScriptMessageHandler에서 이전에 생성한 webview 인스턴스를 사용하여 evaluateJavaScript 함수를 호출한다.

위 코드는 Javascript의 'mergeAppUserInfo(arg)'를  호출한다.

 

이때 "getDivceToken"은 javascript에서 해당 native 코드를 호출하는 이름이 된다.

 

<script
    dangerouslySetInnerHTML={{
        __html: `
        function mergeAppUserInfo(token){
            localStorage.setItem("deviceToken", token);
            return token;
         };`,
    }}
    async
></script>

Next.js를 사용중이기 때문에 _document단에 위와같이 전역으로 함수를 작성하였다.

// native에서 js코드를 호출하여 localStorage에 deviceToken을 저장한다.
window.webkit.messageHandlers.getDeviceToken.postMessage();

messageHanlder를 이용하여 native에 작성해두었던 'getDiviceToken'이라는 이름으로 해당 함수를 호출할 수 있다.

 

 

저작자표시 (새창열림)
    Seoplee
    Seoplee
    개발공부를 하며 기록할만한 것들을 정리해놓은 블로그입니다.

    티스토리툴바