투케이2K

65. (TWOK/UTIL) [Android/Ios] 웹뷰 (webview) 로딩 (로드) 완료 상태 감지 부분 정리 본문

투케이2K 유틸파일

65. (TWOK/UTIL) [Android/Ios] 웹뷰 (webview) 로딩 (로드) 완료 상태 감지 부분 정리

투케이2K 2022. 7. 15. 09:22

[설 명]

프로그램 : Android / Ios

설 명 : 웹뷰 (webview) 로딩 (로드) 완료 상태 감지 부분 정리

 

[Android - 소스 코드]

// [1] : 상태 감지 부분 : 실시간 로딩 상태 체크

            main_webview.setWebChromeClient(new WebChromeClient() {

                // TODO [실시간 웹뷰 로드 상태 확인]
                @Override
                public void onProgressChanged(WebView view, int progress) {
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                    Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                    Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    // [웹뷰 로드 완료 상태 : 웹뷰의 호출 상황이 100 인 경우]
                    if(progress >= 100){
                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                        Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                        Log.i("","\n"+"[호출 상황 :: "+String.valueOf(progress)+"]");
                        Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");
                        // ----------------------------------
                        try {
                            // [SEARCH FAST] : [인트로 화면 처리]
                            introBgImageView.setVisibility(View.GONE);
                            main_webview.setVisibility(View.VISIBLE);
                        }
                        catch (Exception e){
                            e.printStackTrace();
                        }
                        // ----------------------------------
                        try {
                            if (cookieManager.hasCookies() == true){
                                Log.i("---","---");
                                Log.w("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 있음"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[쿠 키 :: "+String.valueOf(cookieManager.getCookie(main_webview.getUrl()))+"]");
                                Log.w("//===========//","================================================");
                                Log.i("---","---");
                            }
                            else {
                                Log.i("---","---");
                                Log.e("//===========//","================================================");
                                Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onProgressChanged() :: 실시간 웹뷰 호출 상황 확인 실시]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[주 소 :: "+String.valueOf(main_webview.getUrl())+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[상 태 :: "+"웹뷰 로드 완료 상태"+"]");
                                Log.i("","\n"+"--------------------------------");
                                Log.i("","\n"+"[저장된 쿠키 확인 :: "+"쿠키 없음"+"]");
                                Log.e("//===========//","================================================");
                                Log.i("---","---");
                            }
                        }
                        catch (Exception e){
                            //e.printStackTrace();
                        }
                        // ----------------------------------
                    }
                }
            });

 
// [2] : 상태 감지 부분 : 페이지 로드 완료 상태 콜백

    class MainWeb extends WebViewClient {

        // [로딩이 시작될 때]
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageStarted() :: [웹 클라이언트]]");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("로딩 시작")+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");
        }
        // [로딩이 완료됐을 때 한번 호출]
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.i("---","---");
            Log.w("//===========//","================================================");
            Log.i("","\n"+"["+String.valueOf(ACTIVITY_NAME)+" >> onPageFinished() :: [웹 클라이언트]]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[로드 완료 주소 :: "+String.valueOf(url)+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getUrl 주소 :: "+String.valueOf(main_webview.getUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[getOriginalUrl 주소 :: "+String.valueOf(main_webview.getOriginalUrl())+"]");
            Log.i("","\n"+"--------------------------------");
            Log.i("","\n"+"[설 명 :: "+String.valueOf("로드 완료")+"]");
            Log.w("//===========//","================================================");
            Log.i("---","---");

            // [SEARCH FAST] : [인트로 화면 처리]
            introBgImageView.setVisibility(View.GONE);
            main_webview.setVisibility(View.VISIBLE);
        }
    }
 

[Ios - 소스 코드]

// [1] : 상태 감지 : 실시간 웹뷰 로드 상태 체크

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        // [0 ~ 1 사이의 실수형으로 결과값이 출력된다 [0 : 로딩 시작, 1 : 로딩 완료]]
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> observeValue() :: 실시간 웹뷰 로드 상태 확인]")
        print("-------------------------------")
        print("원 본 :: \(Float((self.main_webview?.estimatedProgress)!))")
        print("-------------------------------")
        print("퍼센트 :: \(Float((self.main_webview?.estimatedProgress)!)*100)")
        print("====================================")
        print("")
        
        if Float((self.main_webview?.estimatedProgress)!) >= 1.0 { // 0.5 / 0.9 / 1.0
            
            //DispatchQueue.main.asyncAfter(deadline: .now() + 1.3) { // [특정 시간 이후 수행]
            DispatchQueue.main.async { // [즉시 수행]
                print("")
                print("====================================")
                print("[\(self.ACTIVITY_NAME) >> observeValue() :: 인트로 화면 닫기 수행 실시]")
                print("-------------------------------")
                print("퍼센트 :: \(Float((self.main_webview?.estimatedProgress)!)*100)")
                print("====================================")
                print("")
                
                // -----------------------------------------
                // [SEARCH FAST] : [인트로 화면 처리]
                self.main_webview?.isHidden = false // [웹뷰 활성]
                self.introBg.isHidden = true // [로딩 이미지 비활성]
                // -----------------------------------------
                
                
                // -----------------------------------------
                // [쿠키매니저에 저장된 쿠키 확인]
                if self.main_webview != nil {
                    if #available(iOS 11.0, *) {
                        self.main_webview!.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
                            // for cookie in cookies { }
                            print("")
                            print("====================================")
                            print("[\(self.ACTIVITY_NAME) >> observeValue() :: 자바스크립트에 저장된 [개별] 쿠키값 확인 실시]")
                            print("-------------------------------")
                            //print("key :: \(cookie.name)")
                            //print("value :: \(cookie.value)")
                            print("쿠키 개수 :: ", cookies.count)
                            print("-------------------------------")
                            print("쿠키 정보 :: ", cookies)
                            print("====================================")
                            print("")
                        }
                    }
                    else {
                        print("")
                        print("====================================")
                        print("[\(self.ACTIVITY_NAME) >> observeValue() :: 자바스크립트에 저장된 [개별] 쿠키값 확인 실시]")
                        print("-------------------------------")
                        print("error [에러] :: iOS 11.0 미만 디바이스")
                        print("====================================")
                        print("")
                    }
                }
                // -----------------------------------------
            }
        }
    }

// [2] : 상태 감지 부분 : 웹뷰 로드 완료 상태 콜백

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let _endUrl = String(describing: webView.url?.description ?? "")
        print("")
        print("====================================")
        print("[\(self.ACTIVITY_NAME) >> didFinish() :: 웹뷰 로드 수행 완료]")
        print("-------------------------------")
        print("주 소 :: \(_endUrl)")
        print("====================================")
        print("")

        // -----------------------------------------
        // [SEARCH FAST] : [인트로 화면 처리]
        self.main_webview?.isHidden = false // [웹뷰 활성]
        self.introBg.isHidden = true // [로딩 이미지 비활성]
        // -----------------------------------------
        
        // -----------------------------------------
        // [퍼미션 상태 업데이트 체크 수행 실시]
        self.permissionState()
        // -----------------------------------------
    }

 
반응형
Comments