如果我的服务器失败并且无法提供内容,如何取消应用程序内购买? (IOS)

时间:2012-02-08 16:18:43

标签: objective-c ios in-app-purchase

我正在iOS上的应用程序购买中实现,我的服务器将在用户购买项目时提供对某些内容的访问。我有一切工作,包括让服务器在提供对内容的访问权限之前验证购买的收据。

但是,如果由于某种原因,该应用程序无法向我的服务器注册该交易(例如,由于服务器中断),我想取消该交易,以便iTunes不向用户收费。 这可能吗?

要进一步详细说明,应用会在用户点击“购买”后从paymentQueue:updatedTransactions功能中联系我的服务器。目前,我打电话给:

[_myQueue finishTransaction:transaction];

联系我的服务器后。但是,如果在联系服务器时出错,是否有一个函数我可以调用取消事务而不是完成它?

我从here看到有些人不会调用finishTransaction,因此下次用户启动应用并添加事务观察器时,事务就会恢复(因此应用可以尝试再次联系服务器)但是,这不太理想,因为用户在重新启动应用程序并且服务器再次可用之前将无法访问内容,但用户已经付费。

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为实现这一目标的唯一优雅方法是让您的服务器实施可用性检查,并在实际购买之前将其称为最后一件事。一旦用户通过呈现给他的UIAlertView确认购买,就会进行购买,并且您必须尽一切努力使他获得他的钱。

答案 1 :(得分:0)

由于没有手动取消交易的方法,这就是我处理它的方式:我没有标记交易完成,然后我可以选择稍后手动调用paymentQueue:updatedTransactions:像这样:

if (SKPaymentQueue.defaultQueue.transactions.count > 0) {

    //show a loading box to user
    //...

    //now manually call the observer method 
    [self paymentQueue:SKPaymentQueue.defaultQueue updatedTransactions:SKPaymentQueue.defaultQueue.transactions];

}

如果我的服务器调用失败,那么我提供一个UIAlertView,其中包含重试或取消选项。重试调用上面的代码。

这样你就不必等到应用程序重启,但如果确实如此,那也没关系。