Проверьте, обновлено ли мое приложение 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;
}
swift-2 версия выглядит так
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()
}
swift-3 версия выглядит так:
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
swift с важным улучшением над принятым ответом:
- используя
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 с длинным планом развития, вам определенно нужно сильное футуристическое решение с такими преимуществами, как.
- Лучше сравнить логику, которая прекрасно работает со всеми возможностями (2.0/2.0.0 и т.д.).
- Примите конкретные меры во время миграции, предположите, когда пользователь мигрирует с версии 1.0 до 2.0 стихи 1.1 до 2.0.
- Сброс кэшированной версии, когда пользователь сбрасывает приложение (выход).
Ниже приведен фрагмент кода, который я использовал в одном из своих приложений для 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()