Je travaille actuellement sur la mise en œuvre des achats intégrés dans mon application et après la restauration des achats, je souhaite appeler un achèvement pour effectuer une action d'affichage d'une alerte à l'utilisateur. Je le faisais de cette façon et j'ai trouvé un message qui dit qu'il pourrait même ne pas être exécuté. Comment puis-je structurer cela correctement.
func restoreIAPPurchases(completion: (() -> Void)) { if !self.canMakePayments { return } self.paymentQueue.restoreCompletedTransactions() completion() } let alertController = UIAlertController.vy_alertControllerWithTitle(nil, message: "Restore will reprocess your existing subscription. You will not be charged", actionSheet: false) alertController.addAction("Ok") alertController.addActionWithTitle("Restore", style: .default) { IAPService.shared.restoreIAPPurchases { UIAlertController.vy_showAlertFrom(self, title: "Restore complete", message: "Successfully restored purchase") } } alertController.presentFrom(self)
3 Réponses :
Le résultat est asynchrone ici
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error)
ou
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue)
Cela ne sert à rien
ici, vous n'avez pas besoin d'une complétion, vous devez vérifier le résultat de la restauration avec les méthodes ci-dessus
Tout ce que je veux, c'est afficher un Si les achats ont été restaurés
C'est tout. Je ne vois pas pourquoi je dois le faire de cette façon.
car ce processus est asynchrone pour contacter les serveurs Apple, insérez votre alerte succès / échec selon la méthode appelée ci-dessus
Supposons que j'écris du code de connexion et que j'aie besoin d'un Hander d'achèvement pour attendre / rappeler une fois la demande terminée. / pre>
// MARK: - appelle la méthode de connexion avec le gestionnaire de complétion.
func login(withViewControler viewController : UIViewController, completionHandler : @escaping (_ result : AnyObject?, _ error : NSError?) -> Void) { // Write your logic here. }
"Je le faisais de cette façon et j'ai trouvé un message qui dit qu'il pourrait même ne pas être exécuté"
Il peut ne pas être exécuté car vous n'appelez pas le gestionnaire d'achèvement sur tous les chemins.
Comme Sh_Khan l'a mentionné dans sa réponse, vous n'avez pas vraiment besoin d'un gestionnaire de complétion ici, vous devez utiliser les méthodes de délégué pour être informé quand il se termine et s'il a réussi ou non. Mais votre problème particulier avec votre code spécifique est que vous n'appelez pas la complétion dans l'instruction if.
guard canMakePayments else { completion() return }Cela devrait probablement être
XXXDans le code que vous aviez, si canMakePayments est faux, votre code de complétion ne s'exécutera pas.
plz après la méthode restoreCompletedTransactions.
il peut ne pas revenir à cause de
if! self.canMakePayments {return}
. Vous revenez et n'appelez pas le gestionnaire d'achèvement@Bista est une fonction intégrée dans
iOS
que vous pouvez appeler@Scriptable
if! Self.canMakePayments {return}
vérifie uniquement si un modèle d'appareil actuel prend en charge les paiementspeu importe ce qu'il vérifie ... il n'appelle pas l'achèvement. serait probablement mieux si la complétion était
((Bool) -> Void
alors vous pourriez faireif! self.canMakePayments {completion (false) return}
ou mieux ... < code> guard canMakePayments else {completion (false) return}@Scriptable et quelle ligne ou où mettriez-vous
completion (true)
?Il existe des spécifiques fonctions qui sont appelées lorsque le processus de restauration est terminé. Ainsi que dans votre instruction
if
(qui serait plus agréable en tant queguard
), vous devez appeler votre gestionnaire de complétion à partir de ces deux rappels