Ich habe eine App, die Benutzer Standort melden müssen, auch wenn es Hintergrund oder sogar getötet (beendet). Das Problem ist, dass die App den Standort nicht seltener als 1 Stunde Intervall melden sollte.iOS periodischen Hintergrund Standort Updates, die nicht nur von signifikanten Standortänderung abhängt
Ich benutze erhebliche Standortänderung (SLC), um alle Bewegungen zu verfolgen, die genug ist, wenn Benutzer unterwegs ist, aber sobald Benutzer stoppt keine weiteren Updates ausgelöst wird und die App keine Gelegenheit hat, neue Position (während Benutzer bleibt in der gleichen Gegend, aber ohne SLC).
Um diesen Fall zu behandeln, fange ich an, Hintergrundabrufe zu verwenden, um Updates-Position regelmäßig im Hintergrund auch ohne SLC zu senden). Das Problem hier ist, dass Hintergrundabrufe oft verwendet wurden (alle 20-30 Minuten, seitdem ich sie in einer anderen iOS 7.x App benutzt habe), aber jetzt mit iOS8/iOS9 kann ich sie nur einmal am Tag bekommen, was nicht akzeptabel ist in meinem Fall. Ich habe viele Tests durchgeführt, eine einfache Hintergrundabruf-App entwickelt, die beim Abruf eine lokale Benachrichtigung hinzufügt. Kein Glück, um es zu zwingen, öfter zu arbeiten.
Hier ist meine AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
return YES;
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
NSDate *now = [NSDate date];
localNotification.fireDate = now;
localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"];
localNotification.soundName = UILocalNotificationDefaultSoundName;
NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber;
number++;
localNotification.applicationIconBadgeNumber = number;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
completionHandler(UIBackgroundFetchResultNewData);
}
Alles, was hier geschehen ist, ist lokale Benachrichtigung auf jedem Hintergrund holen hinzuzufügen. Ich beende immer die Hintergrundausführung mit UIBackgroundFetchResultNewData.
Haben Sie Vorschläge, wie Sie Hintergrundabrufe häufiger zur Arbeit zwingen (oder Verbindungen nachprüfen, die nicht mehr möglich sind)? Irgendwelche alternativen Lösungen, um meine Anforderung zu erfüllen, sind auch willkommen!
Hintergrund Abruf hat noch nie eine Ausführungsdauer garantiert. Ich schlage vor, dass Sie stille Pushs an Ihr Gerät senden, um ihm die Möglichkeit zu geben, den Standort zu melden, aber dies funktioniert nicht, wenn die App beendet wird. – Paulw11
Es wurde nie garantiert, aber zumindest hat es früher öfter funktioniert. Gab es seit iOS 7 einige signifikante Änderungen im Zusammenhang mit Hintergrundabrufen? –
Welchen Wert geben Sie an den Beendigungshandler zurück? Neue Daten oder keine neuen Daten? Meiner Erfahrung nach wurde es sogar auf iOS8 nicht alle 20-30 Minuten aufgerufen. – Paulw11