📱 iOS/UIKit

[UIKit] openURL vs SFSafariViewController, 앱 사용 중에 URL 페이지 띄워주는 방식의 차이 알아보기

kyxxn 2024. 8. 24. 13:58

학습 목표

  • 앱 사용 중, 특정 URL을 띄워줘야 하는 경우 어떻게 할 지 살펴본다.
  • openURL 방식으로 URL 연결하면 어떤 특징이 있는지 살펴본다.
  • SFSafariViewController 클래스에 대해 살펴본다.
  • openURL로 URL을 띄워주는 것과
    SFSafariViewController 클래스로 URL 띄우는 것에 차이점을 살펴본다.

학습 내용

서론

앱 사용 중에 특정 URL을 띄워줘야 하는 경우가 생겼다.

앱 내에서 어떻게 URL을 띄우는지 알아보자.

개인정보처리방침, 앱 사용설명 등등 노션으로 라우팅 되는 경우가 많았는데, 이 주제에 대한 내용이 될 것 같다.

openURL로 URL 라우팅

UIApplication.shared.open(_ url: URL, ..) 메소드를 이용한 방식이다.

@IBAction func helpButtonTapped(_ sender: Any) {
    if let url = URL(string: "https://boostcamp.connect.or.kr") {
            UIApplication.shared.open(url)
    }
}

URL 띄울 때, UIViewController의 생명주기 메소드들이 어떻게 동작하는지 살펴보자

 

 

URL 페이지로 라우팅 됐음에도 UIViewController 생명주기는 바뀌지 않는다.

그럼 SceneDelegate의 메소드까지 추가해보자.

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        print(#file, #line, #function, #column)
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        print(#file, #line, #function, #column)
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        print(#file, #line, #function, #column)
    }

    func sceneWillResignActive(_ scene: UIScene) {
        print(#file, #line, #function, #column)
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        print(#file, #line, #function, #column)
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        print(#file, #line, #function, #column)
    }
}

그 결과, 앱을 아예 빠져나가서 Safari 앱을 통해 라우팅 시켜주는 것을 확인했다.

 

 

SFSafariViewController 클래스

SafariServices 라이브러리를 사용

`import SafariServices` 를 해야 사용 가능함

  • 앱을 벗어나지 않고도 웹사이트를 볼 수 있음
  • 클래스 명과 다르게, 실제 Safari는 아니고 유사한 뷰 컨트롤러인듯
  • Reader, AutoFill, 사기성 웹사이트 경고 및 콘텐츠 차단과 같은 Safari 기능을 지원
  • 완료 버튼, 뒤로 및 앞으로 탐색 버튼, Safari에서 페이지를 직접 여는 버튼.. 지원

SFSafariViewController 클래스로 URL 라우팅

@IBAction func helpButtonTapped(_ sender: Any) {
    if let url = URL(string: "https://boostcamp.connect.or.kr") {
        let safariVC = SFSafariViewController(url: url)
            self.present(safariVC, animated: true)
    }
}

 

 

신기하다. 앱 내에서 띄우는 방식으로, Safari를 사용하지 않는다.

또한, 이전 SettingVC에서 viewDidDisappear()를 호출하여 완전히 뷰를 닫아두고 URL을 띄운다.

URL 작업이 끝나면 다시 뷰를 그려준다.

ㄴㅇㅁㅇㄱ 신기함

openURL vs SFSafariViewController 라우팅 차이

정리

OpenURL

  • 기본 브라우저에 띄워 보여줌
    (실습에선 Safari로 띄움)
  • 현재 앱이 백그라운드로 이동,
    브라우저 앱이 로드 됨
  • 뷰를 새로 그리지 않음

SFSafariViewController

  • 현재 앱 내에서 띄워 보여줌
  • 현재 앱이 백그라운드로 가지 않음
    (실습에선 Safari가 실행되지 않음을 보여줌)
  • URL 라우팅할 때 뷰를 죽이고, URL을 닫으면 뷰를 새로 그림

배운 점

  • URL 띄우는 두 가지 방법을 알아봤다.
  • SFSafariViewController 클래스에 대해 알게 되었다.
  • 두 방식의 차이를 알았고, SceneDelegate 메소드에 디버깅 함수를 넣어 테스트 해보며 더 명확하게 알게 되었다.

참조 링크