티스토리 뷰

안녕하세요 :) Zedd입니다.

<WKWebView Back/Forward Button만들기>글을 쓰고..... 어케어케하다가 SFSafariViewController를 하게 됐는데......뒤로가기도있고....앞으로가는것도 있고..공유도 있음

그래서 급하게 <WKWebView Back/Forward Button만들기>글에 

SFSafariViewController쓰라고 추가.

순간 아 내가 왜 WKWebView써가면서 일일이 뒤로가기 / 앞으로가기를 다 만들고 그랬나라는 생각이 잠깐 들었지만......

일단 뭔 차이가 있긴 있겠죠????????????!??!?!?!?

차이가 있어야만합니다...그래서 WKWebView랑 SFSafariViewController의 차이가 무엇인지!!! 알아볼려다가 그럼 iOS에서 WebView를 보여주는 방식이 그럼 총 3가지가 되는거잖아요? 


1. 아예 사파리앱을 열어줌

2. WKWebView로 열어줌(UIWebView는 Deprecate됐으니 언급안할게요)

3. SFSafariViewController로 열어줌



그럼 일단 각각 차이점이 있을텐데...그 차이점이 궁금해졌습니다. 제목을 진짜 어떻게 지어야하지...?하고 고민하다가 저렇게 지었는데..음..좋은제목있으면 댓글로 달아주세요 :) 

그 전에 UIWebView와 WKWebView의 차이점을 알고싶다면 <UIWebView와 WKWebView의 차이>를 읽어주세요 :)


 App에서 Web페이지를 여는 방법



자..위에서 언급했다시피 App에서 Web페이지를 보고싶으면!!!!!!! 3가지 방법이 있습니다. 

하나씩 뭔지 보고, 어떻게 구현하는지 보겠습니다.


1. 아예 사파리앱을 열어줌


그러니까 내 앱 "안에서" 열어주는게 아니라 사파리앱을 앱에서 열어주는 것이죠.



  1. @IBAction func openSafariAction(_ sender: Any) {

     guard let url = URL(string: "http://zeddios.tistory.com"), UIApplication.shared.canOpenURL(url) else { return }

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

    }



원래 앱으로 돌아가려면? 

저걸 눌러서 원래 앱으로 돌아가야 하죠.




2. WKWebView사용하기

  1. import WebKit


    guard let url = URL(string:"https://zeddios.tistory.com") else {return}

    let request = URLRequest(url: url)

    webView?.load(request)




WKWebView는 앱 안에서 보여주죠? 스레드는 앱과 별도로 돌아가긴 하지만요 :)

그리고 WKWebView는 info.plist에


  1. <key>NSAppTransportSecurity</key>

        <dict>

            <key>NSAllowsArbitraryLoads</key>

            <true/>

        </dict>



NSAppTransportSecurity Key를 추가해줘야 합니다.



3. SFSafariViewController로 열어줌


  1. import SafariServices


    @IBAction func oepnSFSafariViewControllerAction(_ sender: Any) {

        guard let url = URL(string: "https://zeddios.tistory.com") else { return }

        let safariViewController = SFSafariViewController(url: url)

        present(safariViewController, animated: true, completion: nil)

     }




3개가 미묘하게 다른것을 볼 수 있죠.


먼저 각자의 차이점이라기 보다는...각각이 할 수 있는 일이 다른 것 같습니다.


일단 1번은 아예 앱을 잠시 떠나서 Safari로 보여주죠?

일단 이거의 장점을..엄청 찾아봤는데....잘 안나오네요.....

제가 생각하는 장점이자 단점은 앱과 따로 실행된다는것..?

그렇기 때문에, 사용자는 Safari의 모든 기능을 사용할 수 있지만, App을 다시 방문하지 못할 수도 있다고 합니다. 또한 iOS 9 이전에는 reader view나 자동완성을 위한 KeyChain기능을 사용하려면 App에서 이렇게 Safari를 열어줬다고 합니다. (지금은 SFSafariViewController로 가능해짐)

