Notice
Recent Posts
Recent Comments
Link
투케이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
[결과 출력]
반응형
'Objective-C' 카테고리의 다른 글
Comments