Objective-C
184. (Objective-C/objc) [간단 소스] IOS WKWebView 웹뷰 스크롤 이벤트 감지 - WKScriptMessageHandler Webview Scroll
투케이2K
2025. 2. 2. 13:13
[개발 환경 설정]
개발 툴 : XCODE
개발 언어 : OBJECTIVE-C
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Objective-c
- 개발 툴 : Xcode
- 기술 구분 : Webview / Scroll / WKScriptMessageHandler
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------
[1] : 사전 웹뷰 뷰컨트롤러에 자바스크립트 메시지 감지 위한 이벤트 핸들러 선언 : WKScriptMessageHandler
[2] : 웹 화면 window.onscroll 이벤트 감지를 위한 스크립트 코드 작성 후 addScriptMessageHandler 추가 실시
[3] : 전체 소스 코드 정의 :
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
@interface WebViewController : UIViewController <WKScriptMessageHandler>
@property (strong, nonatomic) WKWebView *webView; // [웹뷰 객체 선언]
@end
@implementation WebViewController
- (void)viewDidLoad {
[super viewDidLoad];
WKUserContentController *contentController = [[WKUserContentController alloc] init];
// [웹 화면 window.onscroll 이벤트 감지를 위한 스크립트 코드 작성]
NSString *jsScript = @"window.onscroll = function() {"
@"window.webkit.messageHandlers.scrollHandler.postMessage(window.scrollY);"
@"};";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:jsScript
injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
forMainFrameOnly:NO];
[contentController addUserScript:userScript];
[contentController addScriptMessageHandler:self name:@"scrollHandler"]; // [scrollHandler 추가]
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; // [웹뷰 객체 초기화]
configuration.userContentController = contentController;
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
[self.view addSubview:self.webView]; // [뷰 컨트롤러에 웹뷰 추가]
NSURL *url = [NSURL URLWithString:@"https://www.twok.com"]; // [웹뷰 로드 주소 정의]
NSURLRequest *request = [NSURLRequest requestWithURL:url]; // [NSURLRequest 정의]
[self.webView loadRequest:request]; // [웹뷰 로드 수행 실시]
}
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"scrollHandler"]) { // [웹 스크롤 이벤트가 발생한 경우 확인]
NSLog(@"WebViewController :: 웹페이지 스크롤 위치 :: %@", message.body);
}
}
- (void)dealloc {
[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"scrollHandler"];
}
@end
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------
[Ios/Swift] A_Main - 웹뷰 로드 화면 관련 클래스 정리
https://blog.naver.com/kkh0977/222686770495
// --------------------------------------------------------------------------------------
반응형