webview_flutter로 alert/confirm 띄우기 (iOS) 개발/Flutter2021. 11. 11. 11:58
이전에도 비슷한 주제로 글을 작성한 적이 있었는데 이번엔 해결법이 약간 다르다.
(이전 글 : https://risha-lee.tistory.com/40)
이번에는 상황이 Confirm 종류도 많았고,
그냥 웹뷰를 보여주는 앱이었으며
웹은 이미 작성된지 오래된 상태였고
Confirm 이후 분기 처리도 꽤 복잡한 편이어서 꼭 웹의 Confirm 기능을 써야만 했다.
일단 Android는 webview_flutter를 2.0.13으로 버전 업하니 alert가 기본으로 작동하게 되었는데
iOS에서는 여전히 alert/confirm이 안뜨는 문제가 있었다.
찾아보니 역시나 webview_flutter 자체 지원은 안되고 파일 업로드 때 처럼 직접 소스 코드를 수정하기로 하였다.
1. 먼저 webview_flutter가 저장되는 위치를 찾는다.
나는 mac 환경이고 webview_flutter 버전은 2.0.13을 사용하였기 때문에
/Users/${userId}/.pub-cache/hosted/pub.dartlang.org/webview_flutter-2.0.13
여기에 저장되어 있었다.
2. webview_flutter-2.0.13/ios/Classes/FlutterWebView.m 의 맨 하단 @end 이전에
다음을 추가한다.
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler();
}])];
UIViewController *_viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[_viewController presentViewController:alertController animated:YES completion:nil];
}
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
// DLOG(@"msg = %@ frmae = %@",message,frame);
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:([UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
completionHandler(NO);
}])];
[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
completionHandler(YES);
}])];
UIViewController *_viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[_viewController presentViewController:alertController animated:YES completion:nil];
}
runJavaScriptTextInputPanelWithPrompt라고 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?:@"");
}])];
UIViewController *_viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[_viewController presentViewController:alertController animated:YES completion:nil];
}
참고 출처 : https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/695084/
https://stackoverflow.com/questions/6131205/how-to-find-topmost-view-controller-on-ios
'개발 > Flutter' 카테고리의 다른 글
Flutter에서 TextField의 "붙여넣기" 도구 설명 이름을 한국어로 변경하는 방법 (0) | 2022.01.27 |
---|---|
Flutter에서 new_version으로 업데이트 체크 시 Bad state: No element 오류 해결 (Android) (0) | 2021.12.27 |
webview_flutter로 file upload하기 (Android) (0) | 2021.11.09 |
Flutter에서 webview_flutter alert 안 보일 때 처리 법(toast로 표시) (0) | 2021.09.03 |
Flutter에서 카카오톡 채널 추가하기 (9) | 2021.08.12 |