2013-05-06 64 views
8

我有一个恢复按钮。问题是如果他们没有进行恢复,并且他们试图购买一件物品,并且他们已经购买了该物品,我需要告诉他们他们已经购买了它并且不进行购买。所以我需要一种方式来知道,不做恢复,他们已经购买了哪些物品。我试着先做一次恢复,每当用户试图购买,但苹果拒绝我的应用程序。他们表示,在显示确认应用内购买对话框之前,不会发生还原。苹果拒绝我的应用程序,由于恢复IAP

请帮我找到正确的方法。

在此先感谢。

+0

是NSUserDefaults的你最好的选择。但只要您负责获取信息,任何形式的存储都将起作用。看起来像一个设计缺陷,你不觉得吗?我知道他们希望保证用户数据安全,但是jeez。 – achi 2013-12-13 20:05:20

+0

如果用户再次尝试购买非消耗品,则不会再次收取费用。相反,他们会收到一条消息,说他们已经付款并可以免费获得。 – 2014-01-14 11:35:23

回答

6

您可以将这些数据保存在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在钥匙扣数据

+0

这将无法可靠地工作:用户可能已经购买了另一个设备上的应用程序(或通过iTunes);用户可能已手动删除应用程序或擦除设备... – 2013-05-06 13:06:45

+0

如果用户使用相同的Apple ID,则Apple不会再向用户收费,您将获得称为说明应用程序已购买的委托方法。所以你可以解锁你的应用程序的隐藏功能 – Ushan87 2013-05-06 13:09:22

+0

确切地说。这意味着使用'NSUserDefaults'不能解决OP的问题。 – 2013-05-06 13:10:47

1

据我所知,没有其他方法可以做到这一点。

您应该提供还原按钮以恢复应用程序内购买,否则Apple将拒绝您的应用程序。

如果不显示应用内购买确认提醒,您将无法连接到应用内服务器或还原分流。

+0

:是的你是对的,我已经有一个恢复按钮,但在进入该屏幕之前,我需要检查产品是否购买天气。 – MadhuP 2013-05-06 13:09:28

+1

@ pm444:那是不可能的。当用户再次点击购买时,它会给出如下响应:'SKPaymentTransactionStateRestored'。 – 2013-05-06 13:16:38

+0

我有两个应用程序商店,支持应用程序内购买。我有一个单独的恢复按钮,并分别显示产品列表。如果用户购买一件物品,我将这些数据保存在我的NSUserDefaults中,当用户进入应用内购买页面时,我不会向他显示他已购买的产品。就那么简单!! – Ushan87 2013-05-06 13:29:11

2

据苹果“还原应用程序内购买对话框无法确认之前发生显示“。使用- (空)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); 
    } 
} 
+0

:谢谢你给我答复。这也只不过是在调用inAppPurchase之前调用Restore方法知道 ! – MadhuP 2013-05-06 13:05:46

相关问题