React-native-iap: Bei getAvailablePurchases unter iOS wird ein Dialogfeld "Im iTunes Store anmelden" angezeigt.

Erstellt am 1. Okt. 2019  ·  21Kommentare  ·  Quelle: dooboolab/react-native-iap

Version von react-native-iap

3.4.13

Version von React-Native

0,60,5

Plattformen, auf denen Sie den Fehler hatten (IOS oder Android oder beides?)

iOS

Erwartetes Verhalten

getAvailablePurchases hat keine Nebenwirkungen

Tatsächliches Verhalten

Wenn Sie unter iOS getAvailablePurchases aufrufen, wird ein Dialogfeld "Bei iTunes Store anmelden" angezeigt.

Dies ist unter Android nicht der Fall.

IMG_0020

Ich rufe beim Start der App getAvailablePurchases an, um die gekauften Artikel wiederherzustellen. Laut Dokumentation habe ich verstanden, dass dies der übliche Weg ist, oder?

Um die gekauften Artikel wiederherzustellen, rufe ich getAvailablePurchases basierend auf Änderungen von AppState auf . Leider wird der AppState nicht nur beim Start der App ausgelöst, sondern auch p.ex. nach der Rückkehr zur App aus einem Dialog (verursacht durch die App) p.ex. Bei iTunes anmelden ... :(

Für den Benutzer ist dies störend. Insbesondere wenn der Benutzer nicht beabsichtigt, etwas zu kaufen, möchte er seine Anmeldeinformationen nicht eingeben, um diesen Dialog zu entfernen.

Getestete Umgebung (Emulator? Reales Gerät?)

echtes Gerät

Schritte zum Reproduzieren des Verhaltens

Rufen Sie getAvailablePurchases auf

❓ question 📱 iOS 🙏 help wanted 🚶🏻 stale

Hilfreichster Kommentar

Gibt es vielleicht eine Möglichkeit, vor dem Aufruf von getAvailablePurchases zu wissen, dass die Eingabeaufforderung angezeigt wird? Oder mit anderen Worten, wie kann ich feststellen, ob der Benutzer mit iTunes verbunden ist oder nicht?

Alle 21 Kommentare

Während der Entwicklung wird dies angezeigt, damit Sie sich mit Ihrem Sandbox-Konto anmelden können. Ich glaube nicht, dass die Dokumente diesbezüglich sehr klar sind.

Ich denke, für die Produktion wird möglicherweise auch eine Eingabeaufforderung angezeigt, wenn diese Funktion aufgerufen wird, oder? Die Art und Weise, wie ich dies implementiert habe, ist, dass ich dies aufrufe, wenn der Benutzer auf "Kauf wiederherstellen" drückt und nach dem KaufUpdatedListener aufgerufen wird. Um zu wissen, ob der Benutzer in Zukunft ein Abonnement hat, speichere ich es im Backend und präsentiere es der App.

Hey @voxspox @alexpchin ist richtig. @alexpchin Da wir an der Brücke arbeiten, gehen wir davon aus, dass die Leute ein wenig über IAP in Native wissen. Alle Dinge, die bereits auf jeder Plattform vorhanden sind, zu platzieren, ist für die Betreuer eine ziemliche Belastung. Wenn es einige Arbeiten an einem Dokument gibt, die Sie für hilfreich halten, können Sie jederzeit etwas hinzufügen und ein PR drücken.

@mifi Ich habe noch nie eine App mit der Schaltfläche "Meine Einkäufe wiederherstellen" gesehen. Aus UX-Sicht ist eine solche Schaltfläche eine Belastung und auch unnötig, da die App wissen sollte, was ich gekauft habe;)

@hyochan Ich erhalte die Eingabeaufforderung auch nach dem Verteilen der App über TestFlight (ich nehme an, dies ist der Produktionsmodus?!)

Ich habe einige Apps mit dieser Funktion gesehen. Ich erinnere mich jetzt nicht ganz, aber ich denke, dass es in einigen Fällen benötigt wird (oder von Apfel benötigt wird). Auch in Apples App Store-Richtlinienbeispielen haben sie diese Schaltfläche:
https://developer.apple.com/app-store/subscriptions/

Außerdem dachte ich, es wäre eine schlechte UX, wenn der Benutzer beim Öffnen meiner App jemals seine Apple-ID eingeben müsste. Ich denke, das wäre verwirrend. (Ich habe dies schon einmal gesehen, wenn die Sitzung abgelaufen ist oder etwas mit SSL MITM passiert, was häufig bei öffentlichen WLAN-Zielseiten der Fall ist.)

edit: scheint tatsächlich, dass Apple es benötigt

Gibt es vielleicht eine Möglichkeit, vor dem Aufruf von getAvailablePurchases zu wissen, dass die Eingabeaufforderung angezeigt wird? Oder mit anderen Worten, wie kann ich feststellen, ob der Benutzer mit iTunes verbunden ist oder nicht?

1+ gleich

Hallo Leute, gibt es eine Antwort darauf? Da ich verstehe, dass dies eine Debugging-Funktion ist, ich aber mit Testflight teste und dies verhindern möchte, ist es möglich, den Sandbox-Modus irgendwie zu verlassen?

Inzwischen habe ich eine Lösung für mich gefunden. Ich habe eine neue Variable isRestorePurchasesEnabled die von meiner App permanent gespeichert wird.

Drin:

isRestorePurchasesEnabled = false

Beim Start der App:

if (Android || isRestorePurchasesEnabled) {
  call getAvailablePurchases
  on error.code === 'E_USER_CANCELLED' -> isRestorePurchasesEnabled= false
}

Beim Kauf:

isRestorePurchasesEnabled = true
requestSubscription ...

Die Einstellungen:

Button "restore purchases" -> isRestorePurchasesEnabled = true

Der Benutzer wird die Connect-iTunes-Eingabeaufforderung nie wieder sehen. Die Wiederherstellung erfolgt erst, nachdem ein Kauf getätigt wurde und daher die Anmeldeinformationen bereits in + gespeichert eingegeben wurden und die Eingabeaufforderung nicht angezeigt wird.
Der einzige Fall, in dem die Eingabeaufforderung nur einmal angezeigt wird, ist, wenn sich der Benutzer unter Einstellungen / iTunes / Sandbox-Konto abmeldet. Ich weiß nicht, ob dies im Produktionsmodus vorhanden ist.

Hey, es sieht so aus, als ob in letzter Zeit keine Aktivitäten zu diesem Thema stattgefunden haben. Wurde das Problem behoben oder erfordert es immer noch die Aufmerksamkeit der Community? Dieses Problem kann geschlossen werden, wenn keine weitere Aktivität auftritt. Sie können diese Ausgabe auch als "Zur Diskussion" oder "Gute erste Ausgabe" bezeichnen, und ich werde sie offen lassen. Vielen Dank für Ihre Beiträge.

Hallo,
Ich bin wirklich verwirrt über ein Thema. Kann mir jemand helfen?
Ich möchte einen Controller erstellen, der prüft, ob der Benutzer das Produkt noch besitzt oder nicht.
Wie kann ich die Stornierung von Nutzern erkennen, wenn ich diese Bibliothek sowohl für Apple als auch für Google Play Store verwende?
Ich weiß nicht einmal, ob es mit dieser getAvailablePurchase-Methode zusammenhängt.
Vielen Dank.

  • gleich

Ich würde gerne herausfinden, ob dies auch in der Produktion und nicht nur in TestFlight passieren würde.
Wir verwenden diese Funktion derzeit beim Laden der App und nicht per Knopfdruck.

Apple rät uns noch nicht über diese Funktion auf App aufrufen automatisch oder Start

Stellen Sie Einkäufe nicht automatisch wieder her, insbesondere wenn Ihre App gestartet wird. Durch das Wiederherstellen von Einkäufen werden Sie aufgefordert, die Anmeldeinformationen des App Store einzugeben, wodurch der Fluss Ihrer App unterbrochen wird.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text =% 20Completed% 20Transactions wiederherstellen, von% 20your% 20app's% 20completed% 20transactions.

Ich habe es so implementiert, dass die Quittung an das Backend gesendet wird, wenn der Benutzer auf Kauf drückt oder Kauf wiederherstellt. Dann kann das Backend der App in Zukunft den Abonnementstatus geben.

Apple rät uns weiterhin, diese Funktion in der App nicht automatisch aufzurufen oder zu starten

Stellen Sie Einkäufe nicht automatisch wieder her, insbesondere wenn Ihre App gestartet wird. Durch das Wiederherstellen von Einkäufen werden Sie aufgefordert, die Anmeldeinformationen des App Store einzugeben, wodurch der Fluss Ihrer App unterbrochen wird.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text =% 20Completed% 20Transactions wiederherstellen, von% 20your% 20app's% 20completed% 20transactions.

Ich habe es so implementiert, dass die Quittung an das Backend gesendet wird, wenn der Benutzer auf Kauf drückt oder Kauf wiederherstellt. Dann kann das Backend der App in Zukunft den Abonnementstatus geben.

Wie erhalten Sie bei einem Abonnement mit automatischer Verlängerung die neueste Quittung, ohne sie vom Client hochzuladen?

Durch Ausführen einer regelmäßigen Abfrage im Backend, die jeden Kauf wie folgt regelmäßig überprüft. Nehmen Sie dann die neueste Quittung aus der Überprüfung (die von Google / Apple Server stammt) und speichern Sie sie zurück in der Datenbank.

Durch Ausführen einer regelmäßigen Abfrage im Backend, die jeden Kauf wie folgt regelmäßig überprüft. Nehmen Sie dann die neueste Quittung aus der Überprüfung (die von Google / Apple Server stammt) und speichern Sie sie zurück in der Datenbank.

Hallo @mifi Danke für die schnelle Antwort! Ich habe die latestReceipt nach der ursprünglichen Transaktion auf dem Server gespeichert. Wenn Sie also mit dem ursprünglichen latestReceipt wird ein neuer latestReceipt zurückgegeben?

Ja, die iap.validate -Funktion im Backend ruft die Apple- / Google-APIs auf, die die neueste Quittung zurückgeben. Dies ist leicht zu erkennen, wenn erneuerbare Abonnements mit einem Entwicklungsintervall (5 Minuten pro Abonnementzeitraum) getestet werden.

Danke @mifi Das hat mir wirklich geholfen zu verstehen! Es schien nur seltsam, die "neueste Empfangsbestätigung" zu senden, um die "neueste Empfangsbestätigung" zu erhalten.

Hey, es sieht so aus, als ob in letzter Zeit keine Aktivitäten zu diesem Thema stattgefunden haben. Wurde das Problem behoben oder erfordert es immer noch die Aufmerksamkeit der Community? Dieses Problem kann geschlossen werden, wenn keine weitere Aktivität auftritt. Sie können diese Ausgabe auch als "Zur Diskussion" oder "Gute erste Ausgabe" bezeichnen, und ich werde sie offen lassen. Vielen Dank für Ihre Beiträge.

Schließen dieses Problems nach längerer Inaktivität. Wenn dieses Problem in der neuesten Version noch vorhanden ist, können Sie ein neues Problem mit aktuellen Informationen erstellen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen