webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit, die suspendierte App in iOS ohne Benutzer- oder Servereingriff zu aktivieren

Gibt es eine Möglichkeit, die iOS-App zu aktivieren, ohne den "Standortwechseldienst" zu verwenden?

Ich muss meine App ohne Server- oder Benutzereingriff aktivieren. Etwas, das dem Wecker ähnelt, bei dem Sie eine Warnmeldung erhalten, wenn es Zeit ist, aufzuwachen. 

UILocalNotification - Funktioniert nicht, da ein Benutzer und mehrere Eingriffe erforderlich sind.

Silent Push-Benachrichtigungen - Funktioniert nicht, da Sie keine lokalen Benachrichtigungen als Silent Push-Benachrichtigungen senden können. Diese können nur vom Server gesendet werden. Was bedeutet, dass ein Server-Eingriff erforderlich wäre

Hintergrundabruf - Funktioniert nicht, da keine Auslösezeit garantiert ist

Fehlt mir etwas?

16
Haris Farooqui

Bearbeiten: Sie haben Ihre Frage so eingestellt, dass sie explizit "ohne Benutzer- oder Servereingriff" lautet.

Nein. Soweit mir das Design bekannt ist, bietet iOS keine explizite Möglichkeit, Ihre App zu einem bestimmten Zeitpunkt in der Zukunft aufzuwecken. Sie können lange laufende Aufgaben im Hintergrund fortsetzen, den aktualisierten Inhalt opportunistisch abrufen, die Benutzer daran erinnern, Ihre App bei Bedarf erneut zu öffnen, und die ersten beiden mit Push-Benachrichtigungen bei Bedarf aufzufordern.

Hier sind einige Hinweise zu den drei oben genannten Optionen:

UILocalNotification

Am einfachsten ist es, einige UILocalNotifications zu einem Zeitpunkt in der Zukunft einzuplanen. Damit Sie Ihre App jedoch aktivieren können, müssen Sie mit der Benachrichtigung interagieren. Dies ist möglicherweise nicht das, was Sie wollen. 

Silent Push-Benachrichtigungen

Eine weitere Option seit iOS 7 ist eine content-available- oder stille Push-Benachrichtigung. Sie richten eine bestimmte Nutzlast für diese Art von Benachrichtigung ein. Wenn Ihre App über die korrekten Einstellungen für den UIBackgroundMode-Wert verfügt, wird diese automatisch an Ihre App übermittelt:

Die Nutzlast würde ungefähr so ​​aussehen:

{
    "aps" : {
        "content-available" : 1
    },
    "content-id" : 42
}

Und Sie würden es in Ihrem App-Delegaten mit einer bestimmten Delegatmethode erhalten:

- (void)         application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification userInfo is %@", userInfo);

    NSNumber *contentID = userInfo[@"content-id"];
    // Do something with the content ID
    completionHandler(UIBackgroundFetchResultNewData);
}

Sie können dann diese Gelegenheit zum Herunterladen von Inhalten verwenden oder Ihre App bei Bedarf schnell aktualisieren. Weitere Informationen zu diesem Ansatz finden Sie in den UIBackgroundModes und in Dokumentation zur Hintergrundausführung .

Der Artikel Multi-Tasking bei Objc.io ist auch ein guter Anfang für diesen Ansatz.

Hintergrundabruf

Wenn Sie die Dokumentation zu Hintergrundmodi von Apple lesen, kann der Wertabruf UIBackgroudnModes verwendet werden, damit Ihre App opportunistisch geweckt wird und Zeit hat, um ihre Daten herunterzuladen oder zu aktualisieren. 

Apples Dokumentation zu diesem Thema erwähnt seinen Anwendungsfall:

Apps, die regelmäßig nach neuen Inhalten suchen müssen, können das System auffordern, sie aufzuwecken, damit sie einen Abrufvorgang für diesen Inhalt initiieren können. Um diesen Modus zu unterstützen, aktivieren Sie die Option Hintergrundabruf im Abschnitt Hintergrundmodi der Registerkarte Funktionen in Ihrem Xcode-Projekt. 

17
Jessedc

Was Sie verlangen, ist gegen Apples Regel, und ich glaube, niemand möchte, dass Ihre App ohne seine Erlaubnis im Hintergrund etwas im Hintergrund macht.

Und Sie haben alle Optionen aufgelistet, die Sie nicht möchten, sondern darauf zählen müssen.

Ich denke, Sie müssen sich überlegen, wie Sie sie schön und benutzerfreundlich kombinieren können, damit sie so arbeiten, wie Sie es brauchen.

Dies ist die beste Kombination, die ich mir vorstellen kann:

  • Signifikanter Standortwechsel: Sie bitten beim ersten Mal und gelegentlich danach um die Erlaubnis des Benutzers.
  • Hintergrundabruf, stellen Sie sicher, dass Ihr Server bei jedem Aufruf etwas zurückgibt, damit iOS ihn nicht seltener optimiert.
  • Silent Push-Benachrichtigung, Sie fragen beim ersten Mal nach der Benutzererlaubnis.
1
dichen

Sie könnten Multitasking deaktivieren. Auf diese Weise tritt die App niemals in den Hintergrund oder wird ausgesetzt. Warten Sie einfach auf die korrekte Zeit, zu der die Warnung angezeigt werden soll. Dies ist jedoch wahrscheinlich nicht die beste Lösung, wenn man den Stromverbrauch berücksichtigt. Außerdem muss die App immer aktiv sein. Wenn der Benutzer die Home-Taste drückt, wird die App beendet. Die App wird jedoch nicht beendet, wenn der Benutzer das Gerät sperrt. Dies ist das Beste, was Sie ohne undokumentierte Apis tun können.

Wenn Sie Ihre App überhaupt nicht im Hintergrund ausführen möchten, können Sie explizit den Hintergrund durch Hinzufügen von UIApplicationExitsOnSuspend-Schlüssel (mit dem Wert YES) für die .__ Ihrer App. Info.plist-Datei Wenn eine App ausfällt, wechselt sie zwischen den Nicht-laufende, inaktive und aktive Zustände und betritt niemals die Hintergrund oder suspendierte Zustände. Wenn der Benutzer die Home-Taste drückt Um die App zu beenden, wird die applicationWillTerminate: Methode der App verwendet. Delegat wird aufgerufen und die App hat ungefähr 5 Sekunden Zeit, um aufzuräumen und beenden, bevor es beendet wird und zurück in das nicht laufende .__ verschoben wird. Zustand.

Es wird dringend davon abgeraten, die Ausführung im Hintergrund abzuschließen, kann jedoch __ sein. die bevorzugte Option unter bestimmten Bedingungen.

https://developer.Apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

0
Tapani