iOS: Push-Benachrichtigungen als "Trigger" für Webservice Polling?

8

Ich fange gerade erst an, OBJ-C zu lernen, aber ich habe eine Endziel-App, an deren Aufbau ich arbeite; Diese App wird eine Master / Detail-App auf dem iPad sein, die benötigt wird, um sich in Echtzeit mit einem Webservice auf dem Laufenden zu halten. Es muss außerdem Daten an die entfernte MySQL-Datenbank senden, wenn einer der mehreren Benutzer (auf separaten iPads) bestimmte Aktionen innerhalb der App ausführt.

BEARBEITEN: Wie lxt so hilfreich erklärt hat: "" Ist es angebracht, Push-Benachrichtigungen als Hinweis zu verwenden, um einen Webservice abzufragen? "- Die Antwort ist eine Art."

Das Beispiel, das ich für die Zwecke dieser Frage vorgestellt habe, ist ein Widget-Inventar-Manager mit "eingehenden" Inventar, das in die Tabellenansicht und "Inventar-Lagerplätze" fließt, in die die Benutzer Inventar ziehen und ablegen die Detailansicht.

Wie so:

HINWEIS: Meine Anwendung benötigt NICHT selbst aktualisiert zu werden, wenn sie nicht im Vordergrund ist. Es kann glücklich schlafen, bis es wieder gestartet wird; An diesem Punkt müsste es sich mit den neuesten Daten aktualisieren. Kyle hat mit applicationWillEnterForeground:

Um dies zu erreichen, ohne meinen Webservice Server zu überlasten, habe ich mir eine Lösung ausgedacht, die Webservice Polling und PUSH Notifications kombiniert, um die Abfragen auszulösen, wenn ein Benutzer (iPad) Änderungen an den Daten vornimmt. Also wäre der Fluss so:

  1. Eine "standardmäßige" Umfrage des Webservice würde jede Minute ausgelöst werden, unabhängig von den Aktionen, die ein Benutzer ausführen kann.

  2. Wenn ein Benutzer ein Inventarelement aus der Tabellenansicht zieht und es in einem Lagerplatz ablegt, der eine PUSH-Benachrichtigung an ein anderes iPad in demselben übergeordneten Konto initiiert und eine Webservice-Abfrage auslöst, um seine Daten zu aktualisieren.

Kurz gesagt: Jedes Mal, wenn ein Benutzer auf dem iPad "A" etwas ändert, wird eine Push-Benachrichtigung an das iPad "B", iPad "C" usw. gesendet. Wenn der PUSH von B, C, D usw. empfangen wird dann den Server abfragen, um ihre Daten zu aktualisieren.

Die Alternative dazu ist, jedes iPad auf dem Konto alle 15 Sekunden Webservice-Umfragen abzufeuern; das scheint mir für die Bandbreite teuer zu sein (und würde oft zu keinen Änderungen an den Daten führen).

Meine Frage ist weniger "Wie kann ich ...?" und mehr von einem "Wie soll ich ...?". Ich weiß, StackOverflow mag das etwas "subjektiv" finden, aber ich denke, das ist eine sehr würdige Frage, wenn ich zwei Tage lang diese spezielle Praxis untersucht habe (mit PUSH-Benachrichtigungen, um Webservice-Abfragen auszulösen) und genau null relevante Artikel gefunden habe.

>

Danke, dass Sie sich die Zeit genommen haben, dies zu lesen. Jede Hilfe wäre willkommen. Beispielcode und / oder spezifische Framework / Kit-Informationen würden sehr geschätzt werden. Aber jetzt muss ich nur wissen, ob das eine gute Idee ist oder nicht.

    
AJB 26.12.2012, 21:31
quelle

2 Antworten

10

Für iOS 7 aktualisiert

Der Kern Ihrer Frage scheint also zu lauten: "Ist es angemessen, Push-Benachrichtigungen als Hinweis zu verwenden, um einen Webservice abzufragen?" - Die Antwort lautet ja, mit ein paar Dingen, die Sie beachten sollten. Vor iOS 7 müsste deine App im Vordergrund sein, damit das funktioniert. Jetzt können Sie Hintergrund-App-Aktualisierung verwenden, um die Web-Service-Abfrage im Hintergrund nach Erhalt einer Push-Nachricht auszulösen.

Apple selbst verwendet Push-Benachrichtigungen, um Web-Service-Aufrufe auszulösen - so werden die Passwörter in Passbook remote aktualisiert. Wenn aktualisierte Übergaben verfügbar sind, wird eine Push-Benachrichtigung gesendet, die dazu führt, dass iOS den entsprechenden Web-Service aufruft, der mit dem Pass verknüpft ist, um die neue Payload herunterzuladen.

Einige Dinge, an die Sie sich erinnern sollten: Die erste ist, dass Push-Benachrichtigungen nicht garantiert sind (nicht unbedingt ein Problem), aber Sie haben auch keine Garantie, wann sie zugestellt werden. In den meisten Fällen würden Sie hoffen, dass es augenblicklich ist, aber das ist nicht immer der Fall. Darüber hinaus profitieren alle Benutzer, die Push-Benachrichtigungen deaktiviert haben, nicht von dieser Funktion.

Was Sie suchen, ist kein sehr neues Problem, und es gibt einige vorhandene Lösungen, die Sie verwenden könnten, anstatt Push-Benachrichtigungen zu verwenden, um Updates auszulösen. Sie könnten ein Socket-basiertes System (ziemlich kompliziert) oder HTTP-Long-Polling (weniger kompliziert) verwenden. Es gibt auch Dienste von Drittanbietern, die vorhanden sind, um dies wirklich leicht zu erreichen - ein solcher Dienst ist Pusher .

Einer der großen Vorteile dieser drei Alternativen (Sockets, Long Polling, Third Party Services) ist, dass sie in der Regel plattformneutral sind und Sie sie (im Gegensatz zu APNS) problemlos auf anderen Clients verwenden können. Wenn ich es wäre, würde ich einen dieser Ansätze für Push-Benachrichtigungen verwenden, aber mit der Aktualisierung der Hintergrund-App auf iOS 7 können Sie feststellen, dass Push alles unterstützen kann, was Sie tun möchten.

Nur meine zwei Cent sowieso - hoffe, es ist nützlich für dich.

    
lxt 26.12.2012, 21:43
quelle
2

Wir haben kürzlich darüber für ein Projekt diskutiert. Die Antwort schlossen wir mit: NEIN.

Gründe:

  • Push-Benachrichtigungen werden nicht garantiert. Sie konnten in 5 Sekunden ankommen, sie konnten in 15 Minuten ankommen, oder sie konnten nie ankommen.
  • Es ist nicht garantiert, dass Benutzer eine aktive Datenverbindung haben, daher ist ohnehin eine Art narrensicherer Logik- und Aktualisierungsprozess erforderlich.
  • Fehlende Sicherheit beim Senden sensibler Daten (IDs, die potentiell mit Personen in Verbindung gebracht werden könnten) durch Drücken von.

Wir haben uns auch eine Art Socket-Verbindung angeschaut, allerdings hat das auch Einschränkungen, einschließlich der Tatsache, dass die App während der Interaktion offen bleiben muss und der Akku stärker abgenutzt ist.

Letztendlich haben wir uns entschieden, dass diese Funktionalität ausreicht, um durch einen Klick ausgelöst zu werden. Der Kompromiss war es einfach nicht wert. Dies bedeutet jedoch nicht, dass dies nicht möglich ist, und in Ihrer speziellen Situation ist dies möglicherweise der beste Weg. Ich empfehle Ihnen, Ihr Produktdesign genauer zu betrachten und festzustellen, wie wichtig dieses Feature für Sie ist. Wenn es trivial ist, empfehle ich KEINE Push-Benachrichtigungen.

UPDATE:

Eine weitere mögliche Option besteht darin, Ihren Web-Service-Anruf auszulösen, wenn der Nutzer die App erneut öffnet. Versuchen Sie sich in applicationWillEnterForeground und vielleicht eine Lösung ähnlich der hier gefunden: applicationWillEnterForeground: Daten von ViewController .

    
Kyle Clegg 26.12.2012 22:05
quelle