我在应用程序商店中有很多应用程序,但我的首次应用内购买遇到了问题 . 我正在iPad上测试xcode 5,沙盒中有许多测试用户 . 应用内购买适用于Apple托管的其他视频文件 .

原始购买和视频下载顺利 . 恢复购买正常,但如果我删除应用程序并重新安装它,恢复不起作用 . 但是,在重新安装应用程序之后,如果我进行了回购并通过"Confirm your in-app Purchase" - >“你想购买__?" -> [Environment Sandbox] -> press "在重新安装后没有下载" [Environment Sandbox] -> and press " OK ", then a restore of the purchase works and downloads the videos. My guess is that the repurchase mumbo-jumbo sets a transaction in the transactions queue but a " restoreCompletedTransactions” .

在下面的代码中,当还原不起作用时,仅显示“还原事务开始”和“还原事务结束”日志 . 重新安装应用程序后,“restoreCompletedTransactions”似乎没有找到任何交易 .

我搜索过几十个帖子(Wenderlich,Troy Brant是一个完整的演练等等),但似乎大多数恢复正在重置原始购买附带的内容标记,而不是后续下载或不担心用户删除应用程序释放空间并重新安装 .

期待用户通过“购买” - >“”你已经购买“路线是一个糟糕的解决方案,因为有些人可能害怕他们正在重新购买应用程序 . 唯一的另一种选择是将所有视频放在初始捆绑中然后使用钥匙串重置标志,但这会增加下载的大小 .

任何建议都会受到欢迎 . 如果有人知道将事务添加到事务队列的方法,那将是一种可能的解决方案 .

//按下恢复按钮时调用:

- (void) restoreTapped
{                            
    NSLog (@"Restore transaction START");

    [ [SKPaymentQueue defaultQueue] restoreCompletedTransactions ];

    NSLog (@"Restore transaction END");
}

// SKPaymentTransactionObserver委托方法:

-(void) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentQueue *) queue
{
    NSLog (@"received restored transactions: %i", queue.transactions.count);

    for (SKPaymentTransaction * transaction in queue.transactions)
    {
        [ [SKPaymentQueue defaultQueue] startDownloads : transaction.downloads ];
    }
}


-(void) paymentQueue : (SKPaymentQueue *) queue updatedTransactions : (NSArray *) transactions
{
    for (SKPaymentTransaction * transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased:

                           [omitted]                
                 break;

            case SKPaymentTransactionStateRestored:

                     NSLog (@"Transaction State restored.");
                 break;


            case SKPaymentTransactionStateFailed:

                 NSLog (@"Failed transaction.");
                 [self failedTransaction : transaction];    break;

            default:                                       break;
        }
    }
}