iOS не получает точную версию приложения из iTunes - PullRequest
0 голосов
/ 12 сентября 2018

На самом деле Просто хотите реализовать функциональность, например, если новая версия приложения доступна в AppStore, тогда конечный пользователь будет уведомлен об обновлении приложения.

В Google так много ответов, но посмотрите ниже мой код.

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/in/lookup?bundleId=\(identifier)") else {
                throw VersionError.invalidBundleInfo
        }
        print(currentVersion)
        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]
                 if let a = ((json?["results"] as? [Any])?.first) as? [String: Any] {
                print(a["version"] as? String ?? "")
            }
                guard let result = (json?["results"] as? [Any])?.first as? [String: Any], let version = result["version"] as? String else {
                    throw VersionError.invalidResponse
                }
                completion(version != currentVersion, nil)
            } catch {
                completion(nil, error)
            }
        }
        task.resume()
        return task
    }

и вызов этой функции

 _ = try? appDelegate.isUpdateAvailable { (update, error) in
            if let error = error {
                print(error)
            } else if let update = update {
                if update {
                    let alert = UIAlertController(title: "New Version Available", message: "New version of application is available please update now!", preferredStyle: UIAlertControllerStyle.alert)
                    alert.addAction(UIAlertAction(title: "Update", style: .default, handler: { (actionOk) in

                        if let url = URL(string: "itms-apps://itunes.apple.com/app/idXXXXXXXXX"),
                            UIApplication.shared.canOpenURL(url){
                            UIApplication.shared.open(url, options: [:])
                        }
                    }))
                    self.present(alert, animated: true, completion: nil)
                }
            }
        }

Проблема в том, что если новая версия приложения готова к продаже, и я открываю старую версию приложения, то открывается всплывающее окно, и когда я нажимаю кнопку обновления, оно перенаправляет в AppStore. Но в AppStore вместо отображения кнопки «Обновить» отображается кнопка «Открыть»

Итак, я проверил свой код.

Когда я запускаю ниже URL вручную в браузере

http://itunes.apple.com/in/lookup?bundleId=com.mycompany.appname

Затем загрузите файл .txt и получите точную версию приложения. Но в моем коде print(a["version"] as? String ?? "") он возвращает неверный номер версии.

Куда я иду не так? Пожалуйста, поправьте меня.

ПРИМЕЧАНИЕ. Я также использовал http://itunes.apple.com/lookup?bundleId=com.mycompany.appname означает, что удалил код страны из URL, но у меня он не работал.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Это проблема головной боли для всех разработчиков iOS, чтобы определить версию приложения и уведомить пользователей о новом обновлении.КСТАТИ @ Cœur и @ Alexis O объяснил хорошо, поэтому я не думаю, чтобы объяснить больше.Просто следуйте моему коду.

Позвонив по указанному ниже URL, вы получите .txt файл

http://itunes.apple.com/in/lookup?bundleId=com.mycompany.appname

В этом файле вы также найдете currentVersionReleaseDate , использовать эти данные и время и сравнить с текущей датой и временем, если оно больше, чем 24 часа?тогда вы должны отобразить popup для обновления приложения.

Изменен ваш код:

if let a = ((json?["results"] as? [Any])?.first) as? [String: Any] {
                    print(a["version"] as? String ?? "")
                    let currentVersionDate = a["currentVersionReleaseDate"] as? String ?? ""
                    let dateFormatter = DateFormatter()
                    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
                    dateFormatter.locale = Locale(identifier: "en_US_POSIX")

                    if let myDate = dateFormatter.date(from: currentVersionDate) {
                        let diff = Calendar.current.dateComponents([.hour], from: myDate, to: Date()).hour ?? 0
                        if diff < 24 {
                            completion(false, nil)
                            return
                        }
                    }
                }

Изменен в Если выписка Проверьте это.

0 голосов
/ 20 сентября 2018

Вы можете попробовать это:

   func isAppUpdateAvailable() throws -> Bool {
        let yourAppleID = "12454364536" //This is demo id, you can get your apple id for a specific app from the appinformation tab of itunesconnect account 
        guard let info = Bundle.main.infoDictionary,
            let currentVersion = info["CFBundleShortVersionString"] as? String,
            let url = URL(string: "http://itunes.apple.com/lookup?id=\(yourAppleID)) else {
                throw VersionError.invalidBundleInfo
        }
        let data = try Data(contentsOf: url)
        guard let json = try JSONSerialization.jsonObject(with: data, options: [.allowFragments]) as? [String: Any] else {
            throw VersionError.invalidResponse
        }
        if let result = (json["results"] as? [Any])?.first as? [String: Any], let version = result["version"] as? String {
            print("version in app store", version,currentVersion);

            return version != currentVersion
        }
        throw VersionError.invalidResponse
    }

Это проверка для отправки его в appstore: // Это ваш appstore URL-адрес соответствующего приложения, вы можете указать свой URL-адрес appstore здесь

 let appStoreURl = "https://itunes.apple.com/sg/app/AppName/idXXXXXXXXXX?ls=1&mt=8"
 if let url = URL(string: appStoreURl),
                                UIApplication.shared.canOpenURL(url){
    UIApplication.shared.open(url, options: [:])
 }
0 голосов
/ 19 сентября 2018

Ваш код выглядит правильно.Как сказал Кер, Apple постепенно выпускает новое обновление, и оно не будет немедленным.Обновление обычно завершается через 24 часа.

Лично я не пойду с этим подходом.Лучше получить версию с вашего сервера, и вы можете обновить это значение через 24 часа после выхода приложения.Вы будете иметь больше контроля над этим.Возможно, ваше новое приложение содержит ошибки.Вы можете не предлагать своему пользователю обновить эту версию.

Боковой совет:

  • Убедитесь, что всплывающее окно отображается только один раз.
  • Не показывать всплывающее окно, если версия сервера ниже.Еще одна свобода поддержки «не» побуждает пользователя к обновлению.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...