バージョンアップの判定

インストール直後やバージョンアップ直後の起動時にだけ行ないたい処理があります。例えば、データ移行処理や初期値設定処理などです。


アプリのバンドルバージョンの取得は下記のコードで取得できます。

[[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleVersion"];


原始的ですが、前回のバンドルバージョンを保持しておき、毎回起動時にバンドルバージョンがアップされているかをチェックします。
ここでは前回のバージョンを簡易的にNSUserDefaultsに保持してます。

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

	//起動時にバージョンチェック
	NSUserDefaults *default = [NSUserDefaults standardUserDefaults];
	NSNumber *oldVersion = [default objectForKey:@"version"];
	NSUInteger iOldVersion = (oldVersion != nil) ? [oldVersion longLongValue] : 0;
	NSString *currentVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleVersion"];
	NSUInteger iVersion = [AppDelegate integerVersion:currentVersion];
	
	if (iOldVersion < iVersion) {
		//バージョンアップ時の処理 (初期設定やデータ移行等)

		//処理が正常に終了したらversionを保持
		[default setInteger:iVersion forKey:@"version"];
		[default synchronize];
	}

	:
}

/**
  比較しやすいように数値にする
  ver 1.2.3.4 => 1020304
*/
+ (NSUInteger)integerVersion:(NSString *)version {
	NSUInteger iVersion = 0;
	NSArray *verArray = [version componentsSeparatedByString:@"."];
	for (int i=0; i<verArray.count; i++) {
		NSString *ver = [verArray objectAtIndex:i];
		iVersion += [ver longLongValue] * ((NSUInteger)pow(100, (3-i)));
	}
	return iVersion;
}

※URLスキームを実装している場合は (BOOL)application: handleOpenURL: でも処理が必要になります。


余談ですが、iOSの起動処理で20秒を超えるとOSにフリーズしていると判断されkillされてしまうようです。
起動時の初期化処理で通信を使っている場合は非同期処理にするなどの対策が必要です。