【问题标题】:Apple reject because of In app purchase not implement restore [closed]苹果拒绝因为应用内购买未实施恢复[关闭]
【发布时间】:2012-06-26 03:37:21
【问题描述】:

我被 Apple 拒绝,并显示一条消息:

...此外,我们发现虽然您的应用提供应用内购买 可以恢复的,不包括所需的“恢复” 允许用户恢复之前购买的应用内的功能 购买,如恢复交易部分所述 应用内购买编程指南:

"...如果您的应用程序支持必须支持的产品类型 可恢复,您必须包含一个允许用户恢复的界面 这些购买。该界面允许用户将产品添加到 其他设备,或者,如果原始设备已被擦除,则恢复 在原始设备上进行交易。”

要恢复以前购买的应用内购买产品,它会 适合提供“恢复”按钮并启动恢复 用户点击“恢复”按钮时的处理。

有关恢复交易和验证商店的更多信息 收据,请参阅应用内购买编程指南。 ...

我发现了这个page,我按照示例代码进行操作,但是在我调用之后

- (void) checkPurchasedItems{
   [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

另一个代表没有被解雇!

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

它只会弹出一个警报视图,让您输入您的 Apple ID ...但什么也没发生?

我设置了一个断点,但它不会像示例所说的那样停止。

对我的代码有什么问题有任何想法吗?

【问题讨论】:

标签: iphone objective-c in-app-purchase restore


【解决方案1】:

除了添加restoreCompletedTransactions,你还需要处理你的iaps是如何实际恢复给用户的,以及内容是如何提供给用户的。

基本上,您需要回忆一下您在用户最初购买商品时向他们提供商品的方式。

Here is a good tutorial.

对于示例,这是我在我的一个应用中恢复产品的方式。

恢复事务

- (void)restoreTransaction:(SKPaymentTransaction *)transaction
{
    isRestoring = YES;

    [self recordTransaction: transaction];

    /* This is where I provide the content to the user: */
    [self provideContent: transaction.originalTransaction.payment.productIdentifier];

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

交易完成

- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
    [self recordTransaction: transaction];
    [self provideContent: transaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

支付队列

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed:
                if (transaction.error.code == SKErrorPaymentCancelled) {
                    /// user has cancelled
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"hideRestoring" object:nil];
                }
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:transaction];
            default:
                break;
        }
    }
}

提供内容

- (void)provideContent:(NSString *)productIdentifier
{
    int index;

    NSMutableDictionary * purchased = [NSMutableDictionary dictionaryWithContentsOfFile:EXTRAS_PATH];

    NSArray * availableProducts = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:SCANNER_IN_APP_PURCHASES]];

    if ( isRestoring )
    {
        for ( index = 0; index < [availableProducts count]; index++ )
        {
            //NSLog(@"productIdentifier: %@",productIdentifier);
            //NSLog(@"Product: %@",[availableProducts objectAtIndex:index]);

            if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
            {
                [purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];

                [purchased writeToFile:EXTRAS_PATH atomically:YES];

                [_purchasedProducts addObject:productIdentifier];
            }
        }
    }
    else
    {
        index = [[[NSUserDefaults standardUserDefaults] objectForKey:@"kTempProductPurchasingIndex"] intValue];

        if ( [productIdentifier isEqualToString:[[availableProducts objectAtIndex:index] objectForKey:@"BundleID"]] )
        {
            [purchased setObject:[availableProducts objectAtIndex:index] forKey:productIdentifier];

            [purchased writeToFile:EXTRAS_PATH atomically:YES];

            [_purchasedProducts addObject:productIdentifier];
        }
    }

    [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];
}

【讨论】:

  • 谢谢先生,我现在就试试你的示例代码。
  • 好吧,我的代码实际上并不能帮助您解决问题。不过,我的建议应该是,回想一下您最初提供购买时使用的方法。
  • 我知道,只需要在我的代码中编辑一些地方。
  • @WrightsCS,我上传了一个应用程序,其中有 1 个应用程序内购买被接受。并上传了一个有 23 次应用内购买被拒绝的应用。我们应该添加“恢复”按钮的应用内购买数量有什么规定吗?
【解决方案2】:
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

也添加上一行。你的 paymentQueueRestoreCompletedTransactionsFinished 函数应该被调用。

【讨论】:

  • 您的答案是正确的,但更详细的解决方案是@WrightsCS 的答案。所以我投票赞成您的答案,对此感到抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2012-03-26
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多