kakao / kakao_flutter_sdk

Flutter SDK for Kakao Open API
Apache License 2.0
193 stars 70 forks source link

[Question] Flutter 하이브리드 앱 적용 #159

Closed cyb9701 closed 1 year ago

cyb9701 commented 1 year ago

문의 사항 (Question)

https://developers.kakao.com/docs/latest/ko/getting-started/sdk-js#ios-execute-kakaotalk 위 링크의 코드를 "AppDelegate.swift" 파일 안에 추가하면 될까요? 추가를 해도 오류가 발생을 합니다. 제거 iOS 코드를 잘 몰라서 적용하기가 힘드네요. 도와주시면 감사하겠습니다.

import UIKit
import Flutter
import flutter_local_notifications

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {

  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    // This is required to make any communication available in the action isolate.
    FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
        GeneratedPluginRegistrant.register(with: registry)
    }

    // flutter_local_notifications.
    if #available(iOS 10.0, *) {
      UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate
    }

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void ) {
        print(navigationAction.request.url?.absoluteString ?? "")

        // 카카오 SDK가 호출하는 커스텀 URL 스킴인 경우 open(_ url:) 메서드를 호출합니다.
        if let url = navigationAction.request.url , ["kakaolink"].contains(url.scheme) {

            // 카카오톡 실행 가능 여부 확인 후 실행
            if UIApplication.shared.canOpenURL(url) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }

            decisionHandler(.cancel) return
        }

        // 서비스에 필요한 나머지 로직을 구현합니다.
        decisionHandler(.allow)
    }
}

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    // 웹뷰 목록 관리
    var webViews = [WKWebView]()

    ...

    /// ---------- 팝업 열기 ----------
    /// - 카카오 JavaScript SDK의 로그인 기능은 popup을 이용합니다.
    /// - window.open() 호출 시 별도 팝업 webview가 생성되어야 합니다.
    ///
    func webView(_ webView: WKWebView,
                 createWebViewWith configuration: WKWebViewConfiguration,
                 for navigationAction: WKNavigationAction,
                 windowFeatures: WKWindowFeatures
    ) -> WKWebView? {
        guard let frame = self.webViews.last?.frame else {
            return nil
        }

        // 웹뷰를 생성하여 리턴하면 현재 웹뷰와 parent 관계가 형성됩니다.
        return createWebView(frame: frame, configuration: configuration)
    }

    /// ---------- 팝업 닫기 ----------
    /// - window.close()가 호출되면 앞에서 생성한 팝업 webview를 닫아야 합니다.
    ///
    func webViewDidClose(_ webView: WKWebView) {
        destroyCurrentWebView()
    }

    // 웹뷰 생성 메서드 예제
    func createWebView(frame: CGRect, configuration: WKWebViewConfiguration) -> WKWebView {
        let webView = WKWebView(frame: frame, configuration: configuration)

        // set delegate
        webView.uiDelegate = self
        webView.navigationDelegate = self

        // 화면에 추가
        self.view.addSubview(webView)

        // 웹뷰 목록에 추가
        self.webViews.append(webView)

        // 그 외 서비스 환경에 최적화된 뷰 설정하기

        return webView
    }

    // 웹뷰 삭제 메서드 예제
    func destroyCurrentWebView() {
        // 웹뷰 목록과 화면에서 제거하기
        self.webViews.popLast()?.removeFromSuperview()
    }

}
mbkim95 commented 1 year ago

@cyb9701

안녕하세요

해당 가이드는 A앱이 Android 네이티브 또는 iOS 네이티브(플러터 X)로 개발되었을 때 웹 뷰를 설정하는 방법에 대한 가이드입니다. 그런데 문의주신 내용을 확인해보면 A앱이 플러터로 개발되었다고해서 설정할 수 있는 방법은 크게 2가지가 있을 것으로 보입니다.

  1. 플러터에 웹 뷰를 추가하는 방법 flutter_inappwebview 등의 플러터 웹 뷰 플러그인을 사용하고(팝업을 지원하는 웹 뷰를 사용해야합니다), 해당 웹 뷰가 팝업을 띄울 수 있도록 설정하면 정상적으로 동작할 것으로 보입니다.

  2. Android, iOS 단에 웹 뷰 구현하고 각각 팝업을 허용해주는 방법 현재 구현하신 것처럼 직접 Android, iOS 쪽에 웹 뷰를 추가해서 구현하는 방법입니다. 그런데 Android, iOS 관련해서 얼마나 알고계신지 파악하기가 어려워 자세하게 설명드리기는 어려울 것 같아 플러터 코드만으로 구현할 수 있는 1번 방법이 좋을 것 같습니다.