应用内购买 – 如何确定购买是否已经完成?

为什么很难find如何做到这一点是超出我的 – 也许我正在试图做错误的方式 – 谁知道 – 希望你们中的一个,哈哈。

我有一个button,说'购买'(非消耗品)。 如果购买成功,则更新购买的NSUserDefaults = YES,该button被移除。 一切都很好,在这里。

现在,当用户删除应用程序,并希望重新安装或安装在新设备上时,我想在这些情况下,代替“购买”button显示一个“恢复”button。 “恢复”button将被点击,restoreCompletedTransactions将被调用。 看来对我来说是合乎逻辑的 – 用户不想看到“购买”button – 他们已经购买了。

问题是NSUserDefaults购买= YES将不可用于重新安装或新安装。 所以我的问题是如何确定应用程序是否已经购买,所以我可以显示“购买”button或“恢复”button。 有没有办法确定这个应用内购买是否已经由用户做出?

在此先感谢拜伦。

将来从一个应用程序安装到另一个应用程序安装没有好的方法。 你可能会滥用钥匙链,但你不应该这样做。

只是显示“购买”所有的时间。 在iOS上,这是处理这种情况的标准方式。 人们习惯看到一个购买button,即使他们以前购买,他们会明白这是什么意思。 当然,你仍然需要一个恢复button。

根据您使用的商店types,您可以使用两个选项来放置恢复button。

如果你有一个像界面一样的商店,例如一个列出所有产品的tableView,在你的tableView的末尾放置一个“恢复购买”单元格。 这里以PCalc Lite的界面为例:

在这里输入图像说明

如果您没有类似商店的界面,请在应用程序的设置部分添加一个button。 迪斯科动物园就是这样做的:

在这里输入图像说明

您可以使用应用程序询问的后端服务器来确定用户是否通过login到设备上的帐户购买。 苹果将​​要求你有某种检查设施,因为你指出的原因…用户不应该重新购买新设备或他们可能拥有的其他设备。 您必须使帐户注册为用户可选,苹果将要求这一点。

我知道这是一个老问题,你可能已经解决了这个问题,但是在devise一个用户友好的购买机制界面方面,我遇到了类似的问题,并且find了这样一个解决scheme:

 -(IBAction) purchase { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:<# A brief explanation #> delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Restore",@"Purchase", nil]; alert.delegate = self; alert.tag = _IAPTAG; [alert show]; } 

然后在alert view委托函数中:

 -(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if(alertView.tag == _IAPTAG) { if(buttonIndex == 0) { //cancel } else if(buttonIndex == 1) { //restore } else if(buttonIndex == 2) { //purchase } } } 

所以恢复选项将会恢复,购买将最终购买。 如果用户第一次购买,那么他/她不会担心买两次。 如果用户之前购买并在另一个设备上安装应用程序,则他/她将知道购买button将提供恢复选项。