Cómo preparar la actualización de la interfaz de usuario antes de que la aplicación ingrese a la tierra.

Sé actualizar la interfaz de usuario cuando la aplicación en segundo plano no es recomendada por Apple, especialmente para OpenGL.

Sin embargo, me di count de que iMessenger y el postro de Facebook parecen capaces de hacerlo. Ingresa un hilo de posts con tu amigo y luego ve background, luego recibe un post nuevo mientras la aplicación todavía está en segundo plano, luego trae esta aplicación a primer plano (haz clic en la notificación push o en el ícono de la aplicación), encontrarás que el nuevo post de burbuja ya está allí con la animation de expansión de la aplicación desde el ícono.

Para mi comprensión, esto solo puede suceder porque la nueva burbuja de post ya está dibujada en el modo de background. Luego, mientras que la aplicación entra en primer plano, puede aparecer en la animation.

Sin embargo, a partir de mi resultado de testing, en iOS8 e iOS9, toda la actualización de la interfaz de usuario de background se pospuso después de que la aplicación se activó. Y aún más, iOS agregará una transacción de animation implícita para esa actualización de UI.

Enumeré mi código de testing como se muestra a continuación, verás que la nueva celda se agregará a la tabla con una transacción de animation obvia cuando la aplicación vaya a primer plano, totalmente diferente a la de iMessenger. La tablaView: numberOfRowsInSection: solo se retrasará cuando la aplicación entre en primer plano.

Y no solo para la actualización de la celda tableview, incluso agregar una subvista en segundo plano también activará una transacción retrasada similar para ingresar a primer plano.

Quizás estoy en una dirección totalmente equivocada al respecto. ¿Podría alguien ayudarme a comprender cómo los postros de iMessenger y FB pueden lograr este efecto? ¡Gracias por adelantado!

@interface ViewController () <UITableViewDataSource, UITableViewDelegate> @property (nonatomic) UITableView *tableView; @property (nonatomic) NSMutableArray *dataTable; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:self.tableView]; self.tableView.delegate = self; self.tableView.dataSource = self; [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"kCellId"]; self.dataTable = [[NSMutableArray alloc] initWithArray:@[@"1", @"2", @"3"]]; __weak __typeof(self) weakSelf = self; [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [weakSelf.dataTable addObject:[@(weakSelf.dataTable.count + 1) stringValue]]; [weakSelf.tableView reloadData]; }); }]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataTable.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"kCellId"]; cell.textLabel.text = self.dataTable[indexPath.row]; return cell; } @end 

Puedo recomendarte que mires la documentation de la carga APN para launch-mage .

launch-image : el nombre de file de un file de image en el package de aplicaciones; puede include la extensión u omitirla. La image se usa como la image de inicio cuando los usuarios presionan el button de acción o mueven el control deslizante de acción. Si no se especifica esta propiedad, el sistema usa la instantánea anterior, usa la image identificada por la key UILaunchImageFile en el file Info.plist de la aplicación o regresa a Default.png. Esta propiedad se agregó en iOS 4.0.

Background Fetch permite que el sistema despierte la aplicación en segundo plano

Más detalles ingrese la descripción del enlace aquí.