2012-03-04 150 views
1

有时,当我打开我的应用程序(或者在它休眠一段时间后恢复它,或者在它已经'退出'后打开它时,恢复它),飞溅屏幕,基本上只是说'加载',不显示。该应用程序显示应用程序退出前的最后显示视图,而不是加载屏幕。这很糟糕,因为它显示应用程序在没有时加载,并且它看起来像没有响应,即使它只是加载。有没有人经历过这样的事情?iOS应用程序显示上次显示的视图,而不是启动画面 - 但有时只有

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

回答

1

问题的原因是我在执行applicationWillTerminate时执行long-ish操作,这会延迟应用程序的'真正'终止(我假设)。所以,当我在关闭它之后立即重新打开应用程序时,此操作(将数据写入磁盘)仍在继续,所以应用程序并未真正退出。我相信这是我所能推断的问题。

3

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

+0

请看看我的编辑 – 2012-03-04 14:57:19

0

像迦勒说,你的应用程序正在暂停,但不是真的退出。要强制您的应用在挂起时退出,请在ProductName-Info.plist中将UIApplicationExitsOnSuspend设置为YES

+0

我不能这样做,因为我的应用程序依赖于后台功能 – 2012-03-04 14:57:12

+2

-0.5,因为'UIApplicationExitsOnSuspend'从来都不是一个解决方案。 – 2012-03-04 15:03:11

1

是的,这是按预期工作。每当您的应用程序处于暂停状态时,iOS都会截图并在下次启动时将其用作启动图像,除非是新推出。所以“或者在”退出“后打开它”似乎不正确。如果真的发生,这意味着你的应用程序是而不是当你认为它是退出。

无论如何,应用程序从头开始或从后台启动并不重要,您应该总是尽可能快地显示您的视图,让用户知道它正在加载,然后异步处理加载内容,而不是用户等待反应迟钝的应用程序希望它会很快工作一段时间。

+0

请参阅我的编辑 – 2012-03-04 14:57:03

0

Device os在应用程序进入后台时创建快照屏幕图像,这里是您可以在应用程序“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]; 
} 

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

和removeing快照时,应用进来前景