- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我的应用程序中有很多一次性购买 IAP。用户可以购买它们。
我的问题是我正在与 Flurry 集成以跟踪实际购买而不是仅仅恢复购买,但我的 SKPaymentTransaction
的 transactionState
总是返回为 SKPaymentTransactionStatePurchased
而不是 SKPaymentTransactionStateRestored
。
显然 SKPaymentTransactionStateRestored
仅在 - (void)restoreCompletedTransactions
时调用,但我什么时候调用此方法?
我的想法是,购买应该是这样的:1) 用户选择产品,2) 询问用户是否愿意购买 X 金额的产品。 3)服务器检查用户之前是否购买过,以及他们是否通过设置SKPaymentTransactionStateRestored
恢复了它。否则,处理交易并设置 SKPaymentTransactionStatePurchased
。显然这是错误的,我想在两者之间的某个地方调用 - (void)restoreCompletedTransactions
???
谢谢,
将
最佳答案
编辑:
最初我发布了一个很长的、不需要的方法来完成我需要的事情,但正如您将在下面看到的,Matt 帮助我找出了我正在寻找的变量。
举个例子,假设一个用户之前购买了我的应用,购买了所有可用的非消耗性 IAP,然后删除了该应用。当用户重新安装应用时,我希望能够确定他们何时再次“购买”产品,是原始(首次)购买还是恢复购买?
我实现了“恢复所有购买”按钮,但假设用户忽略/没有看到它,并尝试选择他们之前购买的产品。
与正常购买一样,我执行以下操作:
if ([SKPaymentQueue canMakePayments])
{
self.productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:productID]];
self.productRequest.delegate = self;
[self.productRequest start];
}
else
{
//error message here
}
在用户登录到他们的 iTunes 帐户后,该应用程序将让他们知道他们已经购买了这个并且现在将被恢复。将调用以下委托(delegate)方法:
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
{
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
if(transaction.originalTransaction)
{
NSLog(@"Just restoring the transaction");
}
else
{
NSLog(@"First time transaction");
}
break;
}
default:
break;
}
}
}
无论交易是恢复交易还是首次购买,transaction.transactionState
都将等于 SKPaymentTransactionStatePurchased
。
现在,我们如何确定该购买是原始购买还是修复购买?
简单:如上所见,只看transaction.originalTransaction
是否被初始化。根据 Apple 的说明://仅当状态为 SKPaymentTransactionStateRestored 时才有效。
如果 SKPaymentTransaction
的 originalTransaction
被初始化,这意味着之前有一个交易。否则,这笔交易是原始交易!
再次感谢 Matt 为我指明了正确的方向,并使逻辑更加清晰!
关于iOS StoreKit - 何时调用 - (void)restoreCompletedTransactions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084315/
我在开发 iPhone 应用程序时遇到了一些恢复CompletedTransactions 的问题。下面列出的所有问题都是在沙盒环境中工作时发生的。该应用程序尚未销售。它是使用在模拟器 5.0 和 5
这是我第一次集成应用内购买。我一切正常:我可以购买我想要的元素,也可以使用 restoreCompletedTransactions . 每次打电话restoreCompletedTransactio
我的问题是:如果订阅收据过期,我是否必须调用 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]? 背景:在沙箱中,我不会自动收到
当我调用 restoreCompletedTransactions 时,如果用户相继购买了两个或多个非续订订阅,比如相隔一个月,会恢复哪些交易。我是通过 transactionState SKPaym
我的应用程序使用应用程序内购买内容(非消费品),并在后端对所有购买进行审计。根据 Apple 指南,该应用程序应实现恢复已购买项目的恢复功能。是否始终必须通过调用 SKPaymentQueue:res
这里的用例是用户从未购买过我的应用内购买但点击了“恢复”按钮。我想让用户知道恢复失败,因为没有任何东西可以恢复。 问题是我没有收到任何事件。所以我不知道发生了什么事。 当我的用户点击我界面中的恢复按钮
我通过 iTunes connect 在购买时设置了 6 个月的自动续订订阅。我创建了一个测试用户并购买了该订阅,现在当我尝试恢复我的购买时,它在 的交易数组中多次返回相同的交易 - (void)pa
我使用我的测试用户购买了非消耗品,但是当我调用它时: [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 我在 paymentQ
我已经在我的应用中实现了应用内购买。购买工作正常,但我无法恢复购买。 当 restorepurchasenow 被按下时,没有任何反应,尽管我已经在支付队列中实现了 SKPaymentTransact
我的应用使用订阅模式,我收到一些用户无法通过 SKPaymentQueue.restoreCompletedTransactions 恢复订阅的投诉。他们必须删除应用程序并从 AppStore 重新下
对于具有非消耗性应用内购买的基本应用,有没有人想出使用 SKPaymentQueue 的 restoreCompletedTransactions 的最佳实践? 观察 我知道建议始终注册事务观察器以接
我正在尝试为我的 Mac 应用设置应用内购买。购买产品工作正常,但我无法让 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] 工
我的应用程序中有 4 个非消耗品,购买这些作品没有任何问题。 但是,我创建了一个恢复购买按钮,该按钮可以恢复所有产品,无论用户是否购买过它们。我在4个不同的沙箱测试用户上进行了测试,结果是一致的(即对
我想正确实现恢复以前购买的 IAP 的能力,但是,我已经阅读了一些相互冲突的方法,现在我很困惑。 我在沙箱中使用的方法是从 paymentQueue() 中恢复,就像这样...... func pay
我无法在我的 paymentQueue:updatedTransactions: 委托(delegate)方法中接收任何交易。只有委托(delegate)方法 paymentQueueRestoreC
我的应用程序中有很多一次性购买 IAP。用户可以购买它们。 我的问题是我正在与 Flurry 集成以跟踪实际购买而不是仅仅恢复购买,但我的 SKPaymentTransaction 的 transac
我有一个使用自动续订订阅的应用程序。我需要访问已完成的交易以确定用户是否具有有效的订阅。我知道“restoreCompletedTransactions”会为您执行此操作,但是,它令人烦恼地要求用户重
我的应用程序的描述 我的应用程序包含 1000 个不同的项目。所有这些都是已安装包的一部分(安装完成后无需加载它们)。项目被一项一项地显示。前 50 件元素免费。仅当用户购买了非消耗性应用内产品时,其
在 iOS 上通过应用内购买销售非消耗品时,提供了 restoreCompletedTransactions 方法,以便您可以检索用户过去进行的所有购买,正如我了解它是为了让用户能够快速恢复购买,例如
Apple 发布了 StoreKit,当用户输入他/她的电子邮件和密码时,我们甚至无法获得取消事件的任何回调: [[SKPaymentQueue defaultQueue] restoreComple
我是一名优秀的程序员,十分优秀!