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