콘텐츠로 이동

[iOS] Swift로 WebView 구현하는 방법

웹 페이지 표시

iOS 앱에서 웹페이지를 보여주려면 몇 가지 방법이 있다.

iOS 웹 표시 방법

  1. WebView를 사용해서 앱 내부에서 표시
  2. 앱이 Safari를 호출해서 해당 URL을 열기
  3. SFSafariViewController로 앱 안에서 SafariView로 열기

각각 장단점이 있기에 사용할 용도에 따라 선택해서 쓰면 되겠다.
이번에는 WebView를 사용하려고 한다.

WebView

우선 웹뷰를 사용하기 위해 ViewController를 하나 생성하였다.
그리고 UIWebView를 사용하려고 했더니 이런..
애플 개발자 사이트에 알아보니 Deprecated라고 한다.
그래서 찾아보니 iOS 8부터 사용 가능한 WKWebView를 쓰면 될 것 같다.

Webkit View

Storyboard에서 WebView를 추가했더니 바로 에러가 났다.

WKWebView before iOS 11.0 (NSCoding support was broken in previous versions)

그렇다. 나는 Deployment Target을 8.0으로 작업하고 있기에 안되는 것이었다.
혹시 모를 호환성 때문에 낮은 버전 기준으로 개발을 하고 있는데 이것때문에 겪은 불편이 한두가지가 아니다.

그래서 코드로 직접 만들어 넣었다.

import WebKit

class WebViewController: UIViewController, WKNavigationDelegate,
    WKUIDelegate {

    var webView: WKWebView!

    override func loadView() {
        super.loadView()
        webView = WKWebView(frame: self.view.frame)
        self.view = self.webView!
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let sURL = "주소"
        let uURL = URL(string: sURL)
        var request = URLRequest(url: uURL!)
        webView.load(request)
    }
}

해당 주소로 접속해서 웹 페이지가 잘 나온다.

POST Method

웹뷰에 POST 방식으로 파라미터를 전달하고 싶어졌다.
다음 코드를 위의 webView.load(request) 앞에 추가하면 될 것 같았다.
파라미터는 a=1&b=2 이런 String으로 해도 되고 Dictionary 타입으로 지정하고 나서 형변환해도 된다.
이번 테스트는 문자열로 했다.

request.httpMethod = "POST"
let postString = "파라미터"
request.httpBody = postString.data(using: .utf8)

에러는 나지 않았지만 뭔가 이상했다.
웹 서버에서 확인해 보니 앱에서 아무런 파라미터도 날리지 않았다.
또 열심히 찾아보니 WKWebkit에서 POST 요청 시 HTTP Body를 씹는 버그가 있다고 한다.

여러가지 방법이 있었는데 가장 쉽고 간단한 방법을 선택했다.
보아하니 content-type 설정이 누락되어 안된다는 것 같았다.

request.setValue("application/x-www-form-urlencoded",
    forHTTPHeaderField: "Content-Type")

요걸 추가하면 될 것 같았다.

결론

override func viewDidLoad() {
    super.viewDidLoad()
    let sURL = "주소"
    let uURL = URL(string: sURL)
    var request = URLRequest(url: uURL!)
    request.setValue("application/x-www-form-urlencoded",
        forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let postString = "파라미터"
    request.httpBody = postString.data(using: .utf8)
    webView.load(request)
}

코드는 요렇게 되겠다.
테스트 결과 성공했다.

끝.


마지막 업데이트: 2022-05-13

댓글