我有关于应用内凭据的疑问。 我创建了两个沙盒帐户,例如 accountA & accountB 和一个包。 我有一个视频需要订阅观看。如果我点击视频,它会打开订阅页面,我们将立即购买'按钮。点击后,我们使用accountA购买一个包,并将此包ID存储在NSUserDefaults中。
现在有两种情况:
首先:
如果 accountA 从iTunes商店注销(设置 - > iTunes商店)和 打开应用程序并点击视频,它应该要求提供要查看的凭据 视频。 (目前视频正在播放,因为我们正在播放 使用无关的NSUserDefaults中的包ID。我猜 它的错误方法)。 所以我想测试 iTunes登录用户是否已经购买该软件包不应该打开订阅页面。他/她应该直接发送观看视频。
第二
如果 accountB 在iTunes Store中登录并打开该应用。他/她不应该 能够观看视频直到除非不买包装 accountB。否则他必须使用accountA登录才能观看视频 他/她已经购买了。
所以我的问题是如何检查accountA或accountB是否已经购买该包。 我想如果他/她点击视频,每次都会发出restoreTransaction请求。但是,如果我这样做,那么每当它打开登录iTunes商店或警报的对话框时,你已经购买了这个包以及我不想向用户显示的所有内容,如果他/她已经购买了。
我不想使用NSUserDefault检查已购买的包具有一些布尔值。我一直想与登录用户核实。
此外:我们可以为同一个已安装的应用程序购买两个包 不同的帐户?
答案 0 :(得分:1)
在您的情况下,我们在appDelegate中有一个名为“ - (void)applicationWillEnterForeground:(UIApplication *)application”的方法。在此处写下您的“恢复功能”。因此,它始终检查当前用户(登录iTunes的用户)是否已购买订阅。如果用户购买了订阅,它将调用“SKPaymentTransactionObserver”委托方法 - “(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue”然后将您的订阅布尔变量设置为“是”。如果用户尚未购买订阅,则会调用“ - (void)paymentQueue:(SKPaymentQueue *)队列restoreCompletedTransactionsFailedWithError:(NSError *)错误”委托方法,然后将订阅布尔变量设置为“否”。基于此写委托方法(或)使用NSNOTIFICATIONCENTER调用适当的方法,即subscritpion == yes允许用户播放视频 其他 不允许用户显示购买订阅选项。
答案 1 :(得分:0)
最简单的解决方案是在NSUserDefaults中存储变量显示购买状态,因为我确定您已经在做。但是,您可以更进一步,将所有与登录相关的变量嵌套在NSUserDefaults中,并在用户的用户名的密钥下。
然后在您的登录功能中,只需实现一种加载特定于该用户的NSUserDefaults的方法,并用这些用户覆盖当前用户默认值。
NSUserDefaults *appDefaults = [NSUserDefaults standardUserDefaults];
[appDefaults setObject:[appDefaults objectForKey:@"CURRENT_USERNAME"] forKey:@"current_user"];
[appDefaults synchronize];
然后当您存储购买时,
NSUserDefaults *appDefaults = [NSUserDefaults standardUserDefaults];
[[appDefaults objectForKey:@"current_user"] setObject:"YES" forKey:@"purchased"];
[[appDefaults objectForKey:@"CURRENT_USERNAME"] setObject:"YES" forKey:@"purchased"];
[appDefaults synchronize];
此代码未经测试,但希望您能够看到这个概念。只需记住清除密钥@" current_user"注销时再次登录,然后从用户名密钥加载它们。
" CURRENT_USERNAME"将替换为当前用户的登录名。
" CURRENT_USER"将是一个通用的,您将填写当前用户的特定数据集和购买信息。
希望这会有所帮助。
JB