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

// --------------------------------------------------------------------------------------
 
반응형