应用内购买恢复按钮

Posted

技术标签:

【中文标题】应用内购买恢复按钮【英文标题】:In app purchases restore Button 【发布时间】:2012-06-16 19:51:01 【问题描述】:

我第一次在我的应用更新中实现了应用内购买,也只是等了 3 周后被拒绝,原因如下:

我们发现您的应用提供可恢复的应用内购买 但它不包括允许用户恢复的“恢复”功能 之前购买的应用内购买。恢复以前 购买的应用内购买产品,应提供 一个“恢复”按钮并在“恢复”时启动恢复过程 按钮被点击。

现在我正在考虑在表格的右侧(顶部)添加一个navbar 按钮,可以看到/点击应用购买,并添加将链接到该按钮的以下代码:

 [[SKPaymentQueue defaultQueue]   restoreCompletedTransactions];

有人可以验证这是正确的并且很可能是所有需要的吗?希望这次能顺利通过。提前致谢!

【问题讨论】:

我收到了同样该死的拒绝通知。您是否总是提供“恢复”按钮?!?!我想自动检查是否有可恢复的应用内购买,但是当我调用 restoreCompletedTransactions 时,系统会提示用户输入密码。太糟糕了!这有另一个API吗?我可以将我的“购买”按钮更改为“购买/恢复”吗???这仍然很糟糕。我没有足够的空间来放置一个全职的“RESTORE”按钮。 @whatchamacallit 我所做的只是将上面的以下代码放入连接到导航栏中按钮的方法中并获得批准。如果导航栏中的按钮没有空间,那么您可能需要将其放在视图本身中......也许在表格中或表格上方。祝你好运! 我在 Angry Birds for Mighty Eagle 上没有看到任何恢复按钮?为什么不被拒绝? 还有另一个:Forever Drive。这个也没有恢复按钮,也没有被拒绝。 @erkanyildiz 在这里查看恢复以前完成的购买的详细信息:(链接需要苹果开发者帐户)developer.apple.com/appstore/in-app-purchase/… 消耗品不需要恢复。 【参考方案1】:

我使用了这个的变体:

//inside of an IBaction
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue]restoreCompletedTransactions];


// Then this is called
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
    NSLog(@"%@",queue );
    NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]);  

    NSMutableArray *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 (@"product id is %@" , productID);
        // here put an if/then statement to write files based on previously purchased items
        // example if ([productID isEqualToString: @"youruniqueproductidentifier])write files else  nslog sorry
      

抱歉,如果这没有意义,我正在使用我的 iPad。

【讨论】:

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];解决了我的问题!谢谢!许多其他示例忽略了这一行。 这不准确。调用 restoreCompletedTransations 后,将调用的委托方法是 -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 这对你来说可能不准确,但对我来说效果非常好。嗯。 就像我说的,我使用了这个的变体,我在 iPad 上凭记忆打字。 在您在代码中编写的 cmets 中,您必须将 isequaltostring 替换为 isEqualToString 并且行中还有一件事,最后有一个“for (SK.....)” ." 用 "" 替换它。我知道你是从 iPad 上写的,但只是为了那些对此不太了解的人:D 非常感谢它完美运行的代码【参考方案2】:

Alex,我上周因为同样的原因被拒绝了,这正是 Apple 想要的——在添加了这样一个 Restore 按钮之后,他们没有就这个主题提出任何其他问题。

当然,你不仅需要调用[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];,还需要自己实现恢复(我的意思是,将内容提供给用户)。

【讨论】:

感谢尼基塔的回复。确实非常令人沮丧。基本上,我对应用内购买所做的事情是,一旦用户进行了购买,他们就会被放入该产品 ID 的购买数组中。当他们点击提供应用内购买的视图时,视图会检查用户是否在购买的数组中,并基于此自动重定向到购买视图或广告视图。你能告诉我在调用 restoreCompletedTranscations 时到底发生了什么吗?谢谢 restoreCompletedTranscations 将为您的 SKPaymentObserver 委托提供恢复的交易,因此您将能够看到用户之前购买了什么。交易只是 SKPaymentTransactions,它们的状态是 SKPaymentTransactionStateRestored。 如何获取上次交易详情或恢复上次完整交易?上述方法给了我很多 id 而没有给出最后一次购买的 id。【参考方案3】:

这是因为您可以在不同的 ios 设备上使用相同的 Apple ID 登录。

例如,假设我在 iPad 上登录 test@iCloud.com。当我下载您的应用程序时,我意识到我想删除广告,所以我支付了 99 美分来删除它们。

一年后,我决定购买一部 iPhone,并使用该帐户登录 test@iCloud.com,然后再次下载您的应用。但是,广告仍然存在,即使我已经付费在 iPad 上将其删除。这就是 restore 功能的用武之地。使用它,我可以恢复我在 iPad 上购买的内容,并让它们在我的 iPhone 上运行。

要恢复购买,您可以使用:

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

这会导致

(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *)queue

要调用的方法。在其中,您需要向用户提供他们购买的内容。

【讨论】:

【参考方案4】:

恢复按钮的替代方案可能是app settings bundle 中的恢复开关。它不会让 UI 不堪重负,而且 Apple 似乎很欢迎它(但请务必提及您已经以这种方式实现了机制)。

BOOL shouldRestorePurchases = [[NSUserDefaults standardUserDefaults] boolForKey:@"restorePurchasesKey"];

【讨论】:

@AbdulYasin 所描述的方法提供了在设置包中存储布尔值。在应用程序中,您必须像使用“恢复按钮”一样实现逻辑。

以上是关于应用内购买恢复按钮的主要内容,如果未能解决你的问题,请参考以下文章

应用内购买 - 恢复购买

应用内购买错误的恢复按钮

如何在应用内购买中恢复购买?

如何在应用内购买中恢复购买?

应用内购买:恢复购买服务器端

应用购买中的 iOS 非续订是不是需要恢复购买按钮? [复制]