iOS 应用程序显示最后显示的视图而不是启动屏幕 - 但仅有时

Posted

技术标签:

【中文标题】iOS 应用程序显示最后显示的视图而不是启动屏幕 - 但仅有时【英文标题】:iOS app shows last shown view instead of splash screen- but only sometimes 【发布时间】:2012-03-04 05:07:26 【问题描述】:

有时当我打开我的应用程序时(无论是在它休眠一段时间后恢复它,还是在它“退出”后打开它时),启动屏幕,基本上只是说“正在加载”,不会显示.该应用程序显示似乎是应用程序退出之前最后显示的视图,而不是加载屏幕。这很糟糕,因为它使应用程序似乎已加载,而实际上它没有加载,并且即使它只是加载,它似乎也没有响应。有没有人经历过这样的事情?

编辑:我熟悉 ios 的行为,它在暂停时拍照并将其用作恢复图片。然而,当应用程序退出(按下主页按钮,然后按两次主页按钮,点击并按住应用程序图标,然后点击红色破折号并退出它)并重新启动时,它不会使用启动画面屏幕在下次启动时仍然使用上次显示的视图。我可以强制应用始终使用启动画面吗?

【问题讨论】:

【参考方案1】:

问题的原因是我在 applicationWillTerminate: 上执行了一个长时间的操作,这将应用程序的“真正”终止延迟了一小段时间(我假设)。因此,当我在关闭应用程序后立即重新打开应用程序时,此操作(将数据写入磁盘)仍在进行中,因此应用程序并没有真正退出。这就是我认为可以推断出的问题。

【讨论】:

【参考方案2】:

您确定该应用确实正在启动而不是被暂停吗?您描述的行为听起来与已暂停并写入辅助存储的应用完全一样。

【讨论】:

【参考方案3】:

是的,这是按预期工作的。每次您的应用程序进入暂停状态时,iOS 都会截取屏幕截图并将其用作下次启动时的启动图像,除非它是全新启动。所以“或者在它'退出'后打开它”似乎不正确。如果确实发生了这种情况,则意味着您的应用没有在您认为退出的情况下退出。

无论如何,无论应用是从头启动还是从后台启动,您都应该始终尽快显示您的视图,给用户某种正在加载的通知,然后异步处理加载内容,而不是让用户等待无响应的应用程序,希望它很快就会工作。

【讨论】:

【参考方案4】:

就像 Caleb 所说,您的应用程序正在暂停,但并未真正退出。要在暂停时强制您的应用退出,请在 ProductName-Info.plist 中将 UIApplicationExitsOnSuspend 设置为 YES

【讨论】:

我不能这样做,因为我的应用依赖于后台功能 -0.5 因为UIApplicationExitsOnSuspend 永远不是解决方案。【参考方案5】:

当应用程序进入后台时,设备操作系统会创建快照屏幕图像,这是您可以在应用程序“AppData/Library/Caches/Snapshots/”的沙箱中找到的路径。

这是一个技巧,您可以在启动应用程序时阻止显示应用程序的最后一屏。

   // Create subclass of UIImageView



      @interface SnapShotImageView :UIImageView


        @end

        @implementation SnapShotImageView :UIImageView


        @end

    //  Create function in appdelegate.m

      - (void)createSnapshotWhileApplicationGoesInBackground

        NSString *splashImg = nil;
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
            splashImg= @"Default~ipad.png";
        
        else 
            splashImg= @"Default~iphone.png";
        
        UIWindow *win = [[UIApplication sharedApplication] keyWindow];
        SnapShotImageView *splash = [[SnapShotImageView alloc] initWithImage:[UIImage imageNamed:splashImg]];
        splash.frame = self.window.bounds;
        [win addSubview:splash];
    


    - (void)removeSnapshotFromWindow
        UIWindow *win = [[UIApplication sharedApplication] keyWindow];
        if ([[win subviews] count] > 1) 
            [NSThread sleepForTimeInterval:0.5];

            NSArray *array = [win subviews];

            [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 

                if ([obj isKindOfClass:[SnapShotImageView class]]) 
                     [obj removeFromSuperview];
                
            ];
        
    


 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
       [self removeSnapshotFromWindow];


//Call this function Application delegate method this way..
- (void)applicationDidEnterBackground:(UIApplication *)application 
    [self createSnapshotWhileApplicationGoesInBackground];


- (void)applicationWillEnterForeground:(UIApplication *)application
    [self removeSnapshotFromWindow];


- (void)applicationDidBecomeActive:(UIApplication *)application
    [self removeSnapshotFromWindow];

这里我们创建启动画面的快照.. 只是在窗口中添加启动画面。当应用程序进入后台时

并在应用程序进入前台时删除快照

【讨论】:

以上是关于iOS 应用程序显示最后显示的视图而不是启动屏幕 - 但仅有时的主要内容,如果未能解决你的问题,请参考以下文章

启动 iOS 应用程序时不显示最后一个屏幕

iOS 启动屏幕不显示

ios通用应用程序只显示3.5英寸屏幕而不是4英寸屏幕

如何在 iOS 8 上强制启动图像而不是启动屏幕?

尝试在 iOS 8 中以横向模式而不是纵向模式显示键盘

如何知道在后台后何时显示 UIViewController 视图?