iOS应用程序在关闭后重新启动时的启动画面问题

7
当我杀掉我的iPhone应用程序并重新启动它时,我看到的是应用程序先前状态的图像,而不是启动图像。我该如何强制iOS始终显示启动图像?

你能随时观察启动图像吗? - kkocabiyik
是的。启动图像会在第一次运行时出现,但在杀死和重新启动后不会再出现。 - DataZombies
你是在调试模式下测试它还是部署到设备并断开与电脑的连接? - kkocabiyik
我正在部署到我的iPhone并与Mac断开连接。 - DataZombies
我认为这是一个系统级问题,等待一段时间后它会再次显示您的启动图像。 - kkocabiyik
您正在开发一个基于Cordova/PhoneGap的应用程序。 - codercat
5个回答

7
为了强制iOS使用其默认图像启动应用程序,请在实现状态保存的地方调用[[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch];
根据文档:
当您的应用程序重新启动时,系统会显示该快照图像以替换您的应用程序的默认启动图像,以保留您的应用程序仍在运行的概念。如果您认为快照无法正确反映应用程序在重新启动时的用户界面,则可以调用此方法以防止拍摄该快照图像。如果这样做,UIKit将使用您的应用程序的默认启动图像。
此外,查看这个问题以获得更多细节。

1
呃...我在我的applicationWillResignActive和applicationWillTerminate中加入了[application ignoreSnapshotOnNextApplicationLaunch];,但是没有起作用。 - DataZombies

5

ignoreSnapshotOnNextApplicationLaunch 方法将不会在应用程序未在状态恢复期间调用时被调用。

如果您的应用程序不支持多任务功能,即 UIApplicationExitsOnSuspend 键在其 Info.plist 中设置为 YES。建议的解决方案将无法工作。

对于我来说,我使用了以下代码:

applicationWillResignActive 用于当应用程序运行时,您双击 home 按钮调用多任务托盘的情况。启动画面将显示在应用程序屏幕上。它运行得非常完美。

applicationWillTerminate 不是每次都有效,因为该函数可能永远不会在某些阶段被调用。

- (void)applicationWillResignActive:(UIApplication *)application {

    NSLog(@"Application Did Resign Active");
    self.viewController.webView.hidden = YES;

    NSString *splashImage;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        splashImage = @"Default-Portrait~ipad.png";
    }
    else {
        splashImage = @"Default~iphone.png";
    }

    UIImageView *splash = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [splash setImage:[UIImage imageNamed:splashImage]];
    [self.window addSubview:splash];

}

- (void)applicationWillTerminate:(UIApplication *)application {

    NSLog(@"Application is Terminated");
    self.viewController.webView.hidden = YES;

    NSString *splashImage;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        splashImage = @"Default-Portrait~ipad.png";
    }
    else {
        splashImage = @"Default~iphone.png";
    }

    UIImageView *splash = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [splash setImage:[UIImage imageNamed:splashImage]];
    [self.window addSubview:splash];

}

除非您的应用程序在后台运行,否则将不会调用终止函数。 - CarmeloS
这个方法会在出现权限弹窗时触发,因此需要进行一些额外的检查...? - Ashwin G

1
Please follow this  -
-(void)applicationWillResignActive:(UIApplication *)application
{
    imageView = [[UIImageView alloc]initWithFrame:[self.window frame]];
    [imageView setImage:[UIImage imageNamed:@"Portrait(768x1024).png"]];
    [self.window addSubview:imageView];
}

Here to remove your imageview:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    if(imageView != nil) {
        [imageView removeFromSuperview];
        imageView = nil;
    }
}
It is working and tested many times.

这样做可以实现,但在 iOS 7 中使用多任务列表时会更改快照,这并不建议。 - CarmeloS

0

Swift 4.2

func applicationDidEnterBackground(_ application: UIApplication) {

        let imageView = UIImageView(frame: self.window!.bounds)
        imageView.tag = 25
        imageView.image = UIImage(named: <YOUR_SPLASH_SCREEN_IMG>)
        UIApplication.shared.keyWindow?.subviews.last?.addSubview(imageView)
}

func applicationWillEnterForeground(_ application: UIApplication) {

        if let imageView : UIImageView = UIApplication.shared.keyWindow?.subviews.last?.viewWithTag(25) as? UIImageView {
            imageView.removeFromSuperview()
        }

}

-1

针对我的当前项目,我想在应用程序关闭后强制重新启动。我将以下代码添加到应用程序的plist中:

Application does not run in background

为确保启动画面正确,我使用了上述建议:
- (void)applicationWillResignActive:(UIApplication *)application {
[[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch]; }

并且

- (void)applicationDidEnterBackground:(UIApplication *)application {
[[UIApplication sharedApplication] ignoreSnapshotOnNextApplicationLaunch]; }

它运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接