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를 사용하여 좀 더 깔끔하게 사용할 수 있습니다.
📌 특징
- 쿠키, 세션, 로그인 정보가 유지
- 별도의 UI 구현 작업이 없고, 불가능함
- JavaScript 실행 불가능
- 업로드/다운로드 기능에 사용
📌 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, 직접 컨트롤이 필요할 때