【问题标题】:Apple rejected my App due to restore IAP苹果因恢复 IAP 而拒绝了我的应用程序
【发布时间】:2013-05-06 12:19:51
【问题描述】:

我有一个恢复按钮。问题是如果他们没有进行恢复,并且他们尝试购买一件物品,并且他们已经购买了该物品,我需要告诉他们他们已经购买了它并且不执行购买。所以我需要一种方法来知道他们购买了哪些物品,而无需进行恢复。每当用户尝试购买时,我都尝试先进行恢复,但苹果拒绝了我的应用程序。他们说在显示“确认应用内购买”对话框之前无法进行还原。

请帮我找到正确的方法。

提前致谢。

【问题讨论】:

  • NSUserDefaults 是您最好的选择。但只要您负责获取信息,任何形式的存储都可以使用。看起来像一个设计缺陷,你不觉得吗?我知道他们希望保护用户数据的安全,但天哪。
  • 如果用户再次尝试购买非消耗品,他们将不再被收费。相反,他们会收到一条消息,说他们已经付款并且可以免费获得。

标签: iphone ios in-app-purchase


【解决方案1】:

您可以将这些数据保存在NSUserDefaults 中。而且您无需显示已购买商品的警报。如果它是非消耗品,苹果会显示警报,说他们已经购买了该商品!

编辑:

1) 您需要在视图中添加 3 个按钮

  • 购买按钮
  • 恢复按钮
  • 演示版

如果您在应用中支持应用内购买,则需要为用户提供恢复选项。否则 Apple 将拒绝您的应用。

2) 如果用户按下购买按钮,不要检查用户是否已经购买了您的应用。因为苹果不会为同一种非消耗品向用户收取两次费用。因此,只需检查您的购买代码,如果用户已经购买了它,Apple 的 StoreKit 框架将调用它的委托方法

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

SKPaymentTransactionStatePurchased

交易状态。所以你可以向他展示登录屏幕。

3) 如果用户按下恢复按钮,只需使用您的恢复代码即可

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

和第二步一样,它将调用具有相同事务状态的委托方法。所以你可以向用户展示登录页面。

4) 如果用户按下演示版按钮,向他展示演示版。

5) 如果用户购买了您的应用,请将其删除,如果他重新安装,则将其视为新用户。向他展示这 3 个按钮,用户可以恢复购买,然后您可以向他展示登录页面。

6) 如果您确实需要跟踪应用程序是否是在确切的设备上购买的,那么您可以使用钥匙串来存储您的数据,因为即使应用程序被卸载或删除,钥匙串项目也不会被删除。这个Api会很有帮助link,看看

Keychain数据可以参考苹果documentation

【讨论】:

  • 这不会可靠地工作:用户可能已经在另一台设备上(或通过 iTunes)购买了该应用程序;用户可能已经手动删除了应用程序或擦除了设备...
  • 如果用户使用相同的apple id,那么apple 将不会再次向用户收费,您将获得调用的委托方法,说明应用内购买。这样您就可以解锁应用的隐藏功能
  • 没错。这意味着使用 NSUserDefaults 并不能解决 OP 的问题。
  • 这可能会有所帮助。问题是“我需要告诉他们他们已经购买了它并且不执行购买”。因此,如果用户购买商品时,他可以将这些数据存储在“NSUserDefaults”中,并通过检查“NSUserDefaults”来检查用户是否已经购买了该商品。但它不适用于两台设备。
  • @Ushan87:+1 感谢您的精彩流程和解释。在接受之前,我需要检查我的应用流程。
【解决方案2】:

根据 Apple 的说法,“在显示 Confirm In-App Purchase 对话框之前无法进行还原。”使用 - (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 函数,查看代码

- (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方法!
【解决方案3】:

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

你应该提供一个恢复按钮来恢复应用内购买,否则苹果会拒绝你的应用。

如果不显示应用内购买确认提醒,您将无法连接到应用内服务器或恢复产品。

【讨论】:

  • :是的,你是对的,我已经有一个恢复按钮,但在进入该屏幕之前,我需要检查天气是否购买了产品。
  • @pm444:这是不可能的。当用户再次点击购买时,它会给出如下响应:SKPaymentTransactionStateRestored
  • 我在应用商店中有两个支持应用内购买的应用。我单独有一个恢复按钮并单独显示产品列表。如果用户购买了一个项目,我会将这些数据保存在我的 NSUserDefaults 中,当用户进入应用内购买页面时,我不会向他展示他已经购买的产品。就这么简单!!
  • @Ushan87:其实我的requiremnet是不同的。我需要在启动应用程序的第一时间知道可用产品是否已经购买。
  • @MidhunMP:实际上我有两个按钮。当用户点击 btn1 时,我需要检查天气他是否购买了该产品。如果他购买了用户可以使用该应用程序,否则它会在付款后要求付款成功的用户可以注册到应用程序。如果单击 btn2,则会出现应用程序演示。这是我的流程。你能帮我获得正确的流程吗?
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多