Проверьте, обновлено ли мое приложение IOS

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

Ответы

Ответ 1

Вы можете сохранить значение (например, номер версии текущего приложения) до NSUserDefaults и проверять его каждый раз, когда пользователь запускает приложение.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ...

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *currentAppVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
    NSString *previousVersion = [defaults objectForKey:@"appVersion"];
    if (!previousVersion) {
        // first launch

        // ...

        [defaults setObject:currentAppVersion forKey:@"appVersion"];
        [defaults synchronize];
    } else if ([previousVersion isEqualToString:currentAppVersion]) {
        // same version
    } else {
        // other version

        // ...

        [defaults setObject:currentAppVersion forKey:@"appVersion"];
        [defaults synchronize];
    }



    return YES;
}

версия выглядит так

let defaults = NSUserDefaults.standardUserDefaults()

let currentAppVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let previousVersion = defaults.stringForKey("appVersion")
if previousVersion == nil {
    // first launch
    defaults.setObject(currentAppVersion, forKey: "appVersion")
    defaults.synchronize()
} else if previousVersion == currentAppVersion {
    // same version
} else {
    // other version
    defaults.setObject(currentAppVersion, forKey: "appVersion")
    defaults.synchronize()
}

версия выглядит так:

let defaults = UserDefaults.standard

let currentAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let previousVersion = defaults.string(forKey: "appVersion")
if previousVersion == nil {
    // first launch
    defaults.set(currentAppVersion, forKey: "appVersion")
    defaults.synchronize()
} else if previousVersion == currentAppVersion {
    // same version
} else {
    // other version
    defaults.set(currentAppVersion, forKey: "appVersion")
    defaults.synchronize()
}

Ответ 2

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

Ответ 3

с важным улучшением над принятым ответом:

  • используя infoDictionary вместо objectForInfoDictionaryKey гарантирует, что результат не зависит от языка устройства, в противном случае вы можете оказаться в некоторых редких случаях, считая, что есть обновление, когда на самом деле это просто изменение языка устройства.
  • с использованием ключа UserDefaults, идентичного основному информационному документу Bundle, для ясности того, что точно хранится
  • Настройка факторинга currentVersion code
  • Синтаксис Swift 3

код:

    let standardUserDefaults = UserDefaults.standard
    let shortVersionKey = "CFBundleShortVersionString"
    let currentVersion = Bundle.main.infoDictionary![shortVersionKey] as! String
    let previousVersion = standardUserDefaults.object(forKey: shortVersionKey) as? String
    if previousVersion == currentVersion {
        // same version
    } else {
        // replace with `if let previousVersion = previousVersion {` if you need the exact value
        if previousVersion != nil {
            // new version
        } else {
            // first launch
        }
        standardUserDefaults.set(currentVersion, forKey: shortVersionKey)
        standardUserDefaults.synchronize()
    }

Ответ 4

Swift 3.x

Просто инициализируйте AppVersionUpdateNotifier при запуске приложения и соблюдайте протокол AppUpdateNotifier, наслаждайтесь.

class AppVersionUpdateNotifier {
    static let KEY_APP_VERSION = "key_app_version"
    static let shared = AppVersionUpdateNotifier()

    private let userDefault:UserDefaults
    private var delegate:AppUpdateNotifier?

    private init() {
        self.userDefault = UserDefaults.standard
    }

    func initNotifier(_ delegate:AppUpdateNotifier) {
        self.delegate = delegate
        checkVersionAndNotify()
    }

    private func checkVersionAndNotify() {
        let versionOfLastRun = userDefault.object(forKey: AppVersionUpdateNotifier.KEY_APP_VERSION) as? Int
        let currentVersion = Int(Bundle.main.buildVersion)!

        if versionOfLastRun == nil {
            // First start after installing the app
            delegate?.onFirstLaunch()
        } else if versionOfLastRun != currentVersion {
            // App was updated since last run
            delegate?.onVersionUpdate(newVersion: currentVersion, oldVersion: versionOfLastRun!)
        } else {
            // nothing changed

        }
        userDefault.set(currentVersion, forKey: AppVersionUpdateNotifier.KEY_APP_VERSION)
    }
}

protocol AppUpdateNotifier {
    func onFirstLaunch()
    func onVersionUpdate(newVersion:Int, oldVersion:Int)
}
extension Bundle {
    var shortVersion: String {
        return infoDictionary!["CFBundleShortVersionString"] as! String
    }
    var buildVersion: String {
        return infoDictionary!["CFBundleVersion"] as! String
    }
}
//*************************
//Use: Example
//*************************

extension AppDelegate: AppUpdateNotifier {
    func onVersionUpdate(newVersion: Int, oldVersion: Int) {
        // do something
    }

    func onFirstLaunch() {
        //do something
    }
}

Ответ 5

Вот простой код, чтобы узнать, отличается ли текущая версия (этот код работает и на симуляторе.)

-(BOOL) needsUpdate
{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

   if ([lookup[@"resultCount"] integerValue] == 1)
   {
       NSString* appStoreVersion = lookup[@"results"][0][@"version"];
       NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
       if (![appStoreVersion isEqualToString:currentVersion])
       {
           NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
           return YES;
       }
    }
    return NO;
}

Примечание. Убедитесь, что при вводе новой версии в iTunes это соответствует версии в приложении, которое вы выпускаете. Если нет, то указанный выше код всегда будет возвращать YES независимо от того, обновляется ли пользователь.

Ответ 6

Я думаю, что данные ответы хороши, когда вы работаете с небольшим приложением, но когда вы работаете с крупномасштабными приложениями для iOS с длинным планом развития, вам определенно нужно сильное футуристическое решение с такими преимуществами, как.

  1. Лучше сравнить логику, которая прекрасно работает со всеми возможностями (2.0/2.0.0 и т.д.).
  2. Примите конкретные меры во время миграции, предположите, когда пользователь мигрирует с версии 1.0 до 2.0 стихи 1.1 до 2.0.
  3. Сброс кэшированной версии, когда пользователь сбрасывает приложение (выход).

Ниже приведен фрагмент кода, который я использовал в одном из своих приложений для iOS.

public enum VersionConfigResponse {
    case freshInstalled
    case versionGreater
    case versionEqualOrLesser
    case currentVersionEmpty
}


/*
 Config manager responsible to handle the change needs to be done when user migrate from one Version to another Version.
 */
public class VersionConfig {

    public static let shared = VersionConfig()
    private init() { }
    private let versionKey = "SAVED_SHORT_VERSION_STRING"

    /*
     Cache the existing version for compare during next app launch.
     */
    private var storedVersion : String?  {
        get {
            return UserDefaults.standard.object(forKey: versionKey) as? String
        } set {
            UserDefaults.standard.set(newValue, forKey: versionKey)
            UserDefaults.standard.synchronize()
        }
    }

    /*
     Validate the current version with saved version, if greater do clean.
     */
    public func validate(currentVersion: String?) -> VersionConfigResponse  {
        guard let currentVersion = currentVersion else {
            return .currentVersionEmpty
        }

        guard let sVersion = storedVersion else {
            self.storedVersion = currentVersion
            self.freshInstalled()
            return .freshInstalled
        }

        if currentVersion.compare(sVersion, options: .numeric, range: nil, locale: nil) == .orderedDescending    {
            self.storedVersion = currentVersion
            self.userMigrated(fromVersion: sVersion, toVersion:currentVersion)
            return .versionGreater
        } else {
            return .versionEqualOrLesser
        }
    }

    private func userMigrated(fromVersion: String, toVersion: String)   {
        //take your action here...
    }

    private func freshInstalled()   {
        //take your action here...
    }

    /*
     Remove saved version if user reset(logout) the app.
     */
    public func reset() {
        self.storedVersion = nil
    }
}


//trigger version config with current version
VersionConfig.shared.validate(currentVersion: "1.0.0")

//reset when user logsout
VersionConfig.shared.reset()