SKPaymentTransactionStatePurchased rief mehrere Male durch Fehler
Ich mache einen in-app Kauf, aber ich habe einen bug, ich kann nicht finden wo es herkommt...
Erste von allen, ich habe einen button und wenn Sie darauf klicken, wird meine app-Anforderung des Produkts, fängt die Antwort, Sie zahlen, und Sie bekommen das Produkt (funktioniert alles OK).
Aber hier kommt mein problem. Wenn ich auf die Schaltfläche klicke, um etwas zu kaufen wieder, bekomme ich ZWEI Warnungen, die ich etwas gekauft, ZWEI mal. Auch wenn ich Sie zum Dritten mal, bekomme ich DREI Warnungen, dass ich etwas gekauft, mal DREI, und vier und fünf nach der Anzahl der Male, die ich angeklickt.
So scheint es, wie einige variable hält die Speicherung der Anfragen.. Hier ist mein code:
Dies bestätigt die Produkt-ID
- (void) validateProductIdentifiers
{
NSString *monedas = @" ID FROM PRODUCT ";
NSSet *product = [NSSet setWithObject:monedas];
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:product];
productsRequest.delegate = self;
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[productsRequest start];
NSLog(@"STARTED REQUEST");
}
Dieser verarbeitet die Antwort von Apple
- (void)productsRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response
{
productsRequest=nil;
int found=0;
SKProduct *paraPagar;
skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
NSLog(@"Found product: %@ %@ %0.2f",
skProduct.productIdentifier,
skProduct.localizedTitle,
skProduct.price.floatValue);
found=1;
paraPagar = skProduct;
}
if (found==1){
payment = [SKMutablePayment paymentWithProduct:paraPagar];
payment.quantity = 1;
[[SKPaymentQueue defaultQueue]addPayment:payment];
}else{
//error (not relevant code)
}
}
Die Annahme von Zahlungen und finishing-Transaktion
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
NSLog(@"BOUGHT");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
NSLog(@"FAILED");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[self failedTransaction];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"RESTORED");
//[self restoreTransaction:transaction];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
case SKPaymentTransactionStatePurchasing:
NSLog(@"PURCHASING");
default:
break;
}
}
}
Danken Ihnen sehr für Ihre Zeit!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mein problem war, dass der Beobachter wurde dupliziert jedes mal, wenn ich auf den button geklickt haben oder wenn ich Ihre Ansichten geändert.
Die Lösung ist das hinzufügen einer flag, um zu sehen, wenn der Beobachter hat bereits Hinzugefügt.
Ich hatte das gleiche problem, würde ich auf kaufen auf einem IAP und erhält mehrere Antworten und Käufe von Apple.
addTransactionObserver()
aufgerufen wurde jedes mal, wenn ich ging, und kam zurück, um den Blick überviewDidLoad()
.Musste ich un-beobachten Sie es in
viewWillDisappear()
:Konnte ich nicht verwenden, ein flag, um zu verhindern, dass mehrere Beobachter, wie in mursang Antwort, denn ich habe für Transaktionen in anderen Ansichten.
Sind Sie Erinnerung zu rufen
wenn der Kauf abgeschlossen ist ?
Swift 3: Laut @sponrad Antwort
[addTransactionObserver]
sollte nur einmal durchgeführt werden.damit können Sie das singleton-Muster, um dieses problem zu lösen.