Проверьте, есть ли у моего приложения новая версия в AppStore - PullRequest
85 голосов
/ 06 июня 2011

Я хотел бы вручную проверить, есть ли новые обновления для моего приложения, пока пользователь в нем, и предложить ему загрузить новую версию.Могу ли я сделать это, проверяя версию моего приложения в магазине приложений - программно?

Ответы [ 24 ]

1 голос
/ 17 января 2018

Этот вопрос был задан в 2011 году, я нашел его в 2018 году, когда искал какой-то способ не только проверить новую версию приложения в App Store, но и уведомить об этом пользователя.

После небольшого исследования япришел к выводу, что ответ juanjo (связанный со Swift 3) https://stackoverflow.com/a/40939740/1218405 является оптимальным решением, если вы хотите сделать это в коде самостоятельно

Также я могу предложить два отличных проекта на GitHub (2300+ звезды каждый)

Примердля сирены (AppDelegate.swift)

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

      let siren = Siren.shared
      siren.checkVersion(checkType: .immediately)

      return true
    }
  • Вы также можете отображать различные типы предупреждений о новой версии (позволяя пропустить версию или вынудить пользователя обновить)
  • Вы можете указать, как часто должна проводиться проверка версии (ежедневно / еженедельно / немедленно)
  • Вы можете указать, через сколько дней после выхода новой версии в магазине должно появиться предупреждение
0 голосов
/ 05 апреля 2017

новая версия в AppStore

Свифт 3,0

func appUpdateAvailable() -> Bool
{
    let storeInfoURL: String = "http://itunes.apple.com/lookup?bundleId=YOURBUNDLEID"
    var upgradeAvailable = false
    // Get the main bundle of the app so that we can determine the app's version number
    let bundle = Bundle.main
    if let infoDictionary = bundle.infoDictionary {
        // The URL for this app on the iTunes store uses the Apple ID for the  This never changes, so it is a constant
        let urlOnAppStore = NSURL(string: storeInfoURL)
        if let dataInJSON = NSData(contentsOf: urlOnAppStore! as URL) {
            // Try to deserialize the JSON that we got
            if let dict: NSDictionary = try! JSONSerialization.jsonObject(with: dataInJSON as Data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: AnyObject] as NSDictionary? {
                if let results:NSArray = dict["results"] as? NSArray {
                        if let version = ((results[0] as! NSDictionary).value(forKey: "version")!) as? String {
                       // Get the version number of the current version installed on device
                                if let currentVersion = infoDictionary["CFBundleShortVersionString"] as? String {
                            // Check if they are the same. If not, an upgrade is available.
                            print("\(version)")
                            if version != currentVersion {
                                        upgradeAvailable = true
                            }
                        }
                    }
                }
            }
        }
    }
    return upgradeAvailable
}
0 голосов
/ 09 ноября 2016

Мой код предложения. Основано на ответах @datinc и @ Mario-Hendricks

Вы, конечно, должны заменить dlog_Error на вызов функции входа в систему.

Такая структура кода должна предотвращать сбой вашего приложения в случае ошибки. Для получения appStoreAppVersion не обязательно, и не должно привести к фатальным ошибкам. И все же, с такой структурой кода, вы по-прежнему будете регистрировать вашу нефатальную ошибку.

class func appStoreAppVersion() -> String?
{
    guard let bundleInfo = NSBundle.mainBundle().infoDictionary else {
        dlog_Error("Counldn't fetch bundleInfo.")
        return nil
    }
    let bundleId = bundleInfo[kCFBundleIdentifierKey as String] as! String
    // dbug__print("bundleId = \(bundleId)")

    let address = "http://itunes.apple.com/lookup?bundleId=\(bundleId)"
    // dbug__print("address = \(address)")

    guard let url = NSURLComponents.init(string: address)?.URL else {
        dlog_Error("Malformed internet address: \(address)")
        return nil
    }
    guard let data = NSData.init(contentsOfURL: url) else {
        if Util.isInternetAvailable() {
            dlog_MajorWarning("Web server request failed. Yet internet is reachable. Url was: \(address)")
        }// else: internet is unreachable. All ok. It is of course impossible to fetch the appStoreAppVersion like this.
        return nil
    }
    // dbug__print("data.length = \(data.length)")

    if data.length < 100 { //: We got 42 for a wrong address. And aproximately 4684 for a good response
        dlog_MajorWarning("Web server message is unexpectedly short: \(data.length) bytes")
    }

    guard let response = try? NSJSONSerialization.JSONObjectWithData(data, options: []) else {
        dlog_Error("Failed to parse server response.")
        return nil
    }
    guard let responseDic = response as? [String: AnyObject] else {
        dlog_Error("Not a dictionary keyed with strings. Response with unexpected format.")
        return nil
    }
    guard let resultCount = responseDic["resultCount"] else {
        dlog_Error("No resultCount found.")
        return nil
    }
    guard let count = resultCount as? Int else { //: Swift will handle NSNumber.integerValue
        dlog_Error("Server response resultCount is not an NSNumber.integer.")
        return nil
    }
    //:~ Determine how many results we got. There should be exactly one, but will be zero if the URL was wrong
    guard count == 1 else {
        dlog_Error("Server response resultCount=\(count), but was expected to be 1. URL (\(address)) must be wrong or something.")
        return nil
    }
    guard let rawResults = responseDic["results"] else {
        dlog_Error("Response does not contain a field called results. Results with unexpected format.")
        return nil
    }
    guard let resultsArray = rawResults as? [AnyObject] else {
        dlog_Error("Not an array of results. Results with unexpected format.")
        return nil
    }
    guard let resultsDic = resultsArray[0] as? [String: AnyObject] else {
        dlog_Error("Not a dictionary keyed with strings. Results with unexpected format.")
        return nil
    }
    guard let rawVersion = resultsDic["version"] else {
        dlog_Error("The key version is not part of the results")
        return nil
    }
    guard let versionStr = rawVersion as? String else {
        dlog_Error("Version is not a String")
        return nil
    }
    return versionStr.e_trimmed()
}

extension String {
    func e_trimmed() -> String
    {
        return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
    }
}
0 голосов
/ 21 июля 2017

Обновлено для Swift 3:

Если вы хотите проверить текущую версию вашего приложения, используйте ниже простой код:

 let object = Bundle.main.infoDictionary?["CFBundleShortVersionString"]

  let version = object as! String
  print("version: \(version)")
...