header-bleepy-logo

DEVELOPERS

KO

시작하기

webview example image

간편하게 웹뷰 URL 호출만으로 런처를 실행하고 Client Admin에서 프로모션을 생성하여 발급받은 Secret Key에 연동된 게임을 실행합니다. 웹뷰를 구성하여 게임을 실행하고 등록한 프로모션을 진행해보세요.


WebView 구성하기

IOS 가이드 문서는 swift UIKit을 기준으로 작성되었습니다.
  • Swift UI 사용

    * Objective-C 형태의 가이드는 제공되지 않습니다.

  • 세로모드 고정

    * 런처 화면은 세로모드만 지원하므로 화면이 세로모드로 고정되어야 합니다.

    * 아래와 같은 세로모드 잠금 기능이 추가되었습니다.

swift
// blp_sample_app_iosApp.swift import SwiftUI @main struct blp_sample_app_iosApp: App { // 앱 세로모드 잠금 처리 @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView() } } } class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return .portrait } }

1단계: 최상위 ContentView 파일 생성

최상위 ContentView 파일에 1개의 NavigationStack 을 두고 하위 View들을 컨트롤 합니다.

클라이언트의 기본 앱 화면을 HomeContentView 라고 가정 하였으며, navigationDestination 를 통해 블리피 런처화면을 보여줄 LauncherContentView 화면으로 이동할 케이스를 선언하였습니다.

swift
// ContentView.swift import SwiftUI // 최상위 View struct ContentView: View { @StateObject private var navigationModel = NavigationModel() var body: some View { NavigationStack(path: $navigationModel.path) { HomeContentView(navigationModel: navigationModel) .navigationDestination(for: NavigationDestination.self) { destination in switch destination { case .launcher: // 런처 화면 LauncherContentView(navigationModel: navigationModel) } } } } } #Preview { ContentView() }

Navigation 전환을 위해 선언한 기본적인 NavigationModel 클래스 파일입니다.

swift
// NavigationModel.swift import Foundation // 화면 전환 case들 (ContentView) enum NavigationDestination: String, Identifiable { case launcher var id: String { rawValue } } class NavigationModel: ObservableObject { @Published var path: [NavigationDestination] = [] }

2단계 : 블리피 런처 WebView 파일 생성

블리피 런처는 Web URL 형태로 제공되기 때문에 런처를 띄울 WebView 구조체가 필요합니다.

  • 런처 내 뒤로가기 버튼이 존재하기 때문에 closeLauncher 라는 이벤트 처리가 추가로 필요합니다.

  • Coordinator 클래스 내 userContentController 에서 script 메세지를 핸들링 하는 로직이 추가됩니다.

swift
// LauncherWebView.swift import WebKit import SwiftUI // UIViewRepresentable를 사용하여 WKWebView를 wrapping해서 사용 struct LauncherWebView: UIViewRepresentable { let url: URL // 뒤로가기 처리 let onCloseLauncher: () -> Void class Coordinator: NSObject, WKNavigationDelegate, WKScriptMessageHandler { var parent: LauncherWebView init(parent: LauncherWebView) { self.parent = parent } func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { // WebView finished loading } func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { // 런처 뒤로가기 이벤트 수신 시 처리 if message.name == "closeLauncher" { parent.onCloseLauncher() } } } func makeCoordinator() -> Coordinator { Coordinator(parent: self) } func makeUIView(context: Context) -> WKWebView { let webView = WKWebView() let contentController = webView.configuration.userContentController // javascript에서 전달하는 이벤트 등록 contentController.add(context.coordinator, name: "closeLauncher") webView.navigationDelegate = context.coordinator let request = URLRequest(url: url) webView.load(request) return webView } func updateUIView(_ webView: WKWebView, context: Context) { // } static func dismantleUIView(_ uiView: WKWebView, coordinator: Self.Coordinator) { uiView.configuration.userContentController.removeScriptMessageHandler(forName: "closeLauncher") } }

3단계 : 블리피 런처 ContentView 파일 생성

블리피 런처를 보여줄 LauncherContentView 파일을 생성합니다.

  • LauncherContentView 구조체를 선언합니다.

  • body 내 블리피 런처가 로드될 WebView 를 선언합니다.

    * 2단계에서 선언된 LauncherWebView 구조체를 사용합니다.

    * 런처 URL 을 로드합니다.

  • 런처 뒤로가기 이벤트 처리를 위한 handleCloseLauncher 를 구현합니다.

swift
// LauncherContentView.swift import SwiftUI import WebKit struct LauncherContentView: View { // navigation model observer @ObservedObject var navigationModel: NavigationModel var body: some View { LauncherWebView( url: URL(string: "런처 URL 정보"), onCloseLauncher: { // 런처 뒤로가기 처리 handleCloseLauncher() }, ) .navigationBarBackButtonHidden(true) } // 뒤로가기 처리 private func handleCloseLauncher() { navigationModel.path.removeLast() } } #Preview { LauncherContentView(navigationModel: NavigationModel()) }

개발에 대한 추가 설명이 더 필요하신가요?

"[Client Admin] 로그인 → 오른쪽 하단 채널톡 위젯" 클릭 후 개발 카테고리에 문의 남겨주시면 기술 개발팀에서 확인 후 연락드리겠습니다.


v1.0.6