iPhone – 在应用程序启动时,应用程序进入后台

最近我遇到了一个问题,我的应用程序在初始启动时进入后台,但这只发生在iOS4的iPhone 4S上。 我已经testing过:

  • 模拟器,具有不同的硬件/软件configuration
  • iPhone 5(iOS 6)
  • iPhone 4S(iOS 5.1)
  • iPad2(iOS 6)

它是在所有这些工作,但在与iOS6的iPhone 4S的应用程序的启动大约需要20秒后才进入后台,如果你几秒钟后重新启动应用程序,你会看到它仍然在运行并没有任何问题的工作。

iPhone4S(iOS6)有什么问题会导致这个问题,或者这个模型有什么特别之处? [我已经在不同的iPhone4(iOS6)上testing过了,而且所有这些都发生了]

编辑

我注意到奇怪的是会做一些更多的testing,iPhone 4s(iOS6)是唯一一个不显示加载屏幕(第一视图控制器),它只显示启动图像..无论如何,这里是代码为AppDelegate和第一个视图控制器:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // Optional: automatically track uncaught exceptions with Google Analytics. [GAI sharedInstance].trackUncaughtExceptions = YES; // Optional: set Google Analytics dispatch interval to eg 20 seconds. [GAI sharedInstance].dispatchInterval = 20; // Optional: set debug to YES for extra debugging information. [GAI sharedInstance].debug = NO; // Create tracker instance. __unused id<GAITracker> tracker = [[GAI sharedInstance] trackerWithTrackingId:@"UA-APP-ID"]; return YES; } 

EcraPrincipalViewController.m

 #import "EcraPrincipalViewController.h" #import "ListaPercursosTableViewController.h" #import "GlobalVars.h" #import "AppDelegate.h" @interface EcraPrincipalViewController () @end @implementation EcraPrincipalViewController { int progresso; int sizePercursos; } @synthesize lbl_versao; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; self.trackedViewName = @"iPhone - EcrãPrincipal"; // Do any additional setup after loading the view. NSMutableArray *views = [[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; UIStoryboard *story = [UIStoryboard storyboardWithName:@"WalkMeStoryBoard" bundle:nil]; ListaPercursosTableViewController *listaV = [story instantiateViewControllerWithIdentifier:@"view_lista"]; [views replaceObjectAtIndex:0 withObject:listaV]; [self.navigationController setViewControllers:views]; lbl_info.text = NSLocalizedString(@"downloading", NULL); lbl_versao.text = NSLocalizedString(@"walkme_versao", NULL); dispatch_queue_t queue = dispatch_queue_create("com.WalkMe.downloadPercursos", NULL); dispatch_async(queue, ^{ [[GlobalVars Instance] getLevadas:self]; }); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (BOOL)shouldAutorotate { return [[GlobalVars Instance] podeRodar]; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)novaAtualizacao { NSLog(@"Atualização encontrada"); lbl_info.text = NSLocalizedString(@"atualizacao_encontrada", NULL); } -(void)atualizarPercursosInternos { NSLog(@"VERIFICAÇAO Interna"); lbl_info.text = NSLocalizedString(@"a_atualizar_percursos", NULL); } -(void)setNewDownload:(NSNumber*)size { NSLog(@"Iniciou VERIFICAÇAO"); progresso = 0; sizePercursos = [size intValue]; lbl_info.text = [NSString stringWithFormat:@"%@ 0/%d", NSLocalizedString(@"novos_percursos", NULL), sizePercursos]; } -(void)setProgress { NSLog(@"Progresso"); progresso++; lbl_info.text = [NSString stringWithFormat:@"%@ %d/%d", NSLocalizedString(@"novos_percursos", NULL), progresso, sizePercursos]; } -(void)goToLista { NSLog(@"ACABOU VERIFICAÇAO"); UIStoryboard *story = [UIStoryboard storyboardWithName:@"WalkMeStoryBoard" bundle:nil]; [[GlobalVars Instance] getLevadas]; [self.navigationController pushViewController:[story instantiateViewControllerWithIdentifier:@"view_lista"] animated:NO]; } - (void)viewDidUnload { [self setLbl_versao:nil]; [super viewDidUnload]; } @end 

非常感谢您的关注和帮助:)

在试图弄清楚发生了什么的时候,在对这个问题的评论中提出的build议使我意识到,出于某种原因,应用程序调用了相同的方法两次,并由于某种原因导致应用程序转到后台。

要解决这个问题,只需从viewDidLoad中删除这些行

 NSMutableArray *views = [[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; UIStoryboard *story = [UIStoryboard storyboardWithName:@"WalkMeStoryBoard" bundle:nil]; ListaPercursosTableViewController *listaV = [story instantiateViewControllerWithIdentifier:@"view_lista"]; [views replaceObjectAtIndex:0 withObject:listaV]; [self.navigationController setViewControllers:views]; 

并将它们添加到goToLista(这是在初始加载完成后调用的)。

我结束了:

 - (void)viewDidLoad { [super viewDidLoad]; self.trackedViewName = @"iPhone - EcrãPrincipal"; // Do any additional setup after loading the view. lbl_info.text = NSLocalizedString(@"downloading", NULL); lbl_versao.text = NSLocalizedString(@"walkme_versao", NULL); dispatch_queue_t queue = dispatch_queue_create("com.WalkMe.downloadPercursos", NULL); dispatch_async(queue, ^{ [[GlobalVars Instance] getLevadas:self]; }); } -(void)goToLista { NSLog(@"ACABOU VERIFICAÇAO"); [[GlobalVars Instance] getLevadas]; NSMutableArray *views = [[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]]; UIStoryboard *story = [UIStoryboard storyboardWithName:@"WalkMeStoryBoard" bundle:nil]; ListaPercursosTableViewController *listaV = [story instantiateViewControllerWithIdentifier:@"view_lista"]; [views replaceObjectAtIndex:0 withObject:listaV]; [self.navigationController setViewControllers:views]; [self.navigationController pushViewController:[story instantiateViewControllerWithIdentifier:@"view_lista"] animated:NO]; } 

这解决了这个问题,但我不知道为什么。 如果有人知道请告诉,因为我真的很想知道。

谢谢 :)