투케이2K

89. (ios/swift) 웹뷰 decidePolicyFor 실시간 주소 감지 부분 확인 및 외부 앱 실행 실시 본문

IOS

89. (ios/swift) 웹뷰 decidePolicyFor 실시간 주소 감지 부분 확인 및 외부 앱 실행 실시

투케이2K 2021. 12. 31. 15:42

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT

 

[소스 코드]

    // MARK: - [웹뷰 실시간 url 변경 감지 실시]
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        let _shouldUrl = String(describing: webView.url?.description ?? "")
        var action: WKNavigationActionPolicy?
        guard let url = navigationAction.request.url else { return }
        print("")
        print("===============================")
        print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
        print("_shouldUrl :: \(_shouldUrl)")
        print("requestUrl :: \(url)")
        print("===============================")
        print("")
        
        // [앱설치 링크로 진입시 별도 처리(https://itunes.apple.com/kr/app/id ...)]
        if ("\(url)".description.hasPrefix("https://itunes.apple.com") || "\(url)".description.hasPrefix("http://itunes.apple.com")) {
            // -----------------------------------------
            // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
            DispatchQueue.main.async {
                // [스토어 연결(OS에서 처리)]
                guard let appsUrl = URL(string: "\(url)")
                else {
                    print("")
                    print("====================================")
                    print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                    print("로 직 :: 마켓 이동 에러]")
                    print("error :: ", "URL 파싱 에러")
                    print("====================================")
                    print("")
                    return
                }
                // -----------------------------------------
                UIApplication.shared.open(appsUrl, completionHandler: { (success) in
                    if (success) {
                        print("")
                        print("====================================")
                        print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                        print("로 직 :: 마켓 이동 수행]")
                        print("appsUrl :: \(url)")
                        print("====================================")
                        print("")
                    }
                    else {
                        print("")
                        print("====================================")
                        print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                        print("로 직 :: 마켓 이동 실패]")
                        print("appsUrl :: \(url)")
                        print("====================================")
                        print("")
                    }
                })
                // -----------------------------------------
                // [웹뷰 내 페이지 이동 안하도록 설정(PolicyCancel)]
                decisionHandler(action ?? .cancel)
                return
                // -----------------------------------------
            }
        }
        else if ("\(url)".description.hasPrefix("testApp://")) {
            // -----------------------------------------
            // 외부 앱 Scheme로 URL이 시작되는 경우
            // 테스트 앱 링크 처리 예시 (testApp://)
            // 추가로 연동하고 싶은 앱스키마가 있다면 or 조건에 추가 해주세요.
            // -----------------------------------------
            // [메인 큐에서 비동기 방식 실행 : UI 동작 실시]
            DispatchQueue.main.async {
                // [스토어 연결(OS에서 처리)]
                guard let appsUrl = URL(string: "\(url)")
                else {
                    print("")
                    print("====================================")
                    print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                    print("로 직 :: NICE 아이핀 앱 링크 처리 에러]")
                    print("error :: ", "URL 파싱 에러")
                    print("====================================")
                    print("")
                    return
                }
                // -----------------------------------------
                UIApplication.shared.open(appsUrl, completionHandler: { (success) in
                    if (success) {
                        print("")
                        print("====================================")
                        print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                        print("로 직 :: NICE 아이핀 앱 링크 처리 수행]")
                        print("appsUrl :: \(url)")
                        print("====================================")
                        print("")
                    }
                    else {
                        print("")
                        print("====================================")
                        print("[A_Nice >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
                        print("로 직 :: NICE 아이핀 앱 링크 처리 실패]")
                        print("appsUrl :: \(url)")
                        print("====================================")
                        print("")
                    }
                })
                // -----------------------------------------
                // [웹뷰 내 페이지 이동 안하도록 설정(PolicyCancel)]
                decisionHandler(action ?? .cancel)
                return
                // -----------------------------------------
            }
        }
        

        // -----------------------------------------
        // [일반 웹 페이지 링크 처리(PolicyAllow)]
        decisionHandler(action ?? .allow)
        return
        // -----------------------------------------
    }
 

 

반응형
Comments