TGViewer
iOS Dev iOS Dev @iosdev · 7.93K subscribers
Post #1325 4.41K
Способы проверки доступности новой версии приложения в 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
}
}


Если вы знаете другие способы (может быть, более элегантные), поделитесь, пожалуйста, в комментариях.

😃 iOS Dev
  • 👍 10
  • 🔥 6
  • ✍ 2
  • 👏 2
  • 👌 1
  • 🏆 1
  • 🎄 1
  • 🆒 1
More from @iosdev
  1. Oct 9, 2026Эффект премиальной банковской карты с помощью SwiftUI и Metal Такая красота часто встречае…
  2. Oct 9, 2026Итеративная загрузка данных в Swift Хотя одновременное выполнение десятков асинхронных зап…
  3. Oct 8, 2026Мультиагентность: следующий шаг в разработке или лишняя сложность? AI-агенты уже умеют пис…
  4. Oct 8, 2026Продвинутые техники работы с макросами в Swift Владение макросами позволяет автоматизирова…
  5. Oct 7, 2026Работа с модальными экранами на iPhone Duo На iPhone Duo всплывающие окна могут выглядеть…
  6. Oct 6, 2026⚡️ Apple обязали всех делать поддержку iPhone Duo с апреля 2027 года Сегодня выкатили обно…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →