You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:02:29