[swift] Swift PromiseKit와 앱 내 웹 브라우저 기능 구현 방법

앱 개발에서 종종 비동기 작업이 필요한 경우가 많습니다. 이러한 상황에서 Promise 패턴을 사용하면 비동기 작업을 보다 쉽게 처리할 수 있습니다. Swift에서 Promise 패턴을 구현하고 사용하기 위해 PromiseKit이라는 라이브러리를 사용할 수 있습니다. 이번 포스트에서는 Swift PromiseKit을 사용하여 앱 내에 웹 브라우저 기능을 구현하는 방법에 대해 알아보겠습니다.

1. PromiseKit 설치하기

PromiseKit은 CocoaPods나 Carthage를 통해 설치할 수 있습니다. 이번 예제에서는 CocoaPods를 사용하겠습니다.

먼저, Podfile 파일을 생성하고 아래의 내용을 추가합니다.

platform :ios, '11.0'
use_frameworks!

target 'YourApp' do
  pod 'PromiseKit'
end

터미널을 열고 프로젝트 위치로 이동한 후, 아래의 명령어를 실행합니다.

$ pod install

이제 PromiseKit이 설치되어 사용할 준비가 되었습니다.

2. WebView 기능 추가하기

웹 브라우저 기능을 구현하기 위해, 먼저 WebView를 추가해야 합니다. 이를 위해 WKWebView를 사용하도록 하겠습니다.

먼저, ViewController.swift 파일을 열고 아래의 내용을 추가합니다.

import UIKit
import WebKit
import PromiseKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // 웹 페이지 로드하기
    func loadWebPage(url: URL) -> Promise<Void> {
        let promise = Promise<Void> { seal in
            let request = URLRequest(url: url)
            webView.load(request)
            
            webView.navigationDelegate = self
            seal.fulfill(())
        }
        
        return promise
    }

}

extension ViewController: WKNavigationDelegate {

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // 웹 페이지 로딩이 완료되었을 때 호출되는 메서드
        print("Web page loaded successfully")
    }

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        // 웹 페이지 로딩 실패시 호출되는 메서드
        print("Web page loading failed: \(error.localizedDescription)")
        
    }

}

위의 예제 코드에서는 ViewController 클래스 내에 loadWebPage 메서드를 추가하여 웹 페이지를 로드하는 비동기 작업을 구현했습니다. 이 메서드는 Promise를 반환하며, 웹 페이지 로딩이 완료되면 fulfill을 호출하여 작업이 완료되었음을 알립니다. 또한, WKWebViewDelegate를 채택한 확장(extension)을 통해 웹 페이지 로딩이 성공 및 실패한 경우에 대한 처리도 추가했습니다.

3. 웹 페이지 로드하기

이제, 앱에서 웹 페이지를 로드하는 기능을 사용해보겠습니다.

먼저, Main.storyboard 파일을 열고 웹 뷰를 추가합니다. 이후에는 Assistant Editor를 열고 웹 뷰를 ViewController.swift 파일에 연결합니다.

이제 ViewController에서 다음의 코드를 추가합니다.

import UIKit
import WebKit
import PromiseKit

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = URL(string: "https://www.example.com")!
        
        loadWebPage(url: url)
            .done { _ in
                print("Web page loaded successfully")
            }
            .catch { error in
                print("Web page loading failed: \(error.localizedDescription)")
            }
    }
    
    // ...

}

위의 예제 코드에서는 ViewController의 viewDidLoad() 메서드 내에서 loadWebPage 메서드를 호출하여 웹 페이지 로드를 시작합니다. PromiseKit의 done과 catch 메서드를 사용하여 웹 페이지 로드 성공 및 실패에 대한 처리를 구현했습니다.

4. 실행 및 디버깅

이제 앱을 실행하고 웹 페이지가 성공적으로 로드되는지 확인할 수 있습니다. 웹 페이지 로드가 성공하거나 실패한 경우, 콘솔에 메시지가 출력됩니다.

결론

이번 포스트에서는 Swift PromiseKit을 사용하여 앱 내에 웹 브라우저 기능을 구현하는 방법에 대해 알아보았습니다. Promise 패턴을 사용하면 비동기 작업을 보다 쉽게 처리할 수 있고, PromiseKit은 이를 구현하기 위한 간편한 도구를 제공합니다. 웹 브라우저 기능 외에도 Promise 패턴을 활용하여 다양한 비동기 작업을 구현할 수 있으니, 앞으로의 앱 개발에서 PromiseKit을 활용해보시기 바랍니다.

참고 자료