Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- swiftUI
- swift documentation
- 리팩토링
- uiscrollview
- RxCocoa
- UITextView
- HIG
- Human interface guide
- combine
- ribs
- Observable
- 리펙토링
- MVVM
- ios
- Refactoring
- collectionview
- clean architecture
- rxswift
- 클린 코드
- 스위프트
- Xcode
- SWIFT
- map
- Clean Code
- Protocol
- 애니메이션
- tableView
- UICollectionView
- 리펙터링
- uitableview
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Javascript Interface (웹뷰와 자바스트립트 연동, WKWebView, WKScriptMessageHandler) 본문
iOS 기본 (swift)
[iOS - swift] Javascript Interface (웹뷰와 자바스트립트 연동, WKWebView, WKScriptMessageHandler)
jake-kim 2021. 4. 4. 14:39Javascript의 인터렉션 -> iOS에서 받는 방법
- javacript에서 특정 이벤트가 발생한 경우 메세지를 iOS에 넘기는 방식
- iOS에서 메세지를 파싱하여, 해당 메세지에 관한 이벤트 처리를 하는 방식(뒤로가기, statusBar색상 변경)
- iOS에서 WKScriptMessageHandler 델리게이트를 구현하여 이벤트를 받는 형태
javasript interface 정의
시그니처 | javascript |
statusBar 색상 변경: changeStatusBarColor | webkit.messageHandlers.MyJavacriptInterfaces.postMessage([ action: 'changeStatusBarColor', bgColor: '#FFFFFF' isDarkIcon: true ]) |
뒤로가기 버튼 누른 경우: goBack | webkit.messageHandlers.MyJavascriptInterfaces.postMessages([ action: 'goBack', ]) |
사용 방법
- 델리게이트 할당
let messageHandlerName = "MyJavascriptInterfaces"
func setUpWebView(with config: KWebViewConfiguration) {
let contentController = WKUserContentController()
contentController.add(self, name: messageHandlerName) // delegate와 name설정
config.userContentController = contentController
webView = WKWebView(frame: .zero, configuration: config)
}
- 델리게이트 구현
enum WebAction: String {
case changeStatusBarColor
case goBack
}
extension BaseWebViewController: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == messageHandlerName {
if let dics: [String: Any] = message.body as? Dictionary, let action = dics["action"] as? String {
let webAction = WebAction(rawValue: action)
switch webAction {
case .changeStatusBarColor:
if let color = dics["bgColor"] as? String, let isDarkIcon = dics["isDarkIcon"] as? Bool {
self.statusBarView?.backgroundColor = UIColor(hexString: color)
if isDarkIcon == true {
statusBarStyle = .default
} else {
statusBarStyle = .lightContent
}
setNeedsStatusBarAppearanceUpdate()
}
case .goBack:
self.popVC()
default:
print("Undefined action: \(String(describing: webAction))")
}
}
}
}
}
'iOS 기본 (swift)' 카테고리의 다른 글
Comments