Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 删除';旧的';恢复购买交易记录_Ios_Swift_In App Purchase - Fatal编程技术网

Ios 删除';旧的';恢复购买交易记录

Ios 删除';旧的';恢复购买交易记录,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,我一直试图在一个项目中测试Restore Purchases功能,但我不断地遇到这个错误: 忽略RestoreCompletedTransactionWithApplicationUserName:因为 已恢复事务 我删除了一个sandbox tester帐户,我想这是一个仍在支付循环中进行恢复购买的帐户。我意识到我不应该删除一个沙盒测试帐户,但现在已经有点晚了 我能做些什么来清除这个永无止境的循环中捕获的还原事务吗 编辑: 我的修订守则: 漫步前: class InAppPurchaseVie

我一直试图在一个项目中测试Restore Purchases功能,但我不断地遇到这个错误:

忽略RestoreCompletedTransactionWithApplicationUserName:因为 已恢复事务

我删除了一个sandbox tester帐户,我想这是一个仍在支付循环中进行恢复购买的帐户。我意识到我不应该删除一个沙盒测试帐户,但现在已经有点晚了

我能做些什么来清除这个永无止境的循环中捕获的还原事务吗

编辑:

我的修订守则:

漫步前:

class InAppPurchaseViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

let defaults = NSUserDefaults.standardUserDefaults()
var product_id: NSString?;

@IBOutlet weak var unlockAction: UIButton!

override func viewDidLoad() {   
    super.viewDidLoad()

    SKPaymentQueue.defaultQueue().addTransactionObserver(self)   
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
... }
  • 购买:

    @iAction func unlockAction(发件人:AnyObject){

    }

    }

  • 恢复:

    @IBAction func restorePurchases(sender: AnyObject) {
    product_id = "xxxx.iap.removeads";
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
    
    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
    
        for transaction:AnyObject in transactions {
            if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
                switch trans.transactionState {
                case .Restored:
                    SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                    let alert = UIAlertView(title: "Thank You", message: "Your purchase(s) were restored.", delegate: nil, cancelButtonTitle: "OK")
                    alert.show()
                    break;
    
                case .Failed:
                    SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                    let alert = UIAlertView(title: "Sorry", message: "Your purchase(s) could not be restored.", delegate: nil, cancelButtonTitle: "OK")
                    alert.show()
                    break;
    
                default:
                    break;
                }
            }
        }
    }
    
    }


  • 只需创建一个新的测试用户,进行购买,然后测试恢复。苹果公司让在应用程序内购买的测试用户变得非常困难。根据我的经验,我总是创建新的测试用户,因为您不能删除他们的任何旧购买。因此,如果您想对初始购买进行两次测试,则需要两个测试用户

    但对于您的问题,您应该只在该方法中检查一次事务:

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    for(SKPaymentTransaction *transaction in transactions){
        switch(transaction.transactionState){
            case SKPaymentTransactionStateRestored:
                NSLog(@"Transaction state -> Restored");
                //add the same code as you did from SKPaymentTransactionStatePurchased here
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
    
    确保你也有这个:

    - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    {
        NSLog(@"received restored transactions: %lu", (unsigned long)queue.transactions.count);
        for(SKPaymentTransaction *transaction in queue.transactions){
        if(transaction.transactionState == SKPaymentTransactionStateRestored){
            //called when the user successfully restores a purchase
            NSLog(@"Transaction state -> Restored");
    
            //if you have more than one in-app purchase product,
            //you restore the correct product for the identifier.
            //For example, you could use
            //if(productID == kRemoveAdsProductIdentifier)
            //to get the product identifier for the
            //restored purchases, you can use
            //
            //NSString *productID = transaction.payment.productIdentifier;
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
        }
    }
    }
    
    您应该这样调用恢复购买:

    - (IBAction) restore {
    //this is called when the user restores purchases, you should hook this up to a button
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    
    }
    

    希望有帮助

    对不起,我想我已经想得太多了,结果弄糊涂了。我已经添加了
    [[SKPaymentQueue defaultQueue]addTransactionObserver:self]导入
    viewdiload
    部分,并将我的代码修改为我认为可行的代码。我没有完全按照你的指示去做。。。道歉。我上面修改过的代码行得通吗?我不会为购买非消耗品的用户解锁应用程序中的任何功能或级别,只需在我的索引页/登录页的
    viewDidLoad
    部分加载一个检查,确定用户是否购买了应用程序,然后向他们显示广告或其他内容(如果他们购买了无广告浏览)@KatherineJenkins我想你发布的修改后的代码会起作用的。我不是一个很快的开发人员,所以我不知道到底发生了什么,但看起来你拥有所有正确的代理功能,包括哈利路亚!我现在真的要去酒吧喝一加仑啤酒了!哈哈…明天我到办公室时会测试一下:-)
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
    for(SKPaymentTransaction *transaction in transactions){
        switch(transaction.transactionState){
            case SKPaymentTransactionStateRestored:
                NSLog(@"Transaction state -> Restored");
                //add the same code as you did from SKPaymentTransactionStatePurchased here
                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
                break;
    
    - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
    {
        NSLog(@"received restored transactions: %lu", (unsigned long)queue.transactions.count);
        for(SKPaymentTransaction *transaction in queue.transactions){
        if(transaction.transactionState == SKPaymentTransactionStateRestored){
            //called when the user successfully restores a purchase
            NSLog(@"Transaction state -> Restored");
    
            //if you have more than one in-app purchase product,
            //you restore the correct product for the identifier.
            //For example, you could use
            //if(productID == kRemoveAdsProductIdentifier)
            //to get the product identifier for the
            //restored purchases, you can use
            //
            //NSString *productID = transaction.payment.productIdentifier;
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
        }
    }
    }
    
    - (IBAction) restore {
    //this is called when the user restores purchases, you should hook this up to a button
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
    
    }