2015-12-16 2 views
13

Ich weiß update UI, wenn App im Hintergrund nicht von Apple empfohlen wird, insbesondere für OpenGL.Wie UI-Update vorzubereiten, bevor app forground eingeben

Allerdings habe ich gerade gemerkt, Messenger und Facebook Messenger sieht in der Lage, das zu tun. Geben Sie einen Nachrichtenthread mit Ihrem Freund ein und gehen Sie dann zum Hintergrund, erhalten Sie eine neue Nachricht, während sich die App noch im Hintergrund befindet, und bringen Sie diese App in den Vordergrund (klicken Sie auf die Push-Benachrichtigung oder das App-Symbol) dort mit der App-Erweiterungs-Animation vom Icon.

Zu meinem Verständnis kann dies nur passieren, weil die neue Nachrichtenblase bereits im Hintergrundmodus gezeichnet wird. Wenn die App den Vordergrund erreicht, kann sie in der Animation angezeigt werden.

Wie auch immer, aus meinem Testergebnis, in iOS8 und iOS9, werden alle Hintergrund-UI-Updates verschoben, nachdem die App aktiv wurde. Außerdem fügt iOS eine implizite Animationstransaktion für dieses UI-Update hinzu.

Ich habe meinen Testcode wie folgt aufgelistet. Sie werden sehen, dass die neue Zelle mit einer offensichtlichen Animationstransaktion in die Tabelle eingefügt wird, wenn die App in den Vordergrund rückt, ganz im Gegensatz zum iMessenger. TableView: numberOfRowsInSection: wird nur verzögert ausgeführt, wenn App den Vordergrund eingibt.

Und nicht nur für die Tabellenansicht Zellenaktualisierung, sogar Hinzufügen einer Unteransicht im Hintergrund wird auch ähnliche verzögerte Transaktion für den Eintritt in den Vordergrund auslösen.

Vielleicht bin ich in völlig falsche Richtung darüber. Könnte mir jemand helfen, zu verstehen, wie der Messenger von IMessenger und FB diesen Effekt erzielen kann? Vielen Dank im Voraus!

@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 
+0

Warum sind Sie mit 'dispatch_after' wacht? Dies zwingt dazu, eine Laufschleife zu warten und den Block später auszuführen - nachdem der Bildschirm bereits einmal gezeichnet wurde. NSNotificationCenter ruft * immer * seine Beobachter im Hauptthread auf. Dies bedeutet, dass Sie GCD überhaupt nicht verwenden müssen. Versuchen Sie, den Aufruf "dispatch_after" zu entfernen. – Farthen

+0

using dispatch_after ist versuchen zu simulieren Update der Benutzeroberfläche wenn App im Hintergrund. Direktes Aufrufen der Benutzeroberflächenaktualisierung nach dem Eingeben der Hintergrundbenachrichtigung kann nicht garantieren, dass die Kernanimation bereits gestoppt wurde. – Pei

+0

Ich würde empfehlen, einen Testfall nicht so hart zu codieren. Wenn Sie einen besseren Test wünschen, würde ich eine Push-Benachrichtigung mit einigen beliebigen Daten an Ihre App senden. Wenn die App die Push-Benachrichtigung erhält, aktualisieren Sie die DataTable mit den Daten, die Sie von der Push-Benachrichtigung erhalten haben. –

Antwort

1

kann ich empfehlen Sie in APN payload documentation für Launch-Magier zu suchen.

launch-image - Der Dateiname einer Bilddatei im App-Bundle; es kann die Erweiterung enthalten oder weglassen. Das Bild wird als Startbild verwendet, wenn Benutzer auf die Aktionsschaltfläche tippen oder den Aktionsschieberegler bewegen. Wenn diese Eigenschaft nicht angegeben ist, verwendet das System entweder den vorherigen Snapshot, verwendet das Image, das durch den Schlüssel UILaunchImageFile in der Datei Info.plist der App identifiziert wird, oder greift auf Default.png zurück. Diese Eigenschaft wurde in iOS 4.0 hinzugefügt. Fetch

1

Hintergrund das System verwaltet die app im Hintergrund

detaillierter enter link description here

+0

Danke für die Antwort, aber selbst App wacht im Hintergrund auf, alle UI-Updates werden gepostet, bis sie aktiv werden. Für die iOS-Version später als 8.0 – Pei

Verwandte Themen