WKWebView 에서 js 의 alert (), confirm (), prompt () 방법 이 제대로 실행 되 지 않 습 니 다.

4230 단어
보안 메커니즘 의 문제 로 인해 WKWebView 는 기본적으로 JavaScript 에서 alert 류 의 방법 (alert (), confirm (), prompt () 을 차단 하 였 으 며, 정상적으로 사용 하려 면 WKWebView 의 세 가지 프 록 시 방법 이 필요 합 니 다.

//    alert  ,        js      alert  
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;

//    confirm  ,        js      confirm  
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;

//    prompt  ,        js      prompt  
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler;

다음은 세 가지 대리 방법의 구체 적 인 실현 을 살 펴 보 겠 습 니 다.
alert

//     js alert       ,                     ,                ,           
//               completionHandler,  js      
////   message   js    alert()   
-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler();
    }])];
    [self presentViewController:alertController animated:YES completion:nil];
}


confirm
//  js confirm     ,               ,      ,   completionHandler       ,    YES,     NO
//   message   js    confirm()   
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"  " message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(NO);
    }])];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(YES);
    }])];
    [self presentViewController:alertController animated:YES completion:nil];
}

prompt
//  js prompt     ,              ,           
//                 ,  completionHandler      ,        ,                           ,js         

//   prompt   prompt(, );  
//  defaultText   prompt(, );   
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:@"" preferredStyle:UIAlertControllerStyleAlert];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.text = defaultText;
    }];
    [alertController addAction:([UIAlertAction actionWithTitle:@"  " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler(alertController.textFields[0].text?:@"");
    }])];
    
    [self presentViewController:alertController animated:YES completion:nil];
}

2019 - 06 - 12 업 데 이 트 는 에이전트 방법 만 가면 반드시 completionHandler 를 호출 하여 가방 을 닫 아야 합 니 다. 그렇지 않 으 면 crash 를 초래 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기