Wenn Sie in Ihrem Abonnementantrag Einführungsangebote verwenden (Testversion, Bezahlung während der Nutzung oder Vorauszahlung), müssen Sie die Verfügbarkeit des Einführungsangebots für den Benutzer ermitteln, bevor Sie den Preis auf dem Zahlungsbildschirm anzeigen. Wenn der Benutzer bereits eine Testversion erstellt hat, müssen Sie den vollständigen Preis dafür anzeigen.

Hallo allerseits, ich melde mich bei Renat von Apphud - einem Dienst, der die Arbeit mit Abonnements in iOS-Anwendungen vereinfacht. Heute werde ich Ihnen sagen, wie Sie feststellen können, ob ein einzelner Benutzer das Recht hat, einen Einführungssatz zu aktivieren oder nicht.
Das Einführungsangebot gilt innerhalb derselben Abonnementgruppe. Dies bedeutet, dass der Benutzer ein reguläres wöchentliches Abonnement ohne Testversion ausstellen, sich abmelden und später eine Testversion für ein monatliches Abonnement ausstellen kann.
Die Apple-Dokumentation enthält ein Diagramm, das zeigt, wann dem Benutzer ein einleitender Satz zur Verfügung steht:

Es stellt sich heraus, dass der Benutzer den Einleitungssatz verwenden kann, wenn:
- er hatte vorher keinen einleitenden Satz benutzt
Und
- Das Abonnement wurde entweder nicht ausgestellt oder ist abgelaufen
Um die Verfügbarkeit des Einleitungssatzes zu überprüfen, müssen Sie drei Schritte ausführen:
1) Überprüfen Sie den App Store-Check und ziehen Sie das Array von Transaktionen heraus. Wenn es keine Transaktionen gibt, überprüfen wir nichts, ein einleitender Satz ist verfügbar. Wenn Transaktionen vorhanden sind, führen Sie die folgenden beiden Schritte aus.
2) Überprüfen Sie, ob der Einleitungssatz zuvor verwendet wurde
3) Überprüfen Sie den aktuellen Abonnementstatus
Lassen Sie uns diese Schritte genauer betrachten.
1. Validierung der App Store-Prüfung
Um die Prüfung zu validieren, müssen Sie eine Anfrage an Apple receiptData
und sharedSecret
und sharedSecret
. Ersetzen Sie den sharedSecret
Wert durch Ihren eigenen. Wenn Sie Ihr sharedSecret
nicht kennen, wird hier beschrieben , wo Sie es erhalten.
func isEligibleForIntroductory(callback: @escaping (Bool) -> Void){ guard let receiptUrl = Bundle.main.appStoreReceiptURL else { callback(true) return } #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif let receiptData = try? Data(contentsOf: receiptUrl).base64EncodedString() let sharedSecret = "YOUR_SHARED_SECRET" let requestData = ["receipt-data" : receiptData ?? "", "password" : sharedSecret, "exclude-old-transactions" : false] as [String : Any] var request = URLRequest(url: URL(string: urlString)!) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in
Im obigen Beispiel wird das Makro #if DEBUG
, um den Abonnementtyp zu bestimmen: sandbox
oder production
. Wenn Sie andere Makros verwenden, müssen Sie den Code an dieser Stelle aktualisieren.
2. Überprüfen Sie, ob zuvor ein Einleitungssatz verwendet wurde
Nachdem wir eine Antwort von Apple erhalten haben, übersetzen wir sie in ein Dictionary
und erhalten eine Reihe von Transaktionen:
Wir gehen das Transaktionsarray durch und betrachten die Werte von is_trial_period
und is_in_intro_offer_period
. Wenn einer der Werte true
, hat der Benutzer bereits einen einleitenden Satz verfasst. Diese Werte werden als Zeichenfolge geliefert. Aus Gründen der Zuverlässigkeit werden wir versuchen, den Wert sowohl in Bool als auch in Zeichenfolge zu konvertieren.
3. Überprüfen Sie den aktuellen Status des Abonnements
Um den aktuellen Status des Abonnements zu ermitteln, müssen wir das neueste expires_date
und mit dem aktuellen Datum vergleichen. Wenn das Abonnement nicht abgelaufen ist, ist das Einführungsangebot nicht verfügbar:
Einen Link zum vollständigen Code der Methode finden Sie am Ende des Artikels. Diese Methode enthält jedoch viele "Aber".
Fallstricke
In diesem Beispiel haben wir nur den Fall einer Abonnementgruppe betrachtet. Wenn Sie mehr als eine Abonnementgruppe in einer Anwendung verwenden, müssen Sie die Abonnementgruppen-ID an diese Methode übergeben und sie anhand des Werts der Abonnement-Gruppen- subscription_group_identifier
im receipt
überprüfen.
In diesem Beispiel wird der Fall von Abonnementrückerstattungen nicht berücksichtigt. Überprüfen Sie dazu das Vorhandensein des Felds cancellation_date
:
if receipt["cancellation_date"] != nil{
Und hier wird die Nachfrist (Billing Grace Period) nicht berücksichtigt. Befindet sich der Benutzer zum Zeitpunkt der Überprüfung der Prüfung in der pending_renewal_info
wird grace_period_expires_date
Feld pending_renewal_info
haben. In diesem Fall müssen Sie als Entwickler dem Benutzer Premium-Funktionen bereitstellen, ohne einen Zahlungsbildschirm anzuzeigen. Dementsprechend macht es keinen Sinn, die Verfügbarkeit des Einleitungssatzes zu überprüfen.
Beim Überprüfen des Ablaufdatums ist ein Problem aufgetreten. Die Systemzeit auf dem iOS-Gerät kann abgeschraubt werden, und unser Code führt zu einem falschen Ergebnis: Das Abonnement wird als aktiv betrachtet.
Die Überprüfung einer Überprüfung des Geräts selbst wird von Apple nicht empfohlen. Sie haben mehrmals auf der WWDC darüber gesprochen (ab 5:50 Uhr), und dies ist in der Dokumentation angegeben . Dies ist unsicher, da ein Angreifer Daten mithilfe eines Man-in-the-Middle-Angriffs abfangen kann. Apple empfiehlt, Ihren Server zur Überprüfung von Überprüfungen zu verwenden.
Die Bedingung für die Verfügbarkeit des Werbeangebots ist einfacher - Hauptsache, der Benutzer hat ein aktives oder abgelaufenes Abonnement. pending_renewal_info
Sie dazu nach dem Vorhandensein von pending_renewal_info
für Ihre Abonnementgruppe.
Wie es im Apphud SDK implementiert ist
Es reicht aus, eine Methode aufzurufen und Ihr product
darin zu übergeben, wodurch das Ergebnis an Sie zurückgegeben wird:
Apphud.checkEligibilityForIntroductoryOffer(product: myProduct) { result in if result {
Und ähnlich für das Werbeangebot:
Apphud.checkEligibilityForPromotionalOffer(product: myProduct) { result in if result {
Es gibt auch Methoden, um die Verfügbarkeit mehrerer Produkte gleichzeitig in einem Aufruf zu überprüfen:
func checkEligibilitiesForIntroductoryOffers(products: [SKProduct], callback: ApphudEligibilityCallback) func checkEligibilitiesForPromotionalOffers(products: [SKProduct], callback: ApphudEligibilityCallback)
Fazit
Der vollständige Methodencode kann hier heruntergeladen werden .
Wir bei Apphud haben bereits eine Überprüfung der Verfügbarkeit von Einführungs- und Werbeangeboten in einem praktischen Open-Source-SDK durchgeführt. Apphud hilft Ihnen auch dabei, den Abonnementstatus zu verfolgen, wichtige Messdaten zu analysieren, nicht abonnierten Benutzern automatisch Rabatte anzubieten und vieles mehr. Wenn Sie beim Arbeiten mit Abonnements Schmerzen haben, testen Sie unsere Lösung kostenlos.