혹시 이거말고 Safari 앱으로 여는 것에, 특별한 장점이 있다면 알려주세요 :)



2번째! WKWebView.

WKWebView의 성능에 대해서는 <UIWebView와 WKWebView의 차이>글에서 설명했었죠!

WKWebView는 웹 콘텐츠를 수정하거나 조작해야하는 경우 가장 높은 유연성을 제공한다고 합니다.


3번째! SFSafariViewController.

이걸 먼저 넣을 걸 그랬나 ㅠㅠ 

SFSafariViewController를 사용하는 것은 Safari앱을 여는 것과 똑같은 효과를 낼 수 있어요.


1. 친숙한 Safari 인터페이스 : Safari처럼 맨위에는 웹 주소 텍스트 필드가 있으며, 아래에는 뒤로가기 / 앞으로가기 버튼과 공유버튼이 있습니다. Safari 아이콘을 누르면 Safari앱으로 현재 웹사이트가 열립니다.

(참고 : 웹주소 텍스트 필드는 편집 할 수 없다고 해요 :) 사용자는 링크를 누르거나 탐색버튼을 사용하여 탐색할 수는 있지만 수동으로 URL을 입력할 수 는 없습니다.)



(이렇게 고정임)


2. SFSafariViewController는 https를 사용하여 페이지를 안전하게 로드 할 때 잠금 아이콘을 표시합니다. 또한 피싱이 의심되는 페이지를 로드 할 때 경고 메시지를 표시합니다. 이렇게하면 사용자는 자신이보고있는 콘텐츠에 대해 더 큰 인식과 자신감을 갖게됩니다.


3. 콘텐츠 차단

iOS 9의 새로운 기능인 콘텐츠 차단 기능은 Safari에서와 마찬가지로 SFSafariViewController에서 작동합니다. 콘텐츠 차단기는 소프트웨어, 명시 적 콘텐츠, 광고 등을 추적하지 못하도록하는 옵션을 사용자에게 제공합니다. 이렇게하면 더 빠르고 안전하게 검색 할 수 있습니다.


4. 자동 완성 및 쿠키

SFSafariViewController를 사용하면 사용자가 iCloud 키 체인에서 중요한 정보와 자격 증명을 안전하게 자동 완성 할 수 있습니다. 여기에는 비밀번호, 신용 카드 번호 및 연락처 정보 입력이 포함됩니다. 이는 이전에는 앱에서 불가능했던 수준의 보안과 편의성을 제공합니다. 또한 쿠키는 Safari와 SFSafariViewController간에 공유되므로 사용자 세션과 환경 설정이 둘 사이에 유지됩니다. 예를 들어 앱이 Twitter 나 Facebook에 액세스하도록 승인하면 사용자가 이미 Safari에 로그인 한 상태이거나 비밀번호가 iCloud Keychain에 저장되어있는 경우 간소화 된 환경이됩니다.


앱을 통해 사용자가 인터넷의 어느 곳에서나 웹 사이트를 볼 수있게하는 경우 SFSafariViewController 클래스를 사용하세요.

SFSafariViewController 클래스는 웹 검색을위한 표준 인터페이스를 제공합니다. 보기 컨트롤러에는 리더, 자동 채우기, 사기성 웹 사이트 감지 및 콘텐츠 차단과 같은 Safari 기능이 포함되어 있습니다. Safari와 쿠키 및 기타 웹 사이트 데이터를 공유합니다. 


하지만 SFSafariViewController에도 단점이 있으니...

사용자의 활동 및 SFSafariViewController와의 상호 작용은 앱에서 볼 수 없다고 합니다. 또한, 인터넷 사용 기록 또는 웹 사이트 데이터에 액세스 할 수 없다고 해요.


위에서 말한 기능은 SFSafariViewController에서 되는거니 WKWebView에서는 안되겠죠? 

본인이 하고싶은 기능에 따라 WKWebView로 할지 SFSafariViewController로 할지 선택하면 될 것 같아요.


출처 : http://developer.outbrain.com/ios-best-practices-for-opening-a-web-page-within-an-app/


위 링크에서 한눈에 볼 수 있는 표가 있길래..UIWebView는 뭐........딱히 안봐도 될 것 같습니다. WKWebView와 SFSafariViewController가 어떤점이 다른지 집중해서 봐주세요 :)



나는 좀 customize behavior를 Web페이지 안에서 하고싶다!! => WKWebView


나는 뭐..사용자가 안전하게...Safari의 모든 기능을 앱 내에서 즐기면서 Safari와 쿠키를 공유하게 하고싶다 => SFSafariViewController

(SFSafariViewController사용하면 뒤로가기 / 앞으로가기 / 공유버튼 이런거 안만들어도됨..다 만들어져있어요. )



WKWebView는 WebKit을 import하고, SFSafariViewController는 SafariServices를 import해야한다는 것도 잊지마세용

흠..제 앱 같은경우에는 딱히 customize behavior가 없었으니 SFSafariViewController를 사용하는게 맞았던 걸까요 ㅎㅎ...

아무튼 오늘도 도움이 되었길 바랍니다 :) 오늘 너무 추운데 감기조심하세요 ☃️


출처 :

http://developer.outbrain.com/ios-best-practices-for-opening-a-web-page-within-an-app/

https://www.captechconsulting.com/blogs/ios-9-tutorial-series-sfsafariviewcontroller

https://stackoverflow.com/questions/41541449/what-is-the-main-advantage-of-using-sfsafariviewcontroller

https://code.tutsplus.com/tutorials/ios-9-getting-started-with-sfsafariviewcontroller--cms-24260




