diff --git a/Projects/App/Sources/AppStoreCheck.swift b/Projects/App/Sources/AppStoreCheck.swift index 40bf2666..d7e9048d 100644 --- a/Projects/App/Sources/AppStoreCheck.swift +++ b/Projects/App/Sources/AppStoreCheck.swift @@ -9,6 +9,8 @@ import UIKit import Core +import Domain +import NetworkService import RxSwift @@ -19,43 +21,51 @@ enum AppStoreError: Error { case networkError(Error) } -public final class AppStoreCheck { - /// 앱스토어에 등록된 앱의 ID - static let appstoreID = Bundle.main - .object(forInfoDictionaryKey: "APPSTORE_ID") as? String +public final class DefaultAppStoreCheck { + static let shared = DefaultAppStoreCheck() - /// 앱스토어 연결 링크 - static let appStoreURLString + private let appstoreID: String? + + public let appStoreURLString = "itms-apps://itunes.apple.com/app/apple-store/" - private init() { } + private init() { + appstoreID = Bundle.main.object(forInfoDictionaryKey: "APPSTORE_ID") + as? String + } - /// 앱스토어에 등록된 최신 버전 가져오는 함수 - static public func latestVersion() -> Single { - return Single.create { single in + public func latestVersion() -> Single { + return Single.create { [weak self] single in + guard let self = self else { + single(.failure(AppStoreError.invalidURL)) + return Disposables.create() + } Task { do { - guard let appstoreID = AppStoreCheck.appstoreID else { - throw AppStoreError.invalidURL - } - let urlString = "https://itunes.apple.com/lookup?id=\(appstoreID)&country=kr" - guard let url = URL(string: urlString) else { + guard let appstoreID = self.appstoreID, + let urlRequest = AppStoreEndPoint( + appStoreID: appstoreID).toURLRequest + else { throw AppStoreError.invalidURL } - + let (data, _) = try await URLSession - .shared.data(for: URLRequest(url: url)) + .shared.data(for: urlRequest) + let json = try JSONSerialization.jsonObject( with: data, options: .allowFragments ) as? [String: Any] - + guard let results = json?["results"] as? [[String: Any]], - let appStoreVersion = results.first?["version"] - as? String else { + let appStoreVersion = results.first?["version"] + as? String + else { throw AppStoreError.parsingError } + single(.success(appStoreVersion)) + } catch let error as AppStoreError { single(.failure(error)) } catch { @@ -65,12 +75,11 @@ public final class AppStoreCheck { return Disposables.create() } } - /// URL을 통해 앱스토어 오픈 - static public func openAppStore() { + public func openAppStore() { guard let appstoreID, let url = URL( - string: AppStoreCheck.appStoreURLString + appstoreID + string: appStoreURLString + appstoreID ) else { return } diff --git a/Projects/App/Sources/SceneDelegate.swift b/Projects/App/Sources/SceneDelegate.swift index 8502dd57..8d4d67e2 100644 --- a/Projects/App/Sources/SceneDelegate.swift +++ b/Projects/App/Sources/SceneDelegate.swift @@ -73,7 +73,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { } private func checkAndUpdateIfNeeded() { - AppStoreCheck.latestVersion() + DefaultAppStoreCheck.shared.latestVersion() .observe(on: MainScheduler.instance) .subscribe(onSuccess: { version in let splitMarketingVersion = version.split(separator: ".") @@ -106,9 +106,10 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate { let alertAction = UIAlertAction( title: "업데이트", - style: .default) { _ in - AppStoreCheck.openAppStore() - } + style: .default + ) { _ in + DefaultAppStoreCheck.shared.openAppStore() + } alert.addAction(alertAction) DispatchQueue.main.async { diff --git a/Projects/NetworkService/Sources/EndPoint/AppStoreEndPoint.swift b/Projects/NetworkService/Sources/EndPoint/AppStoreEndPoint.swift new file mode 100644 index 00000000..35a78f27 --- /dev/null +++ b/Projects/NetworkService/Sources/EndPoint/AppStoreEndPoint.swift @@ -0,0 +1,45 @@ +// +// AppStoreEndPoint.swift +// NetworkService +// +// Created by Jisoo HAM on 7/31/24. +// Copyright © 2024 Pepsi-Club. All rights reserved. +// + +import Foundation + +public struct AppStoreEndPoint: EndPoint { + private let appStoreID: String + + public var scheme: Scheme { + return .https + } + public var host: String { + return "itunes.apple.com" + } + public var port: String { + "" + } + public var path: String { + return "/lookup" + } + public var query: [String: String] { + return [ + "id": appStoreID, + "country": "kr" + ] + } + public var header: [String: String] { + return [:] + } + public var body: [String: Any] { + return [:] + } + public var method: HTTPMethod { + return .get + } + + public init(appStoreID: String) { + self.appStoreID = appStoreID + } +}