iOS WKWebView에 javascript alert () 대화 상자가 표시되지 않음
Javascript에서 호출되는 경고 대화 상자를 표시하기 위해 iOS 8에서 WKWebView를 얻는 데 문제가 있습니다. 표준 WKWebView를 만들고 HTML 파일을로드 한 후 페이지에 텍스트가 포함 된 간단한 경고를 만드는 버튼이 있습니다. 이것은 UIWebView 및 Google Chrome / Safari에서 작동하지만 WKWebView에서는 작동하지 않는 것 같습니다. 도움을 주시면 감사하겠습니다.
내 설정은 다음과 같습니다.
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
config.mediaPlaybackRequiresUserAction = false;
_wkViewWeb = [[WKWebView alloc] initWithFrame:_viewWeb.frame config];
_wkViewWeb.scrollView.scrollEnabled = NO;
NSString *fullURL = @"file://.../TestSlide.html";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
[_wkViewWeb loadRequest:request];
HTML에는 다음과 같은 기능이 있습니다.
<SCRIPT Language="JavaScript">
function alertTest() {
alert("Testing Alerts");
}
</SCRIPT>
그리고 버튼 :
<b>Test Alerts: <input type="button" value="Alert Popup" onclick="alertTest()"><br></b> <br>
이 설정은 UIWebView 및 일반 브라우저에서 작동하지만 WKWebView에서는 작동하지 않습니다. 구성에 누락 된 것이 있습니까? 경고 / 확인 대화 동작을 제어하기 위해 WK 델리게이트 중 하나를 사용해야합니까? 감사합니다.
이 문제를 해결하려면 웹보기에 대한 WKUIDelegate가 필요합니다. 경고를 어떤 방식으로 표시해야하는지 결정하는 것은 대리인의 의무입니다. 경고, 확인 및 텍스트 입력 (프롬 트)을 위해이를 구현해야합니다.
다음은 페이지 URL 또는 보안 기능을 확인하지 않은 샘플 코드입니다.
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message
message:nil
preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction *action) {
completionHandler();
}]];
[self presentViewController:alertController animated:YES completion:^{}];
}
공식 문서 에서 더보기
세 가지 옵션 기능이 모두 구현 된 Swift 3 :
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping () -> Void) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
completionHandler()
}))
present(alertController, animated: true, completion: nil)
}
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping (Bool) -> Void) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
completionHandler(true)
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
completionHandler(false)
}))
present(alertController, animated: true, completion: nil)
}
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping (String?) -> Void) {
let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .actionSheet)
alertController.addTextField { (textField) in
textField.text = defaultText
}
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: { (action) in
if let text = alertController.textFields?.first?.text {
completionHandler(text)
} else {
completionHandler(defaultText)
}
}))
alertController.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
completionHandler(nil)
}))
present(alertController, animated: true, completion: nil)
}
조금만 확장 WKWebView
하려면 경고, 메시지를 표시하고 자신을 확인해야합니다. 다음이되어이를 수행하십시오 WKUIDelegate
.
#import <WebKit/WebKit.h>
@interface MyController : UIViewController<WKUIDelegate>
그런 다음 대리인을 지정합니다.
web.UIDelegate = self;
그런 다음 실제로 경고, 프롬프트 및 확인을 구현해야합니다. 쉬운 구현으로 WKWebViewPanelManager.h / m 을 만들었 으므로 다음 과 같이합니다.
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
[WKWebViewPanelManager presentAlertOnController:self.view.window.rootViewController title:@"Alert" message:message handler:completionHandler];
}
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler {
[WKWebViewPanelManager presentConfirmOnController:self.view.window.rootViewController title:@"Confirm" message:message handler:completionHandler];
}
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler {
[WKWebViewPanelManager presentPromptOnController:self.view.window.rootViewController title:@"Prompt" message:prompt defaultText:defaultText handler:completionHandler];
}
물론 잘못된 경고 / 확인 / 프롬프트 요청을 필터링하는 것은 사용자의 몫입니다.
And here's that in swift:
func webView(webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String,
initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alertController = UIAlertController(title: message,
message: nil,
preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel) {
_ in completionHandler()}
)
self.present(alertController, animated: true, completion: nil)
}
Here is the code in Swift 4.2
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String,
initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) {
let alertController = UIAlertController(title: message, message: nil,
preferredStyle: UIAlertController.Style.alert);
alertController.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel) {
_ in completionHandler()}
);
self.present(alertController, animated: true, completion: {});
}
- Implement the protocol to your WKWebview container controller. WKUIDelegate
Add preference to WKWebview to enable javascript in viewDidLoad() as.
// enable JS webView.configuration.preferences.javaScriptEnabled = true
Register WKWebview UI Delegate in viewDidLoad() as
self.webView.uiDelegate = self
Implement the below delegate in your class.
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void) { let alertController = UIAlertController(title: message,message: nil,preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .cancel) {_ in completionHandler()}) self.present(alertController, animated: true, completion: nil) }
ReferenceURL : https://stackoverflow.com/questions/26898941/ios-wkwebview-not-showing-javascript-alert-dialog
'Programing' 카테고리의 다른 글
양식 태그 심포니의 ID 속성 (0) | 2021.01.06 |
---|---|
"열에 비해 데이터가 너무 깁니다."-이유가 무엇입니까? (0) | 2021.01.06 |
Docker는 실행되지 않는 컨테이너에 연결할 수 없습니다. (0) | 2021.01.06 |
angular2의 data- * 속성에 바인딩하는 방법은 무엇입니까? (0) | 2021.01.06 |
React propTypes : objectOf 대 shape? (0) | 2021.01.06 |