ํฐ์คํ ๋ฆฌ ๋ทฐ
์ดํ์ ์คํํ ๋ ํน์ ๋ฒ์ ๋ณด๋ค ๋ฎ์ ๊ฒฝ์ฐ
์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ ๋ก ์๊ตฌํ๋ฉฐ ์ฑ์คํ ์ด๋ก ํ์ด์ง๋ฅผ ๋์ฐ๋๋ก ํ๋ ์์ ๊ตฌํ์ค ์๊ธด ๋ฌธ์ ์ ๋๋ค.
์ฒ์์ ๋ฒ์ ์ String ๋ฌธ์์ด์ ๋น๊ต ์ฐ์ฐ์๋ฅผ ํตํด ์์ ์ ํตํด ์ดํ ์ต์ ๋ฒ์ ๋ณด๋ค ๋์์ง ํ๋จํ์์ต๋๋ค.
๋ง์ฝ
ํ์ฌ ์ดํ ๋ฒ์ ์ด 1.0.9
์ดํ ์ต์ ๋ฒ์ 1.0.6
์ผ ๊ฒฝ์ฐ
"1.0.9" > "1.0.6" // true
์ด๋ฌ๋ฉด ํ์ฌ ๋ฒ์ ์ด ์ดํ ์ต์๋ฒ์ ๋ณด๋ค ๋๋ค๊ณ ํ๋จ๋์ด ์ ๋ฐ์ดํธ ํ์ง ์์๋ ๋ฉ๋๋ค.
ํ์ง๋ง ๋ง์ฝ
ํ์ฌ ์ดํ ๋ฒ์ ์ด "1.0.10" ์ผ ๊ฒฝ์ฐ
"1.0.10" > "1.0.6" // false
์ด๋ฐ์์ผ๋ก false ๊ฐ ๋๋ฏ๋ก ์ฑ์คํ ์ด๋ก ์ฐ๊ฒฐํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ฃผ๊ธฐ ์ํด์
'Compare' ๋ผ๋ String ๋ด๋ถ์ method๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://developer.apple.com/documentation/foundation/nsstring/1414082-compare
๋น๊ต ์ต์ ํ์ ์ numeric์ด๊ณ , ์ค๋ช ๊ธ์ Name2.txt < Name7.txt < Name25.txt ๋ฅผ ๋ณด๋ฉด
๋ฒ์ ๋น๊ต์ ์ ํฉํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ Compare๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๊ณ
์๋๋ ๋ฒ์ ์ ๊ฐ์ ธ์์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฐ์ ํ๋ ์ฝ๋์ ๋๋ค
(์ฐธ๊ณ ๋ก ์ ์ฝ๋์์๋ ์ ๋ฐ์ดํธ ์ต์ ๋ฒ์ ์ ์ฑ ์คํ ์ด์ ๋ฐฐํฌ๋์ด์๋ ๋ฒ์ ์ผ๋ก ํ์์ต๋๋ค)
-> ์ฑ์คํ ์ด์ ์ฌ๋ผ๊ฐ์๋ ๋ฒ์ ๋ณด๋ค ๋ฎ์ ๋ฒ์ ์ ์ฑ์ผ ๊ฒฝ์ฐ ์คํ์ ์ฑ์คํ ์ด๋ก ์ ๋ํ๋๋ก
import UIKit
enum VersionError: Error {
case invalidResponse, invalidBundleInfo
}
class AppVersionCheck {
static let shared = AppVersionCheck()
private init() { }
// ์ฝ๋์์ฑ
static func isUpdateAvailable(completion: @escaping (Bool?, Error?) -> Void) throws -> URLSessionDataTask {
guard let info = Bundle.main.infoDictionary,
let currentVersion = info["CFBundleShortVersionString"] as? String, // ํ์ฌ ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ
let identifier = info["CFBundleIdentifier"] as? String, // ์ฑ ๋ฒ๋ค์์ด๋ ๊ฐ์ ธ์ค๊ธฐ
let url = URL(string: "http://itunes.apple.com/kr/lookup?bundleId=\(identifier)") else {
throw VersionError.invalidBundleInfo
}
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
do {
if let error = error { throw error }
guard let data = data else { throw VersionError.invalidResponse }
let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any]
guard let result = (json?["results"] as? [Any])?.first as? [String: Any], let version = result["version"] as? String else {
throw VersionError.invalidResponse
} // ์ฑ์คํ ์ด ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ
let needUpdate = currentVersion.compare(version,options: .numeric) == .orderedAscending
completion(needUpdate, nil)
// true is needUpdate
// false is latest version
} catch {
completion(nil, error)
}
}
task.resume()
return task
}
// AppStore ์ด๋
static func appUpdate() {
let appId = "~~~~" // ์ฑ ์คํ ์ด์ ์ผ๋ฐ ์ ๋ณด์ Apple ID ์
๋ ฅ
// UIApplication ์ Main Thread ์์ ์ฒ๋ฆฌ
DispatchQueue.main.async {
if let url = URL(string: "https://apps.apple.com/kr/app/\(appId)"), UIApplication.shared.canOpenURL(url) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [:], completionHandler: {_ in
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
exit(0)
}
})
} else {
UIApplication.shared.openURL(url)
}
}
}
}
}
์ ๋ฐ์ดํธ ์ฌ๋ถ ํ์ธํ๋ ์ฝ๋์ ์ฑ์คํ ์ด๋ก ์ด๋ํ๋ ์ฝ๋์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋๋ ์ฌ์ฉ ์์์ ๋๋ค
func checkVersionTask() {
_ = try? AppVersionCheck.isUpdateAvailable { [weak self] (update, error) in
guard let self = self else { return }
if let error = error {
debugPrint("checkVersionTask err : \(error)")
return
} else if let update = update {
if update {
debugPrint("This App is old version")
DispatchQueue.main.async {
let alert = UIAlertController(title: "์
๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค", message: "", preferredStyle: UIAlertController.Style.alert)
let okAction = UIAlertAction(title: "ํ์ธ", style: .default, handler : { _ in
AppVersionCheck.appUpdate()
})
alert.addAction(okAction)
self.present(alert, animated: true, completion: nil)
}
return
} else {
debugPrint("This App is latest version")
// self.loginLogic()
return
}
}
}
}
old version ์ผ ๊ฒฝ์ฐ
Alert์ ๋์ฐ๊ณ ํ์ธ ๋ฒํผ์ ๋๋ฅผ ๊ฒฝ์ฐ appstore๋ก ๋ณด๋ด๋๋ก ํ์์ต๋๋ค.
latest version ์ผ ๊ฒฝ์ฐ
์์ฑํ loginLogic()์ด ๋์ํ๋๋ก ํ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
- Total
- Today
- Yesterday
- llm csv
- swift network module
- chatgpt rag llm
- swift urlsession ๊ณตํตํ
- llm pdf rag
- ์๋์ํํธ ๋ ์ด์ธ์ด
- rag ๊ธฐ๋ฐ llm ์ฑ๋ด
- swift queryitem encode
- ๋ ๋์ธ์ด
- swift ์๊ฐ
- ๋ ๋์ธ์ด ์ดํ
- swift urlsession module
- readysay
- swift urlcomponent encode
- swift ๋คํธ์ํฌ ๋ชจ๋ํ
- swift ์์ ์ฝ๊ธฐ
- swift get excel
- swift filemanager get excel
- deep timer
- swift urlsession refactoring
- rag ๊ธฐ๋ฐ llm
- filemanager excel read
- swift excel read
- swift network ๊ณตํตํ
- swift urlsession network module
- swift network refactoring
- focus timer ์ดํ
- swift ์์ ๊ฐ์ ธ์ค๊ธฐ
- rag llm pdf
- swift filemanager excel
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |