首页 文章

苹果拒绝因为In app购买没有实现恢复[关闭]

提问于
浏览
16

苹果公司拒绝了我的一条消息:

...此外,我们发现当您的应用提供可以恢复的应用内购买时,它不包括所需的“恢复”功能,以允许用户恢复以前购买的应用内购买,如应用程序内购买编程指南的“恢复事务”部分所述:“......如果您的应用程序支持必须可恢复的产品类型,则必须包含允许用户恢复这些购买的界面 . 此界面允许用户将产品添加到其他设备,或者,如果原始设备被擦除,则恢复原始设备上的交易 . “要恢复以前购买的应用程序内购买产品,提供“恢复”按钮并在用户点击“恢复”按钮时启动恢复过程是合适的 . 有关恢复事务和验证商店收据的更多信息,请参阅应用程序内购买编程指南 . ...

我发现这个page,我按照示例代码,但在我打电话后

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

另一位代表没有被解雇!

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue

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

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

关于我的代码有什么问题的任何想法?

2 回答

  • 18

    除了添加 restoreCompletedTransactions 之外,您还需要处理iap实际还原到用户的方式以及如何向用户提供内容 .

    基本上,您需要回忆起最初购买时向用户提供商品的方式 .

    这是一个很好的教程 .

    对于 example ,这是我在我的某个应用中恢复产品的方式 .

    恢复交易

    - (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];
    }
    
  • 10
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    

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

相关问题