我的应用程序的描述
我的应用程序包含 1000 个不同的项目。它们都是已安装包的一部分(安装完成后无需加载它们)。项目一一显示。前 50 件商品免费。其余的仅在用户确实购买了非消耗性 InApp-Product 时可用。
应用程序如何知道产品是否已购买
当我的应用程序启动时,如果购买了产品,它会查看钥匙串(这是我存储此信息的地方)。如果YES
,则应用程序 InApp-Payment-screen 永远不会显示,并且所有功能都完全可用。(我将此称为“案例 0”以供进一步参考)。
如果钥匙串不包含此信息,这可能意味着以下两种情况之一:
案例 1
用户没有为产品付款(无论是在此设备上还是在任何其他设备上)。在这种情况下,我必须在第 50 件商品之后显示 InApp-Payment 屏幕,用户可以在那里决定是否要为额外的 950 件商品付款,或者他是否有足够的 50 件免费商品。
情况 2
用户确实已经购买了产品(在其他设备上或在重置之前在此设备上,或者......)。在这种情况下,我将通过调用 收到之前购买的产品的产品 ID [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
。当我收到它时,productID 将存储在钥匙串中,从现在开始,应用程序的行为应该与 case 0 完全相同。这意味着:当用户到达第 50 个项目时,他应该不会注意到有什么特别之处。他可以继续使用该应用程序并观看第 51 项以及之后的所有其他项目。InApp-Payment 屏幕永远不应显示,用户必须获得对所有项目的完全访问权限。
据我所知,只有一种方法可以区分情况 1 和 2。找出这两种情况中哪一种情况正确的唯一方法是在到达第 50 项restoreCompletedTransactions
之前打电话。如果调用返回我的 productID,则为案例 2,否则为案例 1。我必须在用户到达第 50 项之前进行此调用,因为如果案例 2 为真,则不得显示付款对话框。
密码提示的问题
但是——我的问题来了——当应用程序调用restoreCompletedTransactions
用户时,系统会提示用户输入他的苹果 ID 的密码。但是用户看不到任何提示的原因,因为 - 根据我绑定此调用的项目 - 他只是启动了应用程序,或者他只是在观看项目 #49(与 48 相比没什么特别的)之前的项目)或者他正在观看 #49 之前的项目之一。
现在想象一个不愿意付费的用户。也许他甚至已经为他的设备停用了 InApp-Payment。但是每次他使用该应用程序并进入特定项目(假设这是非常不起眼的项目#37)时,都会提示他输入密码。如果我是这个用户,我会认为该应用程序有错误,或者它甚至想窥探我的密码!
我的请求
那么,您有什么想法如何在不疏远用户的情况下处理这个用例吗?
顺便说一句,仅在is
时调用是一个坏主意。如果我这样做了,之前购买过该产品(可能在其他设备上)并且现在在该设备上已设置的用户将没有机会消费他已经付费的产品。如果用户设置了它也无济于事restoreCompletedTransactions
[SKPaymentQueue canMakePayments]
YES
InApp-Payment = OFF
InApp-Payment = ON