투케이2K

67. (Objective-C/objc) [간단 소스] WKWebView 웹뷰 사용해 http 주소 로드 수행 실시 본문

Objective-C

67. (Objective-C/objc) [간단 소스] WKWebView 웹뷰 사용해 http 주소 로드 수행 실시

투케이2K 2022. 9. 7. 16:12

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : OBJECTIVE-C

 

[ViewController.h - 소스코드]

// MARK: - [import 정의]
#import <UIKit/UIKit.h>
#import <SafariServices/SafariServices.h>
#import <WebKit/WebKit.h>
#import <AVFoundation/AVFoundation.h>


@interface ViewController : UIViewController<WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate> { // [클래스 딜리게이트 정의g]
    
    /*
     -----------------------------
     // [지역 변수 정의]
     -----------------------------
     1. self 키워드 없이 접근 가능
     -----------------------------
     2. 메소드 내에서 사용 필요
     -----------------------------
     */
}

// [get set 프로퍼티 선언]
@property (nonatomic) WKWebView *main_webview;
@property (nonatomic) WKUserContentController *javascriptController;
@property (nonatomic) WKWebViewConfiguration *javascriptConfig;
@property (nonatomic) WKPreferences *kwebviewPreference;

@end
 

[ViewController.m - 소스코드]

#import "ViewController.h"


// MARK: - [전처리 지시어 헤더 파일 import]
#import "S_Define.h"


// MARK: - [프로젝트-Swift.h import 명시]
#import "objectiveProject-Swift.h"


// MARK: - [웹뷰 호출 관련 클래스 인터페이스]
@interface ViewController()
@end
@implementation ViewController


// MARK: [컴포넌트 동기화 실시]
@synthesize main_webview;
@synthesize javascriptController;
@synthesize javascriptConfig;
@synthesize kwebviewPreference;



// MARK: - [뷰 로드 실시]
- (void)viewDidLoad {
    [super viewDidLoad];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidLoad() :: 뷰 로드 실시] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewWillAppear() :: 뷰 로드 완료] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidAppear() :: 뷰 화면 표시] \n");
    printf("==================================== \n");
    printf("\n");
    
    // [웹뷰 호출 수행 실시]
    [self init_Webview];
    
    // [테스트 메인 함수 호출]
    [self testMain];
}





// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewWillDisappear() :: 뷰 정지 상태] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidDisappear() :: 뷰 종료 상태] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> testMain() :: 테스트 메소드 수행] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [앱 상태 바 콘텐츠 색상 커스텀 변경 실시]
-(UIStatusBarStyle)preferredStatusBarStyle {
    // return UIStatusBarStyleLightContent; // [상태바 콘텐츠 색상 흰색으로 변경 : ex (배터리 표시)]
    if (@available(iOS 13.0, *)) { // [상태바 콘텐츠 색상 검정색으로 변경 : ex (배터리 표시)]
        return UIStatusBarStyleDarkContent;
    } else {
        return UIStatusBarStyleDefault;
    }
}





