ios - 检查应用程序更新时读取 json 错误

标签 ios swift

我使用以下代码来检查更新是否可用。但它给了我错误的版本号。因此,似乎有更新可用,但实际上没有。

enum VersionError: Error {
    case invalidResponse, invalidBundleInfo
}

static func isUpdateAvailable() throws -> Bool {
    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/tr/lookup?bundleId=\(identifier)") 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: \(version)")   //writes 1.1
        print("currentVersion: \(currentVersion)") //writes 1.1.1
        return version != currentVersion
    }
    throw VersionError.invalidResponse
}

我手动下载了该文件,版本号是1.1.1。本来应该如此。但代码给了我 1.1。我不知道出了什么问题。

顺便说一句,更新今天刚刚发布。我认为这应该与此无关。

网址:http://itunes.apple.com/tr/lookup?bundleId=com.sahin.lingustica

最佳答案

在您的方法中,比较两个版本字符串时存在比较问题,请使用此

version.compare(currentVersion, options: .numeric) == .orderedDescending ? true : false

我改变了你的方法试试这个

static func isUpdateAvailable() throws -> Bool {
    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/tr/lookup?bundleId=\(identifier)") 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: \(version)")   //writes 1.1
        print("currentVersion: \(currentVersion)") //writes 1.1.1
        rreturn version.compare(currentVersion, options: .numeric) == .orderedDescending ? true : false
    }
    throw VersionError.invalidResponse
}

关于ios - 检查应用程序更新时读取 json 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814346/

相关文章:

ios - 创建 swift 文件的副本

ios - 如何在swift 4中将按钮放在表格 View Controller 的前面?

iphone - NSNumber 的副本没有分配新内存

ios - 在 Swift 3 中将元数据添加到 AVPlayerItem

ios - 尽管在分配给变量之前进行了检查,但仍发现 nil

ios - 基于一对多值的NSPredicate过滤器

ios - Mapbox iOS SDK 3 - 点击注释时不显示注释标题

iphone - 游戏中3D模型动画的基本解释

swift - 使用 SwiftUI,有没有办法将 View 的大小限制为另一个非兄弟 View ?

ios - didSelectRowAt 不适用于我的 UITableViewController