Wie kann ich Probleme mit iOS-Hintergrund-App-Abrufen beheben, die nicht funktionieren?

Ich versuche, iOS-Hintergrund-App-Fetch in meiner App zum Laufen zu bringen. Beim Testen in Xcode funktioniert es, beim Ausführen auf dem Gerät nicht!

uf meinem Testgerät wird iOS 9.3.5 ausgeführt (mein Bereitstellungsziel ist 7.1Ich habe "Hintergrundabruf" unter "Hintergrundmodi" unter "Funktionen" auf dem Ziel in Xcode aktiviert.

In application: didFinishLaunchingWithOptions Ich habe verschiedene Intervalle mit setMinimumBackgroundFetchInterval ausprobiert, einschließlich UIApplicationBackgroundFetchIntervalMinimum

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // tell the system we want background fetch
    //[application setMinimumBackgroundFetchInterval:3600]; // 60 minutes
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
    //[application setMinimumBackgroundFetchInterval:1800]; // 30 minutes

    return YES;
}

Ich habe die Anwendung implementiert: performFetchWithCompletionHandler

void (^fetchCompletionHandler)(UIBackgroundFetchResult);
NSDate *fetchStart;

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    fetchCompletionHandler = completionHandler;

    fetchStart = [NSDate date];

    [[NSUserDefaults standardUserDefaults] setObject:fetchStart forKey:kLastCheckedContentDate];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [FeedParser parseFeedAtUrl:url withDelegate:self];
}

 -(void)onParserFinished
{
    DDLogVerbose(@"AppDelegate/onParserFinished");

    UIBackgroundFetchResult result = UIBackgroundFetchResultNoData;

    NSDate *fetchEnd = [NSDate date];
    NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart];
    DDLogVerbose(@"Background Fetch Duration: %f seconds", timeElapsed);
    if ([self.mostRecentContentDate compare:item.date] < 0) {
        DDLogVerbose(@"got new content: %@", item.date);
        self.mostRecentContentDate = item.date;
        [self scheduleNotificationWithItem:item];
        result = UIBackgroundFetchResultNewData;
    }
    else {
        DDLogVerbose(@"no new content.");
        UILocalNotification* localNotification = [[UILocalNotification alloc] init];
        localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
        localNotification.alertBody = [NSString stringWithFormat:@"Checked for new posts in %f seconds", timeElapsed];
        localNotification.timeZone = [NSTimeZone defaultTimeZone];
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    }

    fetchCompletionHandler(result);
}

Ich habe (erfolgreich!) Mit dem Simulator und dem Gerät mit Xcode's Debug / SimulateBackgroundFetch @ geteste

Ich habe erfolgreich mit einem neuen Schema getestet, wie in einer anderen SO-Antwort gezeigt https: //stackoverflow.com/a/29923802/51903)

Meine Tests zeigen, dass Code in der performFetch-Methode in ca. 0,3 Sekunden ausgeführt wird (es dauert also nicht lange)Ich habe überprüft, ob auf dem Gerät die Hintergrundaktualisierung in den Einstellungen aktiviert ist.Natürlich habe ich mir die anderen SO-Fragen angeschaut und gehofft, dass jemand anderes das Gleiche erlebt hat. :)

Wenn auf dem Gerät ausgeführt und keine Verbindung zu Xcode hergestellt wird, wird mein Code nicht ausgeführt. Ich habe die App geöffnet, die App geschlossen (die App nicht getötet!) Und Stunden und Tage gewartet. Ich habe versucht, mich in die Abruf-Handler einzuloggen, und habe auch Code geschrieben, um lokale Benachrichtigungen zu senden.

Ich habe einmal erfolgreich gesehen, wie meine lokalen Benachrichtigungen auf dem Gerät getestet wurden, und tatsächlich schien iOS den Abruf dreimal auszulösen, und zwar jeweils in einem Abstand von etwa fünfzehn Minuten, aber dann ist er nie wieder aufgetreten.

ch weiß, dass der Algorithmus, mit dem bestimmt wird, wie oft das Abrufen des Hintergrunds zugelassen wird, ein Rätsel ist, aber ich würde davon ausgehen, dass er zumindest gelegentlich innerhalb weniger Tage ausgeführt wir

Ich weiß nicht, was ich noch testen soll oder wie ich Probleme beheben soll, wenn es im Simulator, aber nicht auf dem Gerät zu funktionieren scheint.

Schätzen Sie jeden Rat!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage