Détection abonnement

Bonjour,
Concernant les abonnements ou autre Iap purchase, j'ai vu tout un tas de tutos, pour déclencher l'achat ou l'abonnement après avoir cliqué sur un bouton ou une ligne de tableview.

Très bien, mais je ne trouve pas comment savoir à l'ouverture d' une app si le user est bien abonné, sans le faire cliquer...

Merci d'avance.

Mots clés:

Réponses

  • Bonjour au bar.

    Apparemment, cela n'intéresse pas grand monde. Comme je vous comprend...
    Je pense aussi m'être assez mal exprimé.

    En gros, il s'agit d'une appli avec abonnement avec renouvellement automatique.
    Xcode 13 - dev pour iOS 13 sur iPad En Swift 5
    Test en sandBox.

    Lorsque l'appli est lancée, j'espère vérifier au départ la date d'expiration pour la comparer à la date du jour et donc, proposer l'accès à l'appli ou l'obligation de s'abonner.

    Pour l'instant j'essaie juste de lire la date après un RESTORE, pour ensuite la stoquer, pour plus tard, la vérifier à l'entrée dans l'appli.

    J'ai essayé des tonnes de code, de vidéos... Je ne m'en sors pas.

    J'ai bien compris qu'il s'agissait du "latest_receipt_info" que l'on extrait à partir d'un json (serialisation, etc.),
    Mais ça bloque.

    Ou mon json est nil ou dans d'autres essais il n'est que json = Optional(["environment": Sandbox, "status": 21003]) et donc pas de latest_receipt_info

    Enfin bref, entre les URLSession.shared.dataTask(with:... OU try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) ET autres gourmandises, je craque.

    Merci d'avance pour une piste éventuelle.

  • Bien l'bonjour,
    Puisque personne n'a de piste (ou de temps), je vais tenter une autre approche.

    RAPPEL
    Il s'agit d'une appli avec abonnement avec renouvellement automatique.
    Xcode 13 - dev pour iOS 13 sur iPad En Swift 5
    Test en sandBox.

    Après avoir parcouru de nombreux forums et vidéos, il me vient quelques questions.

    Peut-on récupérer le reçu d'apple sans avoir un server perso ?

    Pourquoi mon reçu ne contient seulement ["status": 21003, "environment": Sandbox] ?

    Le statut me dit que : Authentication failed, et en résolution : Receipt could not be authenticated
    Est-ce à cause du sandbox ?

    Et j'ai croisé qu'il fallait un code secret pour un abonnement avec renouvellement automatique. Est-ce vrai ?

    Merci d'avance

  • CéroceCéroce Membre, Modérateur

    J'ai travaillé sur le sujet mais il y a tellement longtemps que mes souvenirs sont vagues. Je me rappelle surtout que c'était galère, et que j'y ai passé un temps dingue. Apple a amélioré les choses depuis, mais s'il existe des SaaS qui gèrent ce genre de chose (RevenueCat ?), c'est bien que c'est compliqué.

  • DrakenDraken Membre
    décembre 2021 modifié #5

    J'ai vu ce matin, que le sujet allait être abordé dans une vidéo de PurpleGiraffe. Je te donne le lien vers le post qui en parle.

    https://forum.purplegiraffe.fr/t/achat-in-app-ios

  • busterTheobusterTheo Membre
    décembre 2021 modifié #6

    Ah merci Draken, ça fait du bien...
    Mais pour l'instant, y'a rien.
    Je surveille...

    Ouais Céroce, merci pour le commentaire.
    J'ai croisé revenuCat et d'autres d'ailleurs.
    Mais j'aimerai faire plus simple.
    La galère, tu m'étonnes. Apple pourrait faire plus simple, quoi !

    Je met un bout de code, si ça peut aider.

    Merci d'avance pour d'autres commentaires.

    func validateReceipt() {
        let recURL = Bundle.main.appStoreReceiptURL!
        let contents = NSData(contentsOf: recURL)
        let receiptData = contents!.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    
        let requestContents = ["receipt-data" : receiptData]
    
        let requestData = try? JSONSerialization.data(withJSONObject: requestContents, options: [])
    
        let serverURL = "https://sandbox.itunes.apple.com/verifyReceipt"
    //        let serverURL = "https://buy.itunes.apple.com/verifyReceipt"
        let url = NSURL(string: serverURL)
        let request = NSMutableURLRequest(url: url! as URL)
        request.httpMethod = "POST"
        request.httpBody = requestData
    
            let task = URLSession.shared.dataTask(with: request as URLRequest) { [self] data, response, error in
                DispatchQueue.main.async {
                    if let data = data {
                        print("IAP validateReceipt : data = \(data)")
                        let dataString = String(data: data, encoding: .utf8)
                        print("IAP validateReceipt : dataString = \(dataString)")
    
                        let json = try! JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String, Any>
                        print("IAP validateReceipt : json = \(json)")
    
                        let newExpirationDate = self.expirationDateFromResponse(jsonResponse: json)
                        UserDefaults.standard.set(newExpirationDate, forKey: "expirationDate")
    
                        print("IAP validateReceipt : newExpirationDate = \(newExpirationDate)")
                    }
                }
            }
        task.resume()
    }
    
    
    func expirationDateFromResponse(jsonResponse: Dictionary<String, Any>) -> Date? {
        print("IAP expirationDateFromResponse : jsonResponse = \(jsonResponse)")
        var expirationDate = Date()
        if let receiptInfo: NSArray = jsonResponse["latest_receipt_info"] as? NSArray {
            print("IAP validateReceipt : receiptInfo = \(receiptInfo)")
            let lastReceipt = receiptInfo.lastObject as! Dictionary<String, Any>
    
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss VV"
            expirationDate = (formatter.date(from: lastReceipt["expires_date"] as! String) as Date?)!
        } else {
            print("IAP expirationDateFromResponse PAS DE latest_receipt_info")
        }
    
        return expirationDate
    }
    

    Et j'ai ça après abonnement ou restore :
    IAP expirationDateFromResponse PAS DE latest_receipt_info
    Pas de "latest_receipt_info"

  • klogklog Membre
    décembre 2021 modifié #7

    Comme Céroce, mes souvenirs sur la question sont vagues... désolé...
    Au cas où ce serait utile, j'utilise Receigen pour générer mon code de validation.

  • Ah, super, Klog. Merci.

    J'ai fait un peu le tour, ça a l'air quand même compliqué.
    cocoaPods, openSsl, lignes de commandes Terminal - Ouaah !

  • busterTheobusterTheo Membre
    décembre 2021 modifié #9

    Depuis le début, je cherche la date d'expiration de l'abonnement (à renouvellement automatique), pour ensuite la comparer à la date du jour, pour aller sur l'app ou sur la page d'abonnement.

    Mais je me pose la question :
    Si j'utilise plutôt un abonnement à renouvellement PAS automatique, le user devra tous les mois se réabonner.
    Est-ce que Apple bloque l'app (présente dans liPad du user) si l'abonnement n'est pas renouvelé ?

    Et d'autre part, dans le cas d'un abonnement à renouvellement automatique, à quoi cela sert-il de vérifier la date d'expiration ?

    Le user télécharge l'app avec abonnement (auto ou pas) à partir de l'appStore, et donc sera prélevé.
    Pourquoi vérifier quoique ce soit ?

    Merci.

  • LarmeLarme Membre
    décembre 2021 modifié #10

    Perso, j'en ai jamais fait de IAP, c'est pour ça que je ne suis intervenu...
    Regarde peut-être du côté de StackOverflow, au moins pour poser la question ?
    Je sais qu'il y a quelques libs externes pour essayer de faciliter ça vu que c'est un peu galère en soit les IAP.

    Maintenant, c'est pas problématique, mais évite les NSTruc quand Truc existe sur StackOverflow:
    NSURL => URL, NSData -> Data, etc.

  • @Larme a dit :
    Maintenant, c'est pas problématique, mais évite les NSTruc quand Truc existe sur StackOverflow:
    NSURL => URL, NSData -> Data, etc.

    Fix:
    quand Truc existe en Swift

  • Merci Larme.

    Mais comment on peut publier une appli avec abonnement sans inapp ?

    StackOverflow je l'ai explorer à fond.
    Et les libs externes, trop galère pour moi.

    Et OK pour plus de NS quand ça existe.

    J'ai ouvert une discussion pour trouver un pro des inapp...
    https://cocoacafe.fr/index.php?p=/discussion/16237/sous-traitance-code-inapp-abonnement#latest

  • Bonjour, je reviens pour donner une piste à ceux qui galèrent sur ce sujet.
    Tout y est expliqué.

Connectez-vous ou Inscrivez-vous pour répondre.