我已在我的应用中实施了应用内购买,我有两个问题。这是我使用的代码:
- (IBAction)buyProduct1:(id)sender {
SKPayment *payment = [SKPayment paymentWithProduct:product1];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (IBAction)restorePurchases:(id)sender {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStatePurchased:
//Can I be 100% sure that this method is only called when the product is bought?
[self product1Bought:transaction];
break;
case SKPaymentTransactionStateRestored:
//What code should I have here to safely restore product1 if the product is bought?
break;
case SKPaymentTransactionStateFailed:
break;
default:
break;
}
}
}
- (void)product1Bought:(SKPaymentTransaction *)transaction {
NSString *string = @"Product1";
[[NSUserDefaults standardUserDefaults] setObject:string forKey:@"Product1"];
NSLog(@"Product1 is bought");
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
1.我只是想知道我是否可以100%确定productBought方法仅在成功购买后调用,而不是如果发生任何奇怪的事情并且产品没有真正购买?
2.如何检查product1是否早先购买,以便我可以调用product1Bought方法?
答案 0 :(得分:2)
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
if ([queue.transactions count] == 0)
{
UIAlertView *restorealert = [[UIAlertView alloc]
initWithTitle:@"Restore"
message:@"There is no products purchased by you"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[restorealert show];
activityIndicator.hidden = YES;
}
else
{
NSString *productID;
for(SKPaymentTransaction *transaction in queue.transactions)
{
productID = transaction.payment.productIdentifier;
NSLog(@"the product identifier is %@",productID);
}
在完成恢复后,您可以获得您购买的productId
答案 1 :(得分:1)
1)工作正常,用户购买时数据可用
2)对于早期购买的商品,您可以在SKPaymentTransactionStateRestored下调用此方法:
[self RestorePurchases];
-(void)RestorePurchases{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}