如何在App Store更新应用后仅首次展示ViewController?
我来帮你完善这个更新后首次启动展示ViewController的实现方案~核心思路是通过NSUserDefaults记录用户上次打开应用的版本号,每次启动时对比当前版本与记录版本,判断是否为更新后的首次启动,进而触发目标ViewController的展示。
完整实现步骤
1. 先封装一个靠谱的版本号比较方法
直接用字符串对比版本号会有坑(比如"3.10"会被误认为小于"3.2"),所以先写一个能正确对比版本号的工具方法:
- (NSComparisonResult)compareVersion:(NSString *)version1 toVersion:(NSString *)version2 { NSArray *v1Components = [version1 componentsSeparatedByString:@"."]; NSArray *v2Components = [version2 componentsSeparatedByString:@"."]; NSUInteger maxCount = MAX(v1Components.count, v2Components.count); for (NSUInteger i = 0; i < maxCount; i++) { NSInteger num1 = (i < v1Components.count) ? [v1Components[i] integerValue] : 0; NSInteger num2 = (i < v2Components.count) ? [v2Components[i] integerValue] : 0; if (num1 > num2) return NSOrderedDescending; if (num1 < num2) return NSOrderedAscending; } return NSOrderedSame; }
2. 在应用启动时加入版本判断逻辑
你可以把这段代码放在AppDelegate的application:didFinishLaunchingWithOptions:方法里(如果是iOS13+用SceneDelegate,就放在scene:willConnectToSession:options:里):
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 获取当前应用版本号 NSString *currentVersion = NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"]; if (!currentVersion) currentVersion = @"1.0.0"; // 兜底处理 // 取出上次启动记录的版本号 NSString *lastLaunchedVersion = [NSUserDefaults.standardUserDefaults objectForKey:@"LastLaunchedAppVersion"]; // 判断是否是更新后首次启动:只有当旧版本存在且与当前版本不一致时才触发 if (lastLaunchedVersion && [self compareVersion:currentVersion toVersion:lastLaunchedVersion] != NSOrderedSame) { // 初始化并展示你的更新提示ViewController // 这里假设你用Storyboard创建VC,替换成你自己的Storyboard名称和VC标识符 UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UpdatePromptVC *updateVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"UpdatePromptVC"]; // 根据你的根控制器结构选择展示方式,这里用模态展示示例 UIWindow *window = self.window; [window.rootViewController presentViewController:updateVC animated:YES completion:nil]; } // 更新记录的版本号,确保下次启动时能正确判断 [NSUserDefaults.standardUserDefaults setObject:currentVersion forKey:@"LastLaunchedAppVersion"]; [NSUserDefaults.standardUserDefaults synchronize]; return YES; }
3. 几个关键注意点
- 如果你希望首次安装应用时也展示这个VC,可以去掉判断条件里的
lastLaunchedVersion &&,这样首次安装时(旧版本为nil)也会触发展示。 - 确保你的
UpdatePromptVC在Storyboard中设置了正确的Storyboard ID,如果是纯代码创建VC,就用[[UpdatePromptVC alloc] init]来初始化。 - 对于iOS13及以上的场景,记得把逻辑移到
SceneDelegate的对应方法中,因为AppDelegate的启动方法不再是唯一的入口。
内容的提问来源于stack exchange,提问作者pilou
相关产品推荐
相关产品推荐

