2017-12-08 1 views
1

Wir verwenden automatisch verlängerbare Abonnements, und es funktioniert bis auf den einen Edge-Fall einwandfrei.Wiederherstellen von automatisch verlängerbaren Abonnements nach

Wenn Benutzer ihr iPhone auf die Werkseinstellungen zurücksetzen, ist es ihnen nicht möglich, automatisch verlängerbare Abonnements in unserer App wiederherzustellen (oder so, wie es scheint, haben wir gerade zwei solcher Fälle).

Wir verwenden SwiftyStoreKit, aber ich glaube, dass es einen logischen Fehler auf unserer Seite gibt.

Gerade jetzt sind wir wieder herstellen Einkäufe auf diese Weise:

func checkOldSubscriptions()->Bool { 

    //validator 
    let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: ss) 

     for i in 0..<products.count { 

      //checking every available product in receipt 
      SwiftyStoreKit.verifyReceipt(using: appleValidator, completion: { (result) in 
       switch result { 
        case .success(let receipt): 

       let purchaseResult = SwiftyStoreKit.verifySubscription(
        type: .autoRenewable, 
        productId: products[i].name, 
        inReceipt: receipt) 

        switch purchaseResult { 
         case .purchased(let expiresDate): 
         print("Product is valid until \(expiresDate)") 

     ... 
     } 
     } 

Meine Hypothese ist, dass nach dem Reset wir gerade keine Quittung zu überprüfen, und ich habe es direkt abgerufen werden. Es ist schwierig, das Gerät zu überprüfen, denn ehrlich gesagt habe ich kein echtes Testgerät, das für mich einfach zu töten wäre.

Deshalb möchte ich so etwas hinzufügen (manuell den Empfang erfrischend, bevor Sie versuchen, es zu verifizieren):

SwiftyStoreKit.verifyReceipt(using: appleValidator, forceRefresh: true) { result in 
    switch result { 
    case .success(let receipt): 

Hat es einen Sinn? Wird es helfen?

Antwort

1

Sie haben Recht. Eine Quittung ist nach einem Reset wahrscheinlich nicht verfügbar. Sie müssen restoreCompletedTransactions() auf SKPaymentQueue aufrufen, um Transaktionen abzurufen, die zuvor als abgeschlossen markiert wurden.

Da Sie SwiftyStoreKit verwenden, können Sie SwiftyStoreKit.restorePurchases verwenden. Überprüfen Sie die Dokumentation für Details.

+0

Sind Sie sicher, dass 'restoreCompletedTransactions()' für Abonnements und nicht nur für Nicht-Verbrauchsmaterialien funktioniert? –

+0

danke, aber eigentlich bedeutet es, dass ich falsch liege, und ForceRefresh würde mir nicht helfen, und ich muss stattdessen kaufen. Ich wollte dem entfliehen, weil wir autorenewable Subscriptions verkaufen (und restorePurchases gibt alle Käufe zurück, inklusive abgelaufene), aber es scheint, dass ich hier keine Wahl habe. – lithium

+0

Sie hatten Recht, dass Sie keine Quittung haben, um zu überprüfen;) Wiederherstellen sollte natürlich abgelaufene Käufe enthalten, da Ihr Kunde für diese Woche/Monat/Jahr bezahlt hat. Wenn Ihre Geschäftslogik abgelaufene Einkäufe nicht interessiert, markieren Sie sie als abgeschlossen und fahren Sie fort. Die einzige andere Möglichkeit, dies zu tun, wäre, die Berechtigung des Benutzers in Ihrem Backend zu verwalten. –

Verwandte Themen