Objective c iOS应用程序显示上次显示的视图,而不是闪屏-但只是有时

Objective c iOS应用程序显示上次显示的视图,而不是闪屏-但只是有时,objective-c,ios,splash-screen,Objective C,Ios,Splash Screen,有时,当我打开我的应用程序时(在休眠一段时间后恢复应用程序时,或在“退出”后打开应用程序时),基本上只显示“加载”的启动屏幕不会显示。应用程序显示退出应用程序之前的最后一次显示视图,而不是加载屏幕。这是不好的,因为它使应用程序看起来好像已经加载了,而它没有加载,而且它似乎没有响应,即使它只是加载。以前有人经历过类似的事情吗 编辑:我熟悉iOS的行为,它会在暂停时拍照并将其用作简历照片。然而,当应用程序退出(按home按钮,然后按home按钮两次,点击并按住应用程序图标,然后点击红色破折号并退出)

有时,当我打开我的应用程序时(在休眠一段时间后恢复应用程序时,或在“退出”后打开应用程序时),基本上只显示“加载”的启动屏幕不会显示。应用程序显示退出应用程序之前的最后一次显示视图,而不是加载屏幕。这是不好的,因为它使应用程序看起来好像已经加载了,而它没有加载,而且它似乎没有响应,即使它只是加载。以前有人经历过类似的事情吗


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

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

正如Caleb所说,您的应用程序正在挂起,但并未真正退出。若要在应用程序挂起时强制退出,请在ProductName Info.plist中将
UIApplicationExitsOnSuspend
设置为
YES

YES,该操作正常。每次你的应用程序进入暂停状态时,iOS都会截图,并在下次发布时将其用作发布图像,除非是新发布的。所以“或者在“退出”后打开它”似乎是不对的。如果真的发生了这种情况,那就意味着你的应用程序是而不是在你认为是的时候退出


无论如何,不管应用程序是从零开始启动还是从后台启动,你都应该尽快显示你的视图,给用户一些加载的通知,然后异步处理加载内容,不要让用户等待无响应的应用程序,希望它能很快工作。

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

当应用程序进入后台时,设备操作系统会创建快照屏幕映像,下面是您可以在应用程序“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];
}
在这里,我们将创建启动屏幕的快照。。只是在窗口中添加闪屏。当应用程序进入后台时


当应用程序出现在前台时删除快照

我不能这样做,因为我的应用程序依赖于后台功能-0.5,因为
UIApplicationExitsOnSuspend
从来都不是解决方案。