// MARK: - [동적 웹뷰 생성 및 초기 값 설정]
- (void)init_Webview {
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> init_Webview() :: 웹뷰 초기화 및 로드 수행 실시] \n");
    printf("==================================== \n");
    printf("\n");
    
    // -----------------------------------------
    
    // MARK: [디바이스 화면 사이즈 확인]
    
    // [뷰 컨트롤러 배경 색상 지정]
    [self.view setBackgroundColor: [UIColor whiteColor]];
    
    // [디바이스 전체 height 값 확인 실시]
    double deviceHeight = self.view.frame.size.height;
    
    // [디바이스 전체 width 값 확인 실시]
    double deviceWidth = self.view.frame.size.width;
    
    // [디바이스 휴대폰 상태 바 높이 사이즈 확인 실시]
    double statusBarFrameHeight = [UIApplication sharedApplication].statusBarFrame.size.height;
        
    // [디바이스 휴대폰 상태 바 너비 사이즈 확인 실시]
    double statusBarFrameWidth = [UIApplication sharedApplication].statusBarFrame.size.width;

    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> init_Webview() :: 디바이스 화면 사이즈 확인] \n");
    printf("[deviceHeight :: %f] \n", deviceHeight);
    printf("[deviceWidth :: %f] \n", deviceWidth);
    printf("[statusBarFrameHeight :: %f] \n", statusBarFrameHeight);
    printf("==================================== \n");
    printf("\n");
    
    // -----------------------------------------
    
    // MARK: [기존에 저장된 캐시 및 쿠키 삭제 수행 실시]
    
    NSSet *websiteDataTypes
    = [NSSet setWithArray:@[
                            WKWebsiteDataTypeDiskCache, // 디스크 캐시
                            WKWebsiteDataTypeMemoryCache, // 메모리 캐시
                            WKWebsiteDataTypeCookies, // 웹 쿠키,
                                                     
                            WKWebsiteDataTypeOfflineWebApplicationCache, // 앱 캐시
                            WKWebsiteDataTypeWebSQLDatabases, // 웹 SQL 데이터 베이스
                            WKWebsiteDataTypeIndexedDBDatabases // 데이터 베이스 정보
                                                     
                            //WKWebsiteDataTypeLocalStorage // 로컬 스토리지
                            //WKWebsiteDataTypeSessionStorage // 세션 스토리지

    ]];
    NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
    [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> init_Webview() :: 기존에 저장된 캐시 및 쿠키 삭제 수행] \n");
        printf("==================================== \n");
        printf("\n");
    }];
    
    // -----------------------------------------
    
    // MARK: [URL 요청 후 잔여 캐시 데이터 삭제]
    
    NSCache *myCache = [[NSCache alloc] init];
    [myCache removeAllObjects];
    
    // -----------------------------------------
    
    // MARK: [웹 보기에 대한 쿠키, 디스크 및 메모리 캐시, 기타 유형의 데이터를 관리하는 개체 지정]
    
    self.javascriptConfig = [[WKWebViewConfiguration alloc] init];
    
    WKWebsiteDataStore *dataStore = [WKWebsiteDataStore defaultDataStore];
    self.javascriptConfig.websiteDataStore = dataStore; // [디폴트]
    
    // -----------------------------------------
    
    // MARK: [자바스크립트 통신을 위한 브릿지 추가]
    
    WKUserContentController *userScript = [[WKUserContentController alloc] init];
    [userScript addScriptMessageHandler:self name:@"system"];
    self.javascriptController = userScript;
    
    self.javascriptConfig.userContentController = self.javascriptController;
    
    // -----------------------------------------
    
    // MARK: [웹뷰 객체 생성 실시]
    
    CGRect webViewSize = CGRectMake(
                                 0, // [x]
                                 statusBarFrameHeight, // [y]
                                 deviceWidth, // [width]
                                 (deviceHeight - statusBarFrameHeight) // [height]
                        );
    self.main_webview = [[WKWebView alloc] initWithFrame:webViewSize configuration:self.javascriptConfig];
    
    // -----------------------------------------
    
    // MARK: [웹뷰 추가 옵션 설정 값 지정]
    
    self.main_webview.configuration.preferences.javaScriptCanOpenWindowsAutomatically = true;  // 자바스크립트 활성화
    self.main_webview.navigationDelegate = self; // 웹뷰 변경 상태 감지 위함
    self.main_webview.scrollView.alwaysBounceVertical = false; // 웹뷰 스크롤 바운스 방지
    self.main_webview.scrollView.bounces = false; // 웹뷰 스크롤 바운스 방지
    //self.main_webview.allowsBackForwardNavigationGestures = true; // 웹뷰 뒤로가기, 앞으로 가기 제스처 사용
    //self.main_webview.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), options: .new, context: nil); // 웹뷰 로드 상태 퍼센트 확인
    self.main_webview.UIDelegate = self; // alert 팝업창 이벤트 받기 위함

    // -----------------------------------------
    
    // MARK: [웹뷰를 화면에 추가 실시]
    [self.view addSubview:self.main_webview];
    
    // -----------------------------------------
    
    // MARK: [웹뷰 페이지 로드 수행 실시]
    [self.main_webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString: @"https://www.google.com"]]];
    
    // -----------------------------------------
    
}


@end
 

[결과 출력]

 

 

반응형
Comments