iPhone - During the app launch the app goes into b

2019-08-13 18:42发布

问题:

Recently I have come across a problem, where my app goes into background during initial launch, but this only happens on iPhone 4S with iOS6. I have tested on:

  • simulator, with different hardware/software configurations
  • iPhone 5 (iOS 6)
  • iPhone 4S (iOS 5.1)
  • iPad2 (iOS 6)

and it is working on all of them, but on the iPhone 4S with iOS6 the launch of the app takes about 20s before going into background, if you "re-launch" the app after a couple of seconds you see that it is still running and works without any problem.

Is there any know issue with iPhone4S (iOS6) that causes this or there is something special about this model? [I already tested it on different iPhone4s (iOS6) and it is happening on all of them]

EDIT

I noticed something weird will doing some more testing, iPhone 4s (iOS6) is the only one that doesn't show the loading screen (first view controller), it only shows the launch image.. anyway, here is the code for the AppDelegate and the first view controller:

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 e.g. 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

Thank you very much for your attention and help :)

回答1:

While trying to figure out what was happening, the suggestions made in the comments to the question made me realize that for some reason the app was calling the same method twice and for some reason that cause the app to go to the background.

To solve the problem, simply remove this lines from 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];

and add them to goToLista (this is called after the initial loading is complete).

I ended up with:

- (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];
}

This solves the problem, but I don't know why. If anyone knows please do tell, because I really would like to know.

Thank you :)