我有一个恢复按钮。问题是如果他们没有进行恢复,并且他们试图购买一件物品,并且他们已经购买了该物品,我需要告诉他们他们已经购买了它并且不进行购买。所以我需要一种方式来知道,不做恢复,他们已经购买了哪些物品。我试着先做一次恢复,每当用户试图购买,但苹果拒绝我的应用程序。他们表示,在显示确认应用内购买对话框之前,不会发生还原。苹果拒绝我的应用程序,由于恢复IAP
请帮我找到正确的方法。
在此先感谢。
我有一个恢复按钮。问题是如果他们没有进行恢复,并且他们试图购买一件物品,并且他们已经购买了该物品,我需要告诉他们他们已经购买了它并且不进行购买。所以我需要一种方式来知道,不做恢复,他们已经购买了哪些物品。我试着先做一次恢复,每当用户试图购买,但苹果拒绝我的应用程序。他们表示,在显示确认应用内购买对话框之前,不会发生还原。苹果拒绝我的应用程序,由于恢复IAP
请帮我找到正确的方法。
在此先感谢。
您可以将这些数据保存在NSUserDefaults。并且您不需要显示警报说这些项目已经购买。如果其非消费品苹果正在显示提醒说他们已经购买了该商品!
编辑:
1)需要3个按钮添加到您的视图
您需要如果您支持应用内购买,请为用户提供还原选项你的应用。否则,Apple会拒绝你的应用程序。
2)如果用户按购买按钮,不要检查用户是否已经购买了您的应用程序。由于Apple不会为相同的非消耗性产品向用户收取两次费用。因此,只要通过你的购买代码,如果用户已经购买但苹果的StoreKit框架将与
调用它的委托方法
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
SKPaymentTransactionStatePurchased
交易状态。所以你可以给他登录屏幕。
3)如果用户按下恢复按钮只是去通过与您的还原码
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
,并像在第2步,它会调用与同一交易状态的委托方法。所以你可以将登录页面呈现给用户。
4)如果用户按下演示版本按钮,给他演示版本。
5)如果用户购买了你的应用程序,删除它,如果他重新安装它,请把他当作新用户。向他展示这3个按钮,用户可以恢复购买,然后您可以向他展示登录页面。
6)如果您确实需要跟踪应用程序是否在确切的设备上购买,那么您可以使用钥匙串存储您的数据,因为即使应用程序已卸载或删除,钥匙串项目也不会被删除。这个API将有很大的帮助link,看看
或
你可以参考苹果的documentation在钥匙扣数据
这将无法可靠地工作:用户可能已经购买了另一个设备上的应用程序(或通过iTunes);用户可能已手动删除应用程序或擦除设备... – 2013-05-06 13:06:45
如果用户使用相同的Apple ID,则Apple不会再向用户收费,您将获得称为说明应用程序已购买的委托方法。所以你可以解锁你的应用程序的隐藏功能 – Ushan87 2013-05-06 13:09:22
确切地说。这意味着使用'NSUserDefaults'不能解决OP的问题。 – 2013-05-06 13:10:47
据我所知,没有其他方法可以做到这一点。
您应该提供还原按钮以恢复应用程序内购买,否则Apple将拒绝您的应用程序。
如果不显示应用内购买确认提醒,您将无法连接到应用内服务器或还原分流。
:是的你是对的,我已经有一个恢复按钮,但在进入该屏幕之前,我需要检查产品是否购买天气。 – MadhuP 2013-05-06 13:09:28
@ pm444:那是不可能的。当用户再次点击购买时,它会给出如下响应:'SKPaymentTransactionStateRestored'。 – 2013-05-06 13:16:38
我有两个应用程序商店,支持应用程序内购买。我有一个单独的恢复按钮,并分别显示产品列表。如果用户购买一件物品,我将这些数据保存在我的NSUserDefaults中,当用户进入应用内购买页面时,我不会向他显示他已购买的产品。就那么简单!! – Ushan87 2013-05-06 13:29:11
据苹果“还原应用程序内购买对话框无法确认之前发生显示“。使用- (空)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)队列 功能,检查代码
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
NSLog(@"%@",error);
}
// Call This Function
- (void) checkPurchasedItems
{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
//Then this delegate Function Will be fired
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
purchasedItemIDs = [[NSMutableArray alloc] init];
NSLog(@"received restored transactions: %i", queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions)
{
NSString *productID = transaction.payment.productIdentifier;
[purchasedItemIDs addObject:productID];
NSLog(@"%@",purchasedItemIDs);
}
}
:谢谢你给我答复。这也只不过是在调用inAppPurchase之前调用Restore方法知道 ! – MadhuP 2013-05-06 13:05:46
是NSUserDefaults的你最好的选择。但只要您负责获取信息,任何形式的存储都将起作用。看起来像一个设计缺陷,你不觉得吗?我知道他们希望保证用户数据安全,但是jeez。 – achi 2013-12-13 20:05:20
如果用户再次尝试购买非消耗品,则不会再次收取费用。相反,他们会收到一条消息,说他们已经付款并可以免费获得。 – 2014-01-14 11:35:23