Je souhaite vérifier l'état de l'abonnement renouvelable automatiquement chaque fois que j'ouvre l'application.
Il s'agit de s'assurer que l'utilisateur est toujours abonné au service. Comment puis-je y parvenir?
Des pensées? Je vous remercie
P.S .: J'utilise SwiftyStoreKit
Voici plusieurs façons de valider le reçu pour vérifier si l'utilisateur est autorisé à s'abonner. Voici deux façons de le faire correctement:
Faites la validation du reçu à distance comme il est écrit ici . Il est mentionné que le reçu ne doit pas être envoyé à l'App Store blanc une application. Court résumé:
Dans les deux cas, vous obtiendrez la liste des achats intégrés. Il contiendra également des abonnements expirés. Vous devez parcourir tous les abonnements et vérifier les dates d'expiration. S'il est toujours valide, vous devez accorder à l'utilisateur un abonnement.
Si je comprends bien, vous utilisez SwiftyStoreKit et voici une tâche ouverte pour validation de réception locale .
Vous pouvez vérifier avec cette fonction. ses travaux avec Swift4
func receiptValidation() {
let SUBSCRIPTION_SECRET = "yourpasswordift"
let receiptPath = Bundle.main.appStoreReceiptURL?.path
if FileManager.default.fileExists(atPath: receiptPath!){
var receiptData:NSData?
do{
receiptData = try NSData(contentsOf: Bundle.main.appStoreReceiptURL!, options: NSData.ReadingOptions.alwaysMapped)
}
catch{
print("ERROR: " + error.localizedDescription)
}
//let receiptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
let base64encodedReceipt = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions.endLineWithCarriageReturn)
print(base64encodedReceipt!)
let requestDictionary = ["receipt-data":base64encodedReceipt!,"password":SUBSCRIPTION_SECRET]
guard JSONSerialization.isValidJSONObject(requestDictionary) else { print("requestDictionary is not valid JSON"); return }
do {
let requestData = try JSONSerialization.data(withJSONObject: requestDictionary)
let validationURLString = "https://sandbox.iTunes.Apple.com/verifyReceipt" // this works but as noted above it's best to use your own trusted server
guard let validationURL = URL(string: validationURLString) else { print("the validation url could not be created, unlikely error"); return }
let session = URLSession(configuration: URLSessionConfiguration.default)
var request = URLRequest(url: validationURL)
request.httpMethod = "POST"
request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData
let task = session.uploadTask(with: request, from: requestData) { (data, response, error) in
if let data = data , error == nil {
do {
let appReceiptJSON = try JSONSerialization.jsonObject(with: data)
print("success. here is the json representation of the app receipt: \(appReceiptJSON)")
// if you are using your server this will be a json representation of whatever your server provided
} catch let error as NSError {
print("json serialization failed with error: \(error)")
}
} else {
print("the upload task returned an error: \(error)")
}
}
task.resume()
} catch let error as NSError {
print("json serialization failed with error: \(error)")
}
}
}
Je voulais fournir une solution alternative qui utilise le RevenueCat SDK pour ceux qui butent encore sur cette question.
AppDelegate.Swift
Configurez RevenueCat Achats SDK avec votre clé api un identifiant utilisateur facultatif.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Purchases.configure(withAPIKey: "<...>", appUserID: "<...>")
...
return true
}
Fonction d'état de l'abonnement
La fonction ci-dessous vérifie le PurchaserInfo
pour voir si l'utilisateur a toujours un "droit" actif (ou vous pouvez vérifier directement un ID de produit actif).
func subscriptionStatus(completion: @escaping (Bool)-> Void) {
Purchases.shared.purchaserInfo { (info, error) in
// Check if the purchaserInfo contains the pro feature ID you configured
completion(info?.activeEntitlements.contains("pro_feature_ID") ?? false)
// Alternatively, you can directly check if there is a specific product ID
// that is active.
// completion(info?.activeSubscriptions.contains("product_ID") ?? false)
}
}
Obtenir l'état de l'abonnement
Vous pouvez appeler la fonction ci-dessus aussi souvent que nécessaire, car le résultat est mis en cache par le Achats SDK il reviendra de manière synchrone dans la plupart des cas et ne nécessitera pas de demande réseau.
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
subscriptionStatus { (subscribed) in
if subscribed {
// Show that great pro content
}
}
}
Si vous utilisez SwiftyStoreKit, la syntaxe RevenueCat est assez similaire et il y a un guide de migration disponible pour vous aider à basculer.