Study/cs

[iOS/Swift] WKWebView (+ SFSafariViewController)

written by yunwon 2021. 11. 22. 17:07

 

 

Q. 지난 PHP 글에 이어서 iOS 글을 쓰는 이유 ?

A. 알 수 없다.

 

아직 맥북도 XCode 도 낯설지만 웹뷰에 대해서

며칠간 너무 열심히 조사했기 때문에 잊지 않기 위해 정리하고자 한다.

 

이번 게시글에서는 앱에서 웹 페이지를 여는 세가지 방법에 대해 알아보자!

 

(1) 사파리 앱을 열어줌

(2) WKWebView 로 열어줌

(3) SFSafariViewController 로 열어줌

 

 

 


 

 

1. Safari 앱

아이폰에 설치된 Safari 를 열어서 웹 페이지를 로딩하는 방법이다.

 

별도의 설정이 필요 없어 간편하지만, 커스텀이 전혀 불가능하고 Safari 로부터

어떠한 이벤트를 받아온다던가 앱 사이의 상호작용은 불가능하다는 단점이 있다.

@IBAction func openSafariApp(_ sender: Any) {
    guard let appleUrl = URL(string: "https://www.apple.com")   else { return }
    guard UIApplication.shared.canOpenURL(appleUrl)             else { return }

    UIApplication.shared.open(appleUrl, options: [:], completionHandler: nil)
}

// guard 조건 else { 조건이 false인 경우 수행되는 구문 }

 

 


 

2. WKWebView

보통 WebView 에서 커스텀이 필요한 경우나 Web 과의 상호작용이 필요한 경우에 사용한다.

(*WebKit 프레임워크에 속해있는 객체들은 WK 가 앞에 붙는다)

 

Web 과의 여러 상호작용이 가능한데,

WKUserController 를 사용해 웹으로부터 메시지를 전달받을 수도 있고

웹으로 자바 스크립트 코드를 앱에서 전달할 수도 있다.

 

또한 WKUIDelegate 를 활용해서 앱에서 WebView 가 Alert 메시지를 호출할 때, 앱에서 처리도 가능하다.

WKNavigationDelegate 를 활용해서는 웹뷰가 호출되는 시점들을 알 수 있다.

로딩을 완료했을 때, 로딩을 시작했을 때 등의 처리가 가능하다.

import WebKit

var webView: WKWebView!

func loadWeb() {
    self.webView.uiDelegate = self
    self.webView.navigationDelegate = self

    guard let url = URL(string: "https://apple.com") else { return }
    let request = URLRequest(url: url)
    
    self.webView.load(request)
}

extension ViewController: WKUIDelegate {}
extension ViewController: WKNavigationDelegate {}

 

위와 같이 설정하면 WebView 에서 호출하는 것들을 Delegate 로 선언해서 받아 이벤트 핸들링이 가능하다.

이렇게 앱 안에서 웹 사이트를 호출하는 동작이 가능해지는데,

웹과 앱 사이의 상호작용을 가능하게 해주는 메소드들이 많고 이를 활용해서 핸들링하기 쉽다는 점이 있다.

 

장점이 많은 WKWebView 이지만, 아래와 같은 이슈들이 존재한다.

  • iOS 9 이상 디바이스에서만 실행 가능
  • 로컬로 저장된 파일에 대한 AJAX 요청을 지원하지 않음
  • 쿠키 허용 설정을 지원하지 않음
  • 고급 캐시 설정 (Advanced Cache Settings) 을 지원하지 않음
  • 앱 종료시 HTML5 로컬 스토리지가 지워짐

 

+ WKWebView Delegate Method

WKWebView 는 델리게이트 메서드 패턴을 통해 웹페이지 로딩 상황을 추적하거나

사용자의 액션을 제어할 수 있도록 지원한다고 한다. (자세한 내용은 여기를 눌러주세요)

*델리게이션 패턴은 자신의 객체 중 하나를 다른 object 에 소개하는 것

 

 WKUIDelegate

= 웹킷 뷰의 로딩 상황을 추적하거나 제어하는데 필요한 프로토콜을 담음

이 프로토콜은 사용자의 유저 인터페이스 요소들을 보여주기 위한 메소드이다.

예를 들어 새로운 웹뷰 창을 만든다던지, 알림 창 패널을 보여주는 역할을 한다.

 

 WKNavigationDelegate

= 사용자의 유저 인터페이스 요소들을 보여주기 위한 메소드

이 프로토콜은 웹킷 뷰의 로딩 상황을 추적하거나 제어하는데 필요한 프로토콜을 담고 있다.

해당 프로토콜을 통해서 인디케이터 뷰 (몇 번째 화면인지 표시) 를 적당한 위치에 구현한다.

 

 

 


 

3. SFSafariViewController

마지막으로 앱 내에서 웹을 여는 방식, SFSafariViewController 이다.

앱에서 SFSafariViewController 를 불러서 Safari 에서 사용하는 기능들을 전부 사용할 수 있다.

(ex. 뒤로 가기, 앞으로 가기, 공유하기 등 / 단, URL 입력은 불가능)

 

그리고 아이폰의 Safari 와 쿠키 정보들을 공유할 수 있다. 그러나 이 정보들은 앱에서는 사용할 수 없다.

단지 보여주고 SFSafariViewController 내에서만 활용된다. 앱 내에서 개인적으로 사용은 불가능하다.

 

또한 Delegate 를 이용해 SFSafariViewController 에서 어떤 이벤트가 들어왔을 때, 전달하는 것도 가능하다.

import SafariServices

@IBAction func openSafariViewController(_ sender: Any) {
    guard let appleUrl = URL(string: "https://www.apple.com")   else { return }

    let safariViewController = SFSafariViewController(url: appleUrl)
    safariViewController.delegate = self
    safariViewController.modalPresentationStyle = .automatic
    self.present(safariViewController, animated: true, completion: nil)
}

extension ViewController: SFSafariViewControllerDelegate {}

 

쿠키 관리를 수동으로 해주어야 하는 WKWebView 와 다르게 SFSafariViewControlller 에서

쿠키는 Safari 와 SFSafariViewController 간에 공유되므로 사용자 세션과 환경 설정이 둘 사이에 유지된다.

 

이 외에도 아래와 같은 이점들이 있다.

  • 친숙한 Safari 인터페이스 (수동으로 URL 을 입력할 수는 없음)
  • https를 사용해 페이지를 안전하게 로드할 때 잠금 아이콘 표시함
  • 콘텐츠 차단 기능 제공함 (소프트웨어, 명시적 콘텐츠, 광고 등 추적하지 못하도록 함)
  • 자동 완성 및 쿠키 (SFSafariViewController 와의 상호작용은 앱에서 볼 수 없음)

 

 

 


 

 

 

현 프로젝트에서는 WKWebView / SFSafariViewController 방식 둘 다 차용하고 있는데,

둘의 특성을 생각해보았을 때, 현재 앱에서 새 창을 띄워보여줄 때

커스텀이 필요한 부분이 크게 보이지 않아서 SFSafariViewController 만으로도 충분할 것 같다는 생각이 든다.

아무튼 만들어져 있는 범위 내에서 우선 해결책을 찾아내야 하니

쿠키 공유 관련해서 to be continued . . 

 

 

 

 

 

© 참고

https://dongminyoon.tistory.com/57 (iOS / 앱에서 웹 보여주기)

https://zeddios.tistory.com/332 (UIWebView 와 WKWebView 의 차이)

https://zeddios.tistory.com/375 (SFSafariViewController 의 이점들)

 

[iOS] 앱에서 Web 보여주기 (WKWebView, SFSafariViewController, Safari 열기)

iOS에서 앱 내에서 Web을 보여주어야 하는 경우가 있습니다. 이 때, 크게 3가지 방법이 있는데요. 이 방법에 대해 간단히 사용법을 알아보고 공부해보겠습니다. 일단 UIWebView를 사용하는 방법도 있

dongminyoon.tistory.com

'Study > cs' 카테고리의 다른 글

[PHP] 🐘  (0) 2021.10.28
[CS] 프로세스의 상태전이와 스케줄링  (0) 2021.08.30
[CS] 디자인 패턴 유형과 종류  (0) 2021.08.30