应用内购买还原按钮

44
我首次在我的应用程序更新中实现了应用内购买,但需要等待3周后被拒绝,理由如下:
我们发现您的应用程序提供了可以恢复的应用内购买项目,但是它没有包括“还原”功能,以允许用户恢复先前购买的应用内购买项目。为了恢复先前购买的应用内购买产品,提供一个“还原”按钮并在点击“还原”按钮时启动还原过程是适当的。
现在我想在表格的右上方添加一个导航栏按钮,用户可以在其中查看/点击应用购买项目,并添加以下代码,该代码将链接到该按钮:
 [[SKPaymentQueue defaultQueue]   restoreCompletedTransactions];

有人可以验证这是否正确,并且很可能只需要这些吗?希望这次可以成功通过。提前感谢!


7
我收到了相同的拒绝通知。你是否总是提供"恢复"按钮?!?!我想自动检查是否有可恢复的应用内购买,但当我调用restoreCompletedTransactions时,用户会被提示输入密码。这很糟糕!还有其他API可以用吗?我能否将"购买"按钮更改为"购买/恢复"?这仍然不太好。我没有足够的空间放置一个全功能的"恢复"按钮。 - whatchamacallit
1
@whatchamacallit 我所做的就是将上面的代码放到一个与导航栏按钮连接的方法中,然后它就被批准了。如果你在导航栏中没有空间放置按钮,那么你可能需要将它放在视图本身中...也许是在表格或表格上方。祝你好运! - Alex G
5
在愤怒的小鸟中,我没有看到任何针对强力老鹰的还原按钮?为什么它没有被拒绝? - erkanyildiz
1
还有另一个游戏:永恒驾驶。这个游戏也没有恢复按钮,也没有被拒绝。 - erkanyildiz
1
@erkanyildiz 请查看此处有关恢复之前已完成购买的详细信息:(链接需要苹果开发者帐户)https://developer.apple.com/appstore/in-app-purchase/In-App-Purchase-Guidelines.pdf。消耗性产品不需要恢复。 - Geoff Evason
显示剩余2条评论
4个回答

43

我使用这个的一个变体:

//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。


8
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 解决了我的问题!非常感谢!许多其他的例子都忽略了这一行。 - Sunkas
2
这不是准确的。在调用restoreCompletedTransations之后,将被调用的委托方法是-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions。 - odyth
对你来说可能不准确,但对我来说效果非常好。嗯。 - Brian Noah
在你的代码注释中,你必须将isequaltostring替换为isEqualToString,并且在“for(SK .....)”行的末尾还有一件事情,那就是用“{”替换“.”。我知道你是从iPad上写的,但是对于那些不太了解的人来说,这很有帮助:D非常感谢你的代码,它完美地运行了。 - MasterRazer
谢谢Noah,我已经做了更改并进行了一些缩进修复。 - Brian Noah
显示剩余2条评论

28

Alex,我上周因为同样的原因被拒绝了,这正是苹果想要的-在添加了这样一个 恢复 按钮后,他们没有对此主题提出任何其他问题。

当然,您不仅需要调用 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];,还需要实现恢复本身(我的意思是向用户提供内容)。


谢谢回复,尼基塔。确实非常令人沮丧。基本上,我在应用内购买方面所做的是,一旦用户完成购买,他们就会被放入该产品ID的已购买数组中。当他们点击提供应用内购买的视图时,视图会检查用户是否在已购买数组中,并根据此自动重定向到购买视图或广告视图。你能告诉我当调用restoreCompletedTransactions时到底发生了什么吗?谢谢。 - Alex G
restoreCompletedTransactions会将恢复的交易发送到您的SKPaymentObserver代理,因此您将能够查看用户之前购买过什么。这些交易只是SKPaymentTransactions,它们的状态为SKPaymentTransactionStateRestored。 - Nikita Pestrov
2
如何获取最后一笔交易的详细信息或恢复上一次完整的交易? 以上方法给了我很多ID,但没有给出最后一次购买的ID。 - vipinsaini0

4
这是因为您可以在不同的iOS设备上使用相同的Apple ID登录。例如,假设我在iPad上使用“test@iCloud.com”进行登录。当我下载您的应用程序后,意识到我想要去除广告,所以我支付了99美分来删除它们。
一年后,我决定购买iPhone,并在该账户上登录“test@iCloud.com”,然后再次下载您的应用程序。然而,即使我已经在iPad上支付了费用来删除广告,但它们仍然存在于我的iPhone上。这就是“恢复”功能的作用。使用此功能,我可以恢复我在iPad上进行的购买,并使它们在我的iPhone上工作。
要恢复购买,您可以使用:
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

这会导致以下问题:
(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentQueue *)queue

需要调用的方法。在此之内,您需要向用户提供所购买的内容。


我已经在我的后端处理每个用户帐户的原始交易ID和Webhook状态,不需要恢复按钮。 - Shanmugarajeshwaran R

3

恢复按钮的替代方案可以是在应用设置包中添加一个恢复开关。这不会使用户界面过于复杂,而且苹果公司似乎也欢迎这种方式(但请务必提到您已经以这种方式实现了机制)。

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

@AbdulYasin 所描述的方法是将布尔值存储在设置束中。在应用程序中,您必须实现与“恢复按钮”相同的逻辑。 - Roman B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接