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