【问题标题】:Restoring in app purchase issues恢复应用内购买问题
【发布时间】:2014-08-03 11:45:48
【问题描述】:

我已成功实施我的广告移除非消耗性应用内购买。我读到我的应用程序中还必须有一个“恢复”按钮。在过去的两天里,我尝试实现一个恢复功能,阅读了 stackoverflow 上的所有其他帖子,但对我没有任何帮助。当按下恢复按钮时,它会按预期要求电子邮件和密码,但即使我以前没有在该 Apple ID 上购买过产品,它仍然会恢复它。下面是我正在使用的代码。任何帮助将不胜感激!

- (IBAction)RestoreProduct:(id)sender {


[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

NSLog(@"Calling Restore");

_restoreButton.enabled = NO;

_productTitle.text = [NSString stringWithFormat:@"Checking for product"];


}




- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Calling First Function");
NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];

NSLog(@"received restored transactions: %i", queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions)
{
    NSString *productID = transaction.payment.productIdentifier;
    [purchasedItemIDs addObject:productID];
    NSLog(@"This Part");
    [self unlockFeature];
    _productTitle.text = [NSString stringWithFormat:@"Purchase Restored!"];
}

}




- (void)paymentQueue:(SKPaymentQueue*)queue restoreCompletedTransactionsFailedWithError:    (NSError*)error
{
NSLog(@"error");
}

编辑。

好的,这是我从恢复按钮到@end 的所有代码。

- (IBAction)RestoreProduct:(id)sender {


[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

NSLog(@"Calling Restore");

_restoreButton.enabled = NO;

_productTitle.text = [NSString stringWithFormat:@"Checking for product"];


}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Calling First Function");
NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];

NSLog(@"received restored transactions: %i", queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions)
{
    NSString *productID = transaction.payment.productIdentifier;
    [purchasedItemIDs addObject:productID];
    NSLog(@"This Part");

}

}

- (void)paymentQueue:(SKPaymentQueue*)queue restoreCompletedTransactionsFailedWithError:    (NSError*)error
{
NSLog(@"error");
}

#pragma mark -
#pragma mark SKPaymentTransactionObserver

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{

for (SKPaymentTransaction *transaction in transactions)
{
    switch (transaction.transactionState) {
        case SKPaymentTransactionStatePurchased:
            [self unlockFeature];
            _productTitle.text = [NSString stringWithFormat:@"Purchase Complete!"];
            [[SKPaymentQueue defaultQueue]
             finishTransaction:transaction];
            break;

        case SKPaymentTransactionStateFailed:
            NSLog(@"Transaction Failed");
            [[SKPaymentQueue defaultQueue]
             finishTransaction:transaction];
            break;

        default:
            break;
    }
}
}

-(void)unlockFeature
{
_buyButton.enabled = NO;
[_buyButton setTitle:@"Purchased"
            forState:UIControlStateDisabled];
[_homeViewController enableLevel2];
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
_buyButton.enabled = NO;
_restoreButton.enabled = NO;
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

【问题讨论】:

    标签: ios in-app-purchase


    【解决方案1】:

    我有一个按钮调用

    + (void)restoreABC
    {
        NSLog(@"Restore Purchases");
       [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    }
    

    我猜你的问题是你也在打电话

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    

    就在上面:

    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    

    删除第一行,你可能就可以开始了。

    编辑: 根据下面的 cmets,听起来 [self unlockfeature] 行是罪魁祸首:-)

    编辑#2:

    添加

        case SKPaymentTransactionStateRestored:
            NSLog(@"Feature Previously Purchased");
            [self unlockFeature];
            break;
    

    -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    

    【讨论】:

    • 我删除了那行,它仍然做同样的事情。问题不在于它不会恢复购买,而是即使用户尚未付款也会恢复它。
    • 那么您是通过在 iTunes Connect 中创建一个全新的测试器来测试它吗?当新测试仪点击恢复按钮时,它会自动解锁您的非消耗品?这次我理解你了吗?
    • 是的,我创建了一个新的测试人员,进入应用程序,点击恢复,输入电子邮件和密码,然后恢复购买。
    • 除了那一行之外,我没有看到您的代码有任何问题。代码中的其他任何地方都调用了 unlockFeature 吗?您如何跟踪在本地购买了哪些功能?
    • 解锁功能是正在恢复的实际产品。我认为我放置 [self unlockFeature] 的部分是它检查产品是否以前购买过的部分。如果没有 unlockFeature 部分,它什么也不做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多