카테고리 없음

WebView 사용하기 (3) - Safari Link

ragdoll-cat 2025. 2. 27. 22:20

App에서 웹 페이지를 띄워야 할 때 사용할 수 있는 방법으로 크게 3가지 방법이 있다고 했습니다.

마지막으로 기본 웹 브라우저인 Safari를 열어서 웹 페이지를 여는 방법입니다.

 

엄밀히 말하면 앱 내에서 웹 브라우저를 열지 않고, iOS 기본 Safari 앱에서 웹 페이지를 직접 여는 방법이므로 WebView는 아니긴 합니다..만 가장 간단하고 빠른 방법이고 또 사용 빈도가 가장 적습니다.


📌 사용법

Button {
  if let url = URL(string: "https://apple.com") {
    UIApplication.shared.open(url)
  }
} label: {
  ..
}

UIApplication.shared.open 이게 끝입니다.

 

✅ 실제로 사용하실 때는 canOpenURL()을 사용하여 URL 열기 가능 여부를 확인하고 안전하게 접근하는 것이 좋습니다!

if let url = URL(string: "https://apple.com") {
  if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url)
  } else {
    print("이 URL은 열 수 없습니다 ❌")
  }
}

📌 응용

import SwiftUI

struct ContentView: View {
  var body: some View {
    Link("Open Apple", destination: URL(string: "https://apple.com")!)
  }
}

SwiftUI를 사용한다면 Link를 사용하여 좀 더 깔끔하게 사용할 수 있습니다.

📌 특징

  1. 쿠키, 세션, 로그인 정보가 유지
  2. 별도의 UI 구현 작업이 없고, 불가능함
  3. JavaScript 실행 불가능
  4. 업로드/다운로드 기능에 사용

📌 UIApplication.shared.open(URL) vs. SFSafariViewController vs. WKWebView 비교

비교표

항목 UIApplication.shared.open(URL) SFSafariViewController WKWebView

웹 페이지 표시 위치 외부 Safari 앱 앱 내부 (Safari 환경 유지) 앱 내부 (커스텀 브라우저)
Safari 쿠키 공유 ✅ 공유됨 (Safari와 동일) ✅ Safari와 공유됨 ❌ 기본적으로 공유 안 됨
자동 로그인 (SSO) ✅ Safari와 동일하게 유지 ✅ 유지됨 ❌ 별도 설정 필요 (WKWebsiteDataStore)
JavaScript 실행 가능 여부 ❌ 불가능 ❌ 불가능 ✅ 가능 (evaluateJavaScript)
파일 업로드/다운로드 ✅ Safari에서 가능 ❌ 불가능 ✅ 가능
세션/스토리지 사용 ✅ Safari와 동일 ✅ Safari와 동일 ❌ 별도 설정 필요
네비게이션 컨트롤 (뒤로 가기, 새로고침 등) ❌ Safari에서만 가능 ❌ 제공 안됨 ✅ 앱에서 직접 구현 가능
앱을 벗어남? ✅ Safari로 이동 ❌ 앱 내에서 열림 ❌ 앱 내에서 열림
사용자 경험 (UX) Safari 브라우저 그대로 Safari 경험 유지 (앱 내부에서) 완전 맞춤형 웹 브라우저 가능
보안 (Apple 권장 여부) ✅ 가장 안전 ✅ 보안 적용됨 ❌ 직접 관리해야 함

 


각 방식의 특징 정리

1️⃣ UIApplication.shared.open(URL) (외부 Safari에서 열기)

  • 특징
    ✅ iOS 기본 브라우저인 Safari에서 웹 페이지를 여는 방식.
    ✅ 쿠키, 세션, 로그인 정보 유지됨.
    ✅ 별도 UI 구현 필요 없음.
    ❌ 앱을 벗어나기 때문에 사용자 이탈 가능.
    ❌ JavaScript 실행, 커스텀 UI 불가능.
  • 언제 사용할까?
    🔹 앱 내부에서 웹을 표시할 필요 없이 Safari에서 열어도 될 때
    🔹 로그인 유지 (SSO) 가 필요한 경우
    🔹 다운로드/업로드 기능이 필요할 때

2️⃣ SFSafariViewController (앱 내부 Safari)

  • 특징
    ✅ Safari의 보안 정책을 그대로 유지하며 앱 내에서 웹 페이지를 열 수 있음.
    ✅ 쿠키, 로그인 정보 유지 가능.
    ✅ 앱을 벗어나지 않고 내부에서 웹을 볼 수 있음.
    ❌ 네비게이션 컨트롤(뒤로 가기, 앞으로 가기, 새로고침) 제공 안됨.
    ❌ JavaScript 실행 및 웹페이지 조작 불가능.
  • 언제 사용할까?
    🔹 로그인 페이지, OAuth 인증 (Google, Facebook 등)
    🔹 안전한 브라우징이 필요할 때 (보안 정책 유지)
    🔹 Safari 환경을 유지하면서 앱 내에서 웹 페이지를 표시할 때

3️⃣ WKWebView (앱 내 커스텀 웹뷰)

  • 특징
    ✅ 앱 내에서 완전한 웹 브라우저 구현 가능.
    ✅ JavaScript 실행 및 DOM 조작 가능.
    ✅ 네비게이션 컨트롤(뒤로 가기, 앞으로 가기) 직접 구현 가능.
    ❌ 쿠키, 로그인 정보가 Safari와 공유되지 않음.
    ❌ 직접 보안 관리 필요 (쿠키, 세션, 스토리지 설정).
  • 언제 사용할까?
    🔹 JavaScript 실행, 맞춤형 UI가 필요할 때
    🔹 앱 내부에서 웹 페이지를 완전히 제어해야 할 때
    🔹 커스텀 브라우저(내장 웹 뷰)를 만들어야 할 때

결론: 언제 어떤 방법을 사용할까?

  • Safari에서 열기 (UIApplication.shared.open(URL))
    앱을 벗어나도 상관없고, 로그인 유지/다운로드가 필요할 때
  • 앱 내부에서 열지만, Safari 환경을 유지 (SFSafariViewController)
    OAuth 로그인, 보안이 중요한 경우 (예: 로그인, 결제 페이지)
  • 커스텀 웹 브라우저 구현 (WKWebView)
    JavaScript 실행, 맞춤형 UI, 직접 컨트롤이 필요할 때