개발
RxSwift로 앱 버전체크 API 통신 로직 만들기
한번사는인생~키야
2024. 7. 9. 13:00
728x90
RxSwift를 사용한 앱 버전 체크 API 통신 로직 구현
RxSwift를 사용하여 앱 버전 체크 API 통신 로직을 간편하고 효율적으로 구현하는 방법은 다음과 같습니다.
1. API 정의 및 모델링
- 앱 버전 체크 API의 엔드포인트, 요청 및 응답 형식을 정의합니다.
- 필요한 경우 API 모델을 생성하여 응답 데이터를 구조화합니다.
2. ViewModel 설정
- ViewModel클래스를 만들고 앱 버전 체크 관련 속성과 메서드를 정의합니다.
- RxSwift의 Observable을 사용하여 API 통신 로직을 구현하고, 응답 데이터를 처리합니다.
import RxSwift
import Moya
import Alamofire
enum AppVersionCheckResult {
case newVersionAvailable(String) // 새로운 버전 정보
case currentVersionUpToDate // 현재 버전이 최신 버전
case error(Error) // 오류 발생
}
class AppVersionCheckViewModel {
let appVersionCheckResult = PublishSubject<AppVersionCheckResult>()
private let provider: MoyaProvider<AppVersionCheckAPI>
init(provider: MoyaProvider<AppVersionCheckAPI>) {
self.provider = provider
}
func checkAppVersion() {
provider.request(.checkVersion)
.asObservable()
.map { response -> AppVersionCheckResult in
switch response.result {
case .success(let value):
if let appVersionInfo = try? value.map(to: AppVersionInfo.self) {
if appVersionInfo.version > Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "" {
return .newVersionAvailable(appVersionInfo.version)
} else {
return .currentVersionUpToDate
}
} else {
return .error(NSError(domain: "AppVersionCheckError", code: 101, userInfo: nil))
}
case .failure(let error):
return .error(error)
}
}
.subscribe(onNext: { [weak self] result in
self?.appVersionCheckResult.onNext(result)
})
.disposed(by: disposeBag)
}
}
3. UI 업데이트 및 로직 처리
- ViewController에서 ViewModel의 appVersionCheckResult Observable을 구독하고, API 응답 결과에 따라 UI를 업데이트하거나 로직을 처리합니다.
class AppVersionCheckViewController: UIViewController {
private let viewModel = AppVersionCheckViewModel(provider: MoyaProvider<AppVersionCheckAPI>())
private let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
setupBindings()
}
private func setupBindings() {
viewModel.appVersionCheckResult
.subscribe(onNext: { [weak self] result in
switch result {
case .newVersionAvailable(let version):
self?.showNewVersionAlert(version: version)
case .currentVersionUpToDate:
print("현재 버전이 최신 버전입니다.")
case .error(let error):
print("앱 버전 체크 오류: \(error.localizedDescription)")
}
})
.disposed(by: disposeBag)
// 버튼 클릭 시 버전 체크 수행
versionCheckButton.rx.tap
.subscribe(onNext: { [weak self] in
self?.viewModel.checkAppVersion()
})
.disposed(by: disposeBag)
}
private func showNewVersionAlert(version: String) {
let alert = UIAlertController(title: "새로운 버전 출시", message: "버전 \(version)이 출시되었습니다. 지금 업데이트하시겠습니까?", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "업데이트", style: .default, handler: { _ in
// 업데이트 페이지로 이동
}))
alert.addAction(UIAlertAction(title: "나중에", style: .cancel, handler: nil))
present(alert, animated: true)
}
}
4. API 통신 라이브러리 설정
- Moya 또는 Alamofire과 같은 API 통신 라이브러리를 사용하여 API 요청 및 응답 처리를 수행합니다.