댓글
  • 프로필사진 정윤혁 안녕하세요 혹시 SFSafariViewController를 쓰면 앱스토어에서 리젝되는지 알고 싶습니다. 제가 알기로 링크된 페이지가 내 소유가 아니고 다른 소유라면
    완전히 다른 앱에서 보여야한다고 들었는데 이걸 쓰면 결론적으로 내앱에서 다른 사이트를 보는거니까 리젝될수 있을까요??
    2019.07.01 19:09
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 ??헉 그런이야기는 처음들어보는데요...그 이야기의 출처를 알 수 있을까요? 제가 알기론 SFSafariViewController를 사용해도 리젝되지 않습니다....... 2019.07.01 19:37 신고
  • 프로필사진 정윤혁 아 그렇군요!! 감사합니다!! 카톡 ios개발 오픈톡방에서 들어본거 같아서요 ㅎㅎㅎ 저도 확실하지가 않아서 물어봤습니다 감사합니다 2019.07.02 00:20
  • 프로필사진 모모츠 좋은 포스팅 감사합니다. 도움이 많이 되었습니다 :) 2019.08.05 13:05
  • 프로필사진 ㅇㅈㅇㄸ 안녕하세요 초면에 실례지만... 질문이 하나 있는데 이미 wkwebview가 띄워져 있는 상태에서 어떤 이벤트가 발생했을때 원래 있던 wkwebview는 유지한채로 저렇게 상단바에 < back 버튼이 생기면서 그 위에 또다른 wkwebview를? push해서 (앱 내에서) 새 창으로 열리게 하고 싶을때에는 어떻게 해야할까요? 스택오버플로우에서도 답변이 없어서 질문 드립니다 ㅠㅠ 2020.01.11 23:03
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 그럼 WKWebView를 가진 또 다른 viewcontroller를 push하면 될 것 같은데요! 2020.01.11 23:04 신고
  • 프로필사진 BlogIcon ㅇㅈㅇㄸ 답변 감사합니다. 작성자님 말씀대로 viewcontroller1의 웹뷰에서 viewcontroller2로 url 변수를 전달하려고 appdelegate에서 url타입으로 상수선언 하고, viewcontroller1과 2에서 상수로 ad를 선언하고 appdelegate와 연동되게 해준 후
    ad?.myurl 이런식으로 상수를 호출할 수 있도록 만들었는데... viewcontroller2에서 웹뷰를 띄우려고 request 상수를 선언하는 과정에서 URLRequest(URL(ad?.myurl)) 이런식으로 지정을 해줬는데 오류를 뿜네요 뭐 때문일까요 ㅠㅠ
    2020.01.11 23:24
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 죄송한데 이해를 못하겠습니다...좀 더 자세하게 차근차근 설명해주세요! 정리하면서 질문하면 스스로 답을 찾는 경우도 많거든요.
    1. ~~~
    2. ~~~
    이런식으로 어떻게 하셨는지 차근차근 설명해주시고, 어떤 에러가 나는지도 적어주세요.
    2020.01.11 23:28 신고
  • 프로필사진 ㅇㅈㅇㄸ 헉.. 제 설명이 너무 난해했군요. 죄송합니다.
    먼저 AppDelegate.swift에서 var myurl : URL? 이렇게 URL타입으로 변수 선언을 해주었습니다.
    그 다음, ViewController1(메인)에 있는 웹뷰에서, 만약 유저가 링크 클릭을 하게 된다면, 그 url 값을 AppDelegate에서 선언해준 myurl에 저장합니다.
    그 후 myurl에 담긴 url값을 표시해줄 ViewController2를 push합니다.
    ViewController2의 webview에 웹을 띄우기 위해서, ViewController2에서 아래처럼 해주었습니다.
    let request = URLRequest(url: URL(ad?.myurl)!)
    webView.load(request)
    이때 저기 myurl에서 문제가 발생하네요. 3개의 에러가 발생하는데 그 오류는 아래에 적어두었습니다.
    에러 1.Cannot force unwrap value of non-optional type 'URL' / FIX - Replace '!' with ''
    2.Missing argument label 'resolvingAliasFileAt:' in call / FIX - Insert 'resolvingAliasFileAt: '
    3.Value of optional type 'URL?' must be unwrapped to a value of type 'URL' / FIX - Coalesce using '??' to provide a default when the optional value contains 'nil' / FIX - Force-unwrap using '!' to abort execution if the optional value contains 'nil'
    2020.01.11 23:46
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 ad.myUrl이 nil이어서 발생하는 오류네요. 2번은 메소드 호출 하실때 파라미터 적는걸 빼먹으신것 같구요.
    AppDelegate에 변수를 선언하고 그 변수를 viewController에서 사용하는 방법은...저는 처음 들어보는 방법인데..만약 가능하다고 해도 앱 내에서 쓰일 모든 변수를 AppDelegate에 선언하는 것은 확실히 이상합니다. 보통 해당 변수를 사용하는 viewController안이나 viewModel을 따로 만들어 viewModel안에 선언합니다.
    Swift의 옵셔널에 대한 개념이 없으신 것 같은데, 옵셔널을 먼저 공부하시는게 어떨까요? !(강제 언래핑)는 값이 있다고 확신할 때만 사용해야하며, nil을 강제 언래핑하게 되면 crash가 나게 됩니다.
    2020.01.11 23:58 신고
  • 프로필사진 ㅇㅈㅇㄸ 헉 감사합니다. 차근차근 해보겠습니다 2020.01.12 00:09
  • 프로필사진 영순이 오늘도 좋은 글 잘 보고갑니다! 2020.06.29 14:12
  • 프로필사진 kys 안녕하세요~ iOS 14 부터 default 브라우저를 바꿀 수 있는데 default 브라우저를 체크할 수 있는 방법은 없을까요? default 브라우저가 chrome일 경우에도 SFSafariViewController말고 safari 앱으로 열고 싶은데 찾아도 안나오네요.. 2021.07.19 18:04
댓글쓰기 폼
Total
3,199,007
Today
102
Yesterday
1,574