[iOS] WKWebView로 웹뷰 만들기
WKWebView
- 앱과 상호 작용이 가능한 웹 컨텐츠를 보여줄 수 있도록하는 객체
- HTML, CSS, JavaScript와 같은 컨텐츠를 앱의 네이티브 뷰와 함께 보여줄 수 있도록 제공한다.
- 웹 기술이 네이티브 뷰보다 앱의 레이아웃 및 스타일 요구사항을 더 쉽게 충족할 수 있을 때 사용한다.
- 앱의 콘텐츠가 자주 바뀔 때 사용할 수 있다.
- 단순 일회성 또는 주기적으로 바뀌는 뷰, 이벤트 팝업 등이 예시가 될 수 있을 것 같다.
- URL을 정적으로 작성 되어 있는 것이 아닌 API 호출로 URL을 입력할 수 있다면 웹 뷰가 변경 될 때마다 앱을 배포하지 않아도 될 것 같다. (웹뷰 안 써봐서 모름...)
WKWebView 이전에는 iOS 2.0부터 사용 가능한 UIWebView를 사용하였지만 iOS 8.0부터는 WKWebView를 사용한다.
https://developer.apple.com/documentation/webkit/wkwebview에 작성된 코드이다.
class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string:"https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
}
스와이프 하여 뒤로가기 기능은 기본적으로 지원하지 않아 웹 내에서 뒤로가기 기능이 구현되어 있지 않다면 아래 코드와 같이 사용할 수 있다.
private lazy var webView: WKWebView = {
let webConfiguration = WKWebViewConfiguration()
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.allowsBackForwardNavigationGestures = true // 추가, 스와이프로 뒤로가기 허용
return webView
}()
뒤로가기 스와이프... UINavigationController과 동시에 사용하면 어떻게 될까?
두 개의 제스처가 동시에 요청을 받고 있어서 둘 중 하나만 동작하거나 둘 다 인식 못 할 것 같다는 생각이 들었다.
자세히 기억은 안 나지만 과거 두 개의 제스처를 기다리는 상황에서 모두 동작하지 않았던 버그를 마주친 경험이 있었다...
호기심에 해 봤다.
먼저 웹 뷰 초기화면에서 뒤로가기 스와이프를 시도한 상황이다.
UINavigationController의 스와이프로 인식하여 페이지가 이동한다.
다음은 웹 뷰에서 페이지를 이동시킨 다음 뒤로가기 스와이프를 시도한 상황이다.
웹 뷰의 페이지가 뒤로가기 된 후 웹 뷰 초기화면까지 복귀했을 때 Navigation의 스와이프가 동작한다.
웹 뷰의 Navigation Stack이 존재할 경우에 웹 뷰의 스와이프가 동작하고 존재하지 않을 때 Navigation이 동작하는 것 같다.
WKWebView VS SFSafariViewController
간단히 웹 페이지를 보여주기 용도로만 사용할 경우에는 SFSafariViewController를 사용하는게 더 좋은 것 같다.
페이지 이동 버튼(앞, 뒤), 확장 프로그램, 보안, 읽기 전용 주소 필드, 완료 버튼 등 Safari에서 기본으로 제공하는 기능이 많이 때문이다.
WKWebView는 웹과 앱이 상호작용이 가능하다는 강력한 기능이 있지만 SFSafariViewController에 기본적으로 제공되는 모든 기능을 직접 구현해야 한다는 점이 있기 때문에 큰 차이점을 갖는다.
https://developer.apple.com/documentation/webkit/wkwebview
WKWebView | Apple Developer Documentation
An object that displays interactive web content, such as for an in-app browser.
developer.apple.com