tg-me.com/iosdev/1325
Last Update:
Способы проверки доступности новой версии приложения в AppStore
У многих пользователей может быть выключена опция автообновления, но часто нам необходимо как-то сообщить, что наше приложение пора обновлять. Что делать?
Пол Пиелла делится двумя популярными способами в своей статье:
1. Использовать iTunes Lookup:
Вариант, который можно использовать не только для получения версии, но и для других параметров.
import Foundation
struct LookUpResponse: Decodable {
let results: [LookUpResult]
struct LookUpResult: Decodable {
let version: String
let minimumOsVersion: String
let trackViewUrl: URL
}
}
struct LatestAppStoreVersion {
let version: String
let minimumOsVersion: String
let upgradeURL: URL
}
final class LookUpAPI {
private let session: URLSession
private let jsonDecoder: JSONDecoder
init(session: URLSession = .shared, jsonDecoder: JSONDecoder = .init()) {
self.session = session
self.jsonDecoder = jsonDecoder
}
func getLatestAvailableVersion(for appID: String) async throws -> LatestAppStoreVersion? {
let url = URL(string: "https://itunes.apple.com/lookup?appId=\(appID)")!
let request = URLRequest(url: url)
let (data, _) = try await session.data(for: request)
let response = try jsonDecoder.decode(LookUpResponse.self, from: data)
print(response)
return response.results.first.map {
.init(version: $0.version,
minimumOsVersion: $0.minimumOsVersion,
upgradeURL: $0.trackViewUrl)
}
}
}
2. Использовать App Store Connect API
Можно использовать свою обёртку или использовать SDK, которую, например, я применил для Starly.
3. От себя бы я добавил, что весьма популярный способ — держать файл с обновлениями где-то ещё (или иметь собственное API для запроса актуальной версии в сторе).
4. Можно использовать ещё Firebase Remote Config (по сути повторение третьего способа, просто от Google).
После того, как мы получим данные приложения, сравнить новую версию можно с локальной:
extension LatestAppStoreVersion {
var shouldUpdate: Bool {
guard let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
return false
}
let systemVersion = ProcessInfo().operatingSystemVersion
let versionString = "\(systemVersion.majorVersion).\(systemVersion.minorVersion).\(systemVersion.patchVersion)"
let isRemoteVersionHigherThanLocal = currentVersion.compare(self.version, options: .numeric) == .orderedAscending
let isSystemVersionAllowed = versionString.compare(self.minimumOsVersion, options: .numeric) == .orderedDescending
return isRemoteVersionHigherThanLocal && isSystemVersionAllowed
}
}
Если вы знаете другие способы (может быть, более элегантные), поделитесь, пожалуйста, в комментариях.