StackOverflow hat noch viele Fragen zur Validierung der App Store-Prüfungen. Daher haben wir beschlossen, einen Artikel zu diesem Thema in einem Frage-Antwort-Format zu verfassen.

Was ist ein App Store-Check?
Dies ist eine verschlüsselte Datei im PKCS # 7-Format, die Informationen zu allen Käufen in der Anwendung enthält. Es befindet sich im Anwendungspaket und kann einfach unter folgender Bundle.main.appStoreReceiptURL
abgerufen werden: Bundle.main.appStoreReceiptURL
.
Gibt es immer diese Datei?
Wenn die Anwendung aus dem App Store heruntergeladen wurde, dann ja, immer. Und wenn es über Xcode oder Testflight installiert wurde, hat die Anwendung zunächst keine Sandbox-Prüfung bis zum ersten Kauf oder zur Wiederherstellung der Prüfung.
Was bedeutet es, "einen Scheck zu validieren"?
Dies bedeutet, die Datei zu entschlüsseln, das JSON-Datum zu erhalten und die vom Benutzer getätigten Käufe zu überprüfen. Sie können dies lokal oder durch Senden einer Anfrage an Apple tun.
In welchen Fällen benötigt ein Entwickler die Validierung eines Schecks?
Um einen gerade abgeschlossenen Kauf zu validieren.
Wenn viele einen Jailbreak hatten, war dies relevant: Es gab Dienstprogramme für die Fälschung eines Schecks. Jetzt ist dieses Problem nicht mehr akut, weil Jailbreak zu einer Seltenheit geworden ist.
Beim Wiederherstellen von Einkäufen.
Wenn ein Benutzer Ihre Anwendung neu installiert oder von einem anderen Gerät aus startet, müssen Sie ihm Zugriff auf die Funktionen gewähren, für die er bereits bezahlt hat. Nachdem Sie den App Store-Check entschlüsselt haben, können Sie feststellen, ob ein In-App-Kauf gekauft wurde.
Beim Kauf von Abonnements mit automatischer Verlängerung.
So ermitteln Sie den aktuellen Abonnementstatus und das Ablaufdatum.
Welche Einkäufe können während der Validierung wiederhergestellt werden?
Es gibt 4 Arten von In-App-Käufen:
- Verbrauchsmaterialkäufe
- Einkäufe ohne Verbrauchsmaterial
- nicht erneuerbare Abonnements
- Automatisch erneuerbare Abonnements
Sie können alles außer ausgegebenen Einkäufen wiederherstellen. Dazu gehören beispielsweise Münzen in Ihrer Anwendung - etwas, das Sie so oft kaufen können, wie Sie möchten. Sie müssen die aktuelle Anzahl der Münzen beim Benutzer auf Ihrem Server speichern.
Welche Validierungsmethoden gibt es?
Es gibt drei davon:
- lokale Validierung mit OpenSSL,
- On-Demand-Validierung durch Apple direkt von einem iOS-Gerät aus,
- On-Demand-Validierung durch Apple über Ihren Server.
Welche Validierungsmethode ist besser?
Die lokale Validierung ist komplex und erfordert viel Zeit und Mühe bei der Implementierung. Sie müssen Ihrem Projekt auch die OpenSSL-Bibliothek hinzufügen. In einigen Fällen müssen Sie die Prüfung aktualisieren.
Apple empfiehlt nicht, die Überprüfungen auf dem iOS-Gerät selbst zu überprüfen. Dies ist nicht sicher: Eine Anfrage kann mit einem Man-in-the-Middle-Angriff abgefangen werden.
Es ist am besten, Überprüfungen auf dem Server zu überprüfen. Darüber hinaus fügt Apple dort gelegentlich neue Felder hinzu, z. B. grace_period_expires_date
und subscription_group_identifier
. Auf unserem Server können wir schnell Änderungen vornehmen, ohne die Anwendung zu aktualisieren. Die beiden vorherigen Validierungsmethoden lassen sich leicht täuschen, indem Sie einfach die Systemzeit auf dem iOS-Gerät ändern.
Wofür ist Shared Secret?
Dies ist eine spezielle Schlüsselzeile, die zum Entschlüsseln von Schecks mit automatisch erneuerbaren Einkäufen erforderlich ist. Apple verwendet das gemeinsame Geheimnis als Parameter in der HTTPS-Anforderung an Apple.
Wo bekomme ich Shared Secret?
Gehen Sie zum App Store Connect, öffnen Sie die Anwendung, wechseln Sie zur Registerkarte Funktionen. Im Abschnitt Integrierte Einkäufe wird der freigegebene Schlüssel für die Anwendungsschaltfläche angezeigt. Generieren Sie einen neuen Schlüssel, falls dies noch nicht geschehen ist.
Beispielcode zur Validierung eines Schecks
func validateReceipt(){ #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif guard let receiptURL = Bundle.main.appStoreReceiptURL, let receiptString = try? Data(contentsOf: receiptURL).base64EncodedString() , let url = URL(string: urlString) else { return } let requestData : [String : Any] = ["receipt-data" : receiptString, "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : false] let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in
Dies ist ein Beispiel für die Überprüfung einer Prüfung unter iOS. Denken Sie daran, den Wert von YOUR_SHARED_SECRET
durch Ihr gemeinsames Geheimnis zu ersetzen.
Konvertieren Sie die data
nach dem Empfang in ein Dictionary
:
DispatchQueue.main.async { if let data = data, let jsonData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){
Beispiel für einen entschlüsselten App Store-Beleg
Hier sehen Sie ein Beispiel für einen Scheck mit zwei Transaktionen in einer Anwendung mit einem automatisch erneuerbaren Abonnement.
Was sind die Unterschiede zwischen in_app
und latest_receipt_info
?
latest_receipt_info
enthält alle Transaktionen, einschließlich der Erneuerung von automatisch erneuerbaren Einkäufen. Sie sollten nur dieses Array verwenden.
in_app
enthält Transaktionen von nicht in_app
Einkäufen und nicht erneuerbaren Abonnements. Die erste Transaktion Ihres Abonnements mit automatischer Verlängerung wird hier ebenfalls dupliziert. Verbrauchbare Einkäufe werden ebenfalls im Array in_app
, verschwinden jedoch, wenn der Entwickler die Transaktion abschließt.
Fazit
Wir bei Apphud haben die Validierung der App Store-Prüfungen für Anwendungen mit automatisch erneuerbaren Abonnements in einem praktischen Open-Source-SDK implementiert. 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.