我的应用包含1000个不同的商品。所有这些都是已安装软件包的一部分(安装完成后不必加载它们)。项目逐一显示。前50项是免费的。其余的仅在用户购买了不可消费的InApp-Product时才可用。
当我的应用程序启动时,如果购买了产品,它会查找钥匙串(这是我存储此信息的位置)。如果是YES
,那么将永远不会显示应用InApp-Payment-screen,并且所有功能都完全可用。 (我称之为“案例0”以供进一步参考)。
如果钥匙串不包含此信息,则可能意味着以下两种情况之一:
案例1
用户没有为产品付费(既不在此设备上也不在任何其他设备上)。在这种情况下,我必须在第50个项目之后显示InApp-Payment屏幕,用户可以在那里决定是否要支付额外的950个项目,或者他是否有足够的50个免费项目。
案例2
用户确实已经购买了产品(在其他设备上或在此设备上重置之前,或者......)。在这种情况下,我将通过致电[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
收到以前购买产品的产品ID。当我收到它时,productID将存储在钥匙串中,从现在起,应用程序的行为应与案例0完全相同。这意味着:当用户达到第50项时,他不应该注意到有什么特别的。他只是可以继续使用该应用程序并观看项目51和之后的所有其他项目。永远不应显示InApp-Payment屏幕,并且必须为用户提供对所有项目的完全访问权限。
据我所知,只有一种方法可以区分案例1和案例2.找出两种案例中哪一项属实的唯一方法是在之前调用restoreCompletedTransactions
达到第50项。如果调用返回我的productID,则为情况2,如果不是则为情况1.我必须在用户到达第50个项目之前进行此调用,因为如果情况2为真,则不得显示付款对话框。
但是 - 这就是我的问题 - 当应用程序调用{{1}}时,将提示用户输入他的apple-ID密码。但是用户看不出任何被提示的原因,因为 - 取决于我绑定了这个调用的项目 - 要么他刚启动应用程序,要么他只是在看#49项(与48相比没什么特别的之前的项目)或他正在观看#49之前的一个项目。
现在想象一个不愿意付钱的用户。也许他甚至已经为他的设备停用了InApp-Payment。但每次他使用该应用程序并进入特定项目(假设它是非常不起眼的项目#37)时,系统会提示他输入密码。如果我是这个用户,我会认为应用程序有错误,或者甚至想要监视我的密码!
那么请您如何处理这个用例而不疏远用户?
顺便说一句
仅在restoreCompletedTransactions
为restoreCompletedTransactions
时才调用[SKPaymentQueue canMakePayments]
是一个坏主意。如果我这样做之前已经购买过该产品的用户(可能是在其他设备上)并且现在已经设置YES
设置InApp-Payment = OFF
则没有机会消费他已经付费的产品。如果用户设置了InApp-Payment = ON
答案 0 :(得分:1)
从用户的角度来看,我认为你是正确的,假设在没有用户首先初始化请求的情况下从不创建密码提示。在这种情况下,我认为只需在应用内付款屏幕中添加一个按钮,或者在按钮旁边的按钮旁边,该按钮会转到要求用户恢复交易的屏幕上。
我认为在任何情况下,用户都会理解为什么他们之前购买的应用内购买没有显示。
但我认为如果您将购买的值存储在钥匙串中并且如果同步到iCloud,您也可能永远不会遇到案例2,他们的所有设备都会看到它,当您删除应用时,钥匙串值不会被删除(据我所知)。