티스토리 뷰

반응형

Flutter 에서 PASS인증 붙이기 플러터[2025년 5월]

 

import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:get/get.dart';
import '../controllers/pass_controller.dart';

class PassPage extends StatelessWidget {
  final String authUrl = APIConstants.appPassUrl;
  final String callbackUrl = APIConstants.appPassSuccessUrl;
  final String callbackUrl2 = APIConstants.appPassFailUrl;

  @override
  Widget build(BuildContext context) {
    final PassController controller = Get.find();
    InAppWebViewController? popupWebViewController;

    return Scaffold(
      body: InAppWebView(
        initialUrlRequest: URLRequest(url: WebUri(authUrl)),
        initialSettings: InAppWebViewSettings(
          javaScriptEnabled: true,
          javaScriptCanOpenWindowsAutomatically: true, // 팝업 여부
          useWideViewPort: true,
          supportZoom: true,
          builtInZoomControls: true,
          displayZoomControls: false,
          supportMultipleWindows: true, // 팝업 허용
          transparentBackground: false,
          disableDefaultErrorPage: true,
        ),
        onWebViewCreated: (InAppWebViewController webViewController) {
          controller.webViewController = webViewController;
        },
        onCreateWindow: (controller, createWindowRequest) async {
          await showDialog(
            context: context,
            barrierDismissible: false,
            builder: (context) => Dialog(
              insetPadding: EdgeInsets.zero,
              backgroundColor: Colors.white,
              child: SizedBox(
                width: MediaQuery.of(context).size.width,
                height: MediaQuery.of(context).size.height,
                child: InAppWebView(
                  windowId: createWindowRequest.windowId,
                  initialSettings: InAppWebViewSettings(
                    javaScriptEnabled: true,
                  ),
                  onWebViewCreated: (InAppWebViewController webController) {
                    popupWebViewController = webController;
                  },
                  onLoadStop: (popupController, url) async {
                    if (url != null && url.toString().startsWith(callbackUrl)) {
                      final uri = Uri.parse(url.toString());

                      final html = await popupController.getHtml();

                      final name = extractValueByLabel(html!, '성명');
                      final birth = extractValueByLabel(html, '생년월일(YYYYMMDD)');
                      final phone = extractValueByLabel(html, '휴대폰번호');

                      Navigator.of(context).pop();
                    }
                  },
                ),
              ),
            ),
          );
          return true;
        },
        onLoadStop: (InAppWebViewController webViewController, Uri? url) {
          // 이곳은 팝업창에서는 안 들어옴
          if (url != null && url.toString().startsWith(callbackUrl)) {

          }
        },
      ),
    );
  }

  String? extractValueByLabel(String html, String label) {
    final regex = RegExp('<td>\\s*${RegExp.escape(label)}\\s*<\\/td>\\s*<td>([^<]*)<\\/td>', caseSensitive: false);
    final match = regex.firstMatch(html);
    return match?.group(1)?.trim();
  }
}

class PassController extends GetxController {
  // webViewController 변수 선언
  InAppWebViewController? webViewController;

  void handleAuthSuccess(String authToken) {
    print("인증 성공: $authToken");
    // TODO: 인증 토큰을 백엔드에 전달해 사용자 정보를 확인하세요.
  }

  void handleAuthFailure() {
    print("인증 실패");
    // TODO: 실패 처리 로직을 추가하세요.
  }
}
반응형

'Mobile > FLUTTER' 카테고리의 다른 글

Flutter 속도 개선 방법  (0) 2023.04.05
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함