2013-06-03 11 views
15

が更新された後に再び表示されるようにアプリケーションが最初にインストールされたときにのみ表示されるビューを作成するには、 が必要なため、私のIOSアプリケーションが更新されているかどうかを確認

+2

あなたはこの質問について詳しく説明する必要があります:何が更新されていますか?アプリケーション内のファイルまたはファイル、またはリモートサーバーからダウンロードするファイル –

+0

アプリケーション自体が更新されています – user2412870

答えて

34

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() 
} 
+3

上記のメカニズムをサポートしていないアプリが既に出荷されているかどうかを確認しますか? – damithH

+3

@ damithH出荷されたアプリがNSUserDefaultsを使用していた場合は、使用していたキーの存在を確認するだけです。 –

6

NSUserDefaultsにアプリバージョン番号を保存し、アプリが起動するたびにチェックすることができます。番号が利用できない場合は、その新しいインストールです。それが変更された場合、それはアップグレードです。

+0

NSUserDefaultsが削除されていないので、ユーザがアプリケーションを最初に削除して再インストールすると、それが役に立たないので、それを読むと – user2412870

+1

@ user2412870バージョン番号がNSUserDefaultsに保存されている番号と似ているかどうかを確認することができます。 – pre

3

バージョン:

  • infoDictionaryの代わりにobjectForInfoDictionaryKeyを使用すると、デバイス言語に依存しない結果が保証されます。正確に何が格納されているかを明確にするためのメインバンドルinfoDictionaryへ
  • ファクタリング設定CurrentVersionのコード
  • スウィフト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() 
    } 
0

スウィフト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 

     } 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 
//************************* 

extention AppDelagate: AppUpdateNotifier { 
    func onVersionUpdate(newVersion: Int, oldVersion: Int) { 
     // do something 
    } 

    func onFirstLaunch() { 
     //do something 
    } 
} 
0

は、現在のバージョンが異なっているかどうかを知るための簡単なコードである

-(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を返します。

関連する問題