Skip to content

Commit

Permalink
[Feat] AppStore에 올라간 정보를 받는 Endpoint 정의
Browse files Browse the repository at this point in the history
- 린트에 맞춰 수정
- 싱글톤 형태로 변경
  • Loading branch information
isakatty committed Jul 31, 2024
1 parent edffe09 commit f0ba96c
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 27 deletions.
55 changes: 32 additions & 23 deletions Projects/App/Sources/AppStoreCheck.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import UIKit

import Core
import Domain
import NetworkService

import RxSwift

Expand All @@ -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<String> {
return Single.create { single in
public func latestVersion() -> Single<String> {
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 {
Expand All @@ -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 }

Expand Down
9 changes: 5 additions & 4 deletions Projects/App/Sources/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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: ".")
Expand Down Expand Up @@ -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 {
Expand Down
45 changes: 45 additions & 0 deletions Projects/NetworkService/Sources/EndPoint/AppStoreEndPoint.swift
Original file line number Diff line number Diff line change
@@ -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
}
}

0 comments on commit f0ba96c

Please sign in to comment.