Ich löse einen Hintergrundabruf aus, indem ich das content-available
Flag in einer Push-Benachrichtigung verwende. Ich habe das fetch
und remote-notification
UIBackgroundModes
aktiviert.
Hier ist die Implementierung, die ich in meinem AppDelegate.m verwende:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Wenn die App im Hintergrund ausgeführt wird, funktioniert sie einwandfrei. (Die Benachrichtigung wird empfangen und die App hat die lokale Benachrichtigung "Es sieht so aus, als hätte ich eine Benachrichtigung erhalten" ausgelöst, wie es der obige Code tun sollte.)
Allerdings , wenn die App nicht läuft und eine Push - Benachrichtigung mit der empfangenen content-available
Flagge, wird die App nicht gestartet und die didRecieveRemoteNotification
delegierte Methode nie aufgerufen.
Das WWDC-Video Was ist neu mit Multitasking (# 204 von WWDC 2013) zeigt dies:
Es heißt, dass die Anwendung "im Hintergrund gestartet" wird, wenn eine Push-Benachrichtigung mit dem content-available
Flag empfangen wird .
Warum wird meine App nicht im Hintergrund gestartet?
Die eigentliche Frage lautet also:
Führt iOS Hintergrundaufgaben aus, nachdem der Benutzer die App zwangsweise beendet hat?
quelle
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Antworten:
UPDATE2:
Sie können dies mit dem neuen PushKit-Framework erreichen, das in iOS 8 eingeführt wurde. PushKit wird jedoch für VoIP verwendet. Daher sollte Ihre Nutzung für VoIP erfolgen, da sonst die Gefahr einer Ablehnung der App besteht. (Siehe diese Antwort ).
UDPDATE1:
Die Dokumentation wurde für iOS8 geklärt . Die Dokumentation kann hier gelesen werden . Hier ist ein relevanter Auszug:
Obwohl dies im WWDC-Video nicht klargestellt wurde, ergab eine schnelle Suche in den Entwicklerforen Folgendes:
https://devforums.apple.com/message/873265#873265 (Anmeldung erforderlich)
Dieser Beitrag wurde von einem Apple-Mitarbeiter verfasst, daher kann ich darauf vertrauen, dass diese Informationen korrekt sind.
Es sieht also so aus, als würde die App niemals gestartet, wenn die App über den App-Umschalter beendet wird (durch Wischen nach oben), selbst für geplante Hintergrundabrufe.
quelle
Sie können die Starteinstellungen Ihres Ziels unter "Schema verwalten" in ändern. Dies
Wait for <app>.app to be launched manually
ermöglicht Ihnen das Debuggen, indem Sie einen Haltepunkt festlegenapplication: didReceiveRemoteNotification: fetchCompletionHandler:
und die Push-Benachrichtigung senden, um den Hintergrundstart auszulösen.Ich bin nicht sicher, ob es das Problem lösen wird, aber es kann Ihnen beim Debuggen vorerst helfen.
quelle
Die Antwort lautet JA, sollte jedoch nicht "Hintergrundabruf" oder "Remote-Benachrichtigung" verwenden. PushKit ist die Antwort, die Sie wünschen.
Zusammenfassend ist PushKit, das neue Framework in ios 8, der neue Push-Benachrichtigungsmechanismus, mit dem Sie Ihre App ohne visuelle Warnmeldung im Hintergrund starten können, selbst wenn Ihre App durch Herauswischen aus dem App Switcher getötet wurde. Erstaunlicherweise können Sie sie nicht einmal sehen vom App Switcher.
PushKit-Referenz von Apple:
Informationen zum Bereitstellen dieser neuen Funktion finden Sie in diesem Lernprogramm: https://zeropush.com/guide/guide-to-pushkit-and-voip - Ich habe sie auf meinem Gerät getestet und sie funktioniert wie erwartet.
quelle
Wenn Sie den Hintergrundabruf testen müssen, müssen Sie eine Option im Schema aktivieren:
Eine andere Möglichkeit, wie Sie es testen können:
Hier finden Sie vollständige Informationen zu dieser neuen Funktion: http://www.objc.io/issue-5/multitasking.html
quelle
Ich habe tagelang verschiedene Varianten davon ausprobiert und dachte einen Tag lang, ich hätte die App im Hintergrund neu gestartet, selbst wenn der Benutzer zum Töten gewischt hat, aber nein, ich kann dieses Verhalten nicht replizieren.
Es ist bedauerlich, dass das Verhalten ganz anders ist als zuvor. Wenn Sie unter iOS 6 die App über die wackelnden Symbole beendet haben, wird sie bei SLC-Triggern immer wieder aktiviert. Wenn Sie durch Wischen töten, passiert das nicht.
Es ist ein anderes Verhalten, und der Benutzer, der weiterhin nützliche Informationen von unserer App erhalten würde, wenn er sie unter iOS 6 getötet hätte, wird dies jetzt nicht tun.
Wir müssen unsere Benutzer dazu bewegen, die App jetzt erneut zu öffnen, wenn sie gewischt haben, um sie zu beenden, und immer noch einen Teil des Benachrichtigungsverhaltens erwarten, das wir ihnen früher gegeben haben. Ich mache mir Sorgen, dass dies für Benutzer nicht offensichtlich ist, wenn sie eine App wegwischen. Schließlich können sie im Grunde genommen die angezeigten Apps bereinigen oder neu anordnen.
quelle
Dies könnte Ihnen helfen
Quelle: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
quelle
Der Videolink: https://developer.apple.com/videos/play/wwdc2019/707/
quelle