Game Center API + In-App Purchases API = 一个应用有两个不同的用户帐户?

Posted

技术标签:

【中文标题】Game Center API + In-App Purchases API = 一个应用有两个不同的用户帐户?【英文标题】:Game Center API + In-App Purchases API = Two different user accounts for a single app? 【发布时间】:2010-10-25 19:18:04 【问题描述】:

如果我有一个支持 Game Center 的应用,并且我想提供成就以完成作为应用内购买出售的拼图包,我如何同步为应用内购买付费的 iTunes 帐户使用进行购买的 Game Center 用户帐户?据我了解,它们是在两个不同位置访问的两个独立用户帐户(Game Center 帐户在 Game Center 应用程序中访问,iTunes 帐户在设置应用程序中访问)。

如何避免这种情况发生...

    Game Center Player1 登录,运行我的应用程序并购买拼图包 Game Center Player1 退出,Game Center Player2 登录,运行我的应用程序并玩完 Player1 购买的拼图包,然后 Player2 获得成就。 Game Center Player2 退出,Game Center Player1 登录并发现他/她购买的拼图包已经完成,因此 Player1 无法获得相同的成就。

我是否误解了这些用户帐户的工作方式?如果没有,有没有办法在玩家登录和退出我的游戏时将 Game Center 帐户与 iTunes 帐户同步?有没有办法解决这个问题?对于任何销售内容的多人游戏来说,这似乎是一个相当普遍的问题。

非常感谢!

【问题讨论】:

【参考方案1】:

这是个好问题。 :) 就成就而言,我想您可以使用登录的 GKPlayer 中的 playerId 将它们存储在设备上,一旦登录玩家的成就完成,您就会与 Game Center 同步。

至于同步 iTunes 和 Game Center 帐户,我真的不知道。通常,您会在设备上存储一些关于是否已进行购买的信息(即可用的功能)。使用该功能(或被允许使用它)应该依赖于设备,而不是依赖于 GC 用户,这是否合乎逻辑?但是,如果有人使用他们的帐户一次又一次地将您的内容下载到他们朋友的设备上会怎样?

嗯...我希望其他人能分享他们对此的想法。但我发现 Game Center 问题的浏览量和回答率都非常低 :(

【讨论】:

呵呵,我也注意到了 :) 谢谢你的想法。我认为您不能使这种数据设备依赖于您,因为您必须允许同一 iTunes 用户在多个设备上使用所有购买的内容。我想我会按照文档所说的去做,并允许不同的 GC 玩家访问相同的付费内容,直到其他人想出更好的主意。 对不起,我什至不是那个意思。我的意思是 iTunes 帐户依赖,但接受即使用户在设备上注销,内容仍然可以在该设备上使用。应用程序和音乐的工作方式相同,对,除非您将设备与另一个帐户同步。完成游戏后告诉我。很想知道结果如何:) 没错,这是一个很好的观点。没有真正的方法可以检查当前登录的 iTunes 用户是否购买了某些东西,除非在您的应用启动时完全恢复所有购买的内容,或类似的事情。【参考方案2】:

所以这就是我将如何做到这一点,它实际上是一个相当简单的方法。我将使用核心数据在本地跟踪用户购买拼图包的进度,因为它可以快速启动和运行。每次有新的 GC 用户登录时,我都会创建一个新的用户对象并跟踪他们在拼图包中的进度,并在需要时报告 GC 中的成就。当那个 GC 用户稍后登录时,我将调整拼图包的状态以匹配它们在核心数据中定义的当前进度。这样,任何 iTunes 帐户都可以购买拼图包,并且任何使用该设备的人都可以使用它们。每当任何 GC 用户登录 GC 并玩我的应用程序时,他们都可以访问相同的购买的拼图包,但他们的进度和成就将独立于其他 GC 用户维护。

如果设备上没有安装 GC,我可以禁用所有 GC 功能并启动应用程序,因为只有一个默认播放器。

应该很简单。

【讨论】:

我仍然看到一个未解决的问题:Apple 明确声明开发人员不应对 playerId 字符串的格式做出任何假设。这可能意味着他们可能会在未来的某个时间改变它。如果他们这样做了,我们应该如何在本地识别用户?您的方法对我来说似乎完全有效,这只是 Apple 系统中的一个潜在缺陷。 好点,我得考虑一下。奇怪的是,Apple 实际上建议使用这条数据来存储持久数据,“播放器标识符不应该显示给用户。你的应用程序应该在需要持久存储特定播放器的信息时使用这个字符串。不要假设播放器标识符字符串的内容。其格式和长度可能会发生变化。 - 苹果 @Joseph,我认为苹果的意思是一个玩家标识符的格式和长度可能与另一个玩家的标识符不同。换句话说,一旦玩家有了标识符,它就不会改变。这是有道理的,因为他们实际上建议使用玩家标识符来存储持久数据。 你可能是对的,现在我认为这更有意义;)【参考方案3】:

我也在尝试提出解决此问题的解决方案。如果使用服务器产品交付方式,问题可以得到很大的解决。应用程序将购买的物品发送到服务器;服务器在检查凭据后将物品交付给应用程序。有一些极端的情况我还是不知道怎么解决,基本上是处理整个流程中断的情况,这取决于IAP的实现。仍然不能 100% 确定。

【讨论】:

是的,我也在考虑使用服务器模型作为解决方案,我同意,这肯定会解决这个问题。问题是,这给我正在尝试构建的 iPhone 应用程序添加了一个全新的项目,以及一组全新的错误和成本。使用 In-App Purchases 框架和 Game Center 框架以及为 ios 平台开发的最大好处是 Apple 已经构建的所有服务器端基础架构,并允许您免费使用(或 99 美元/年,那是)。所以我真的很想使用内置模型来交付内容。 但是您仍然会将内容存储在设备上,对吗?我就是这样做的。 1. 从商店购买。 2. 将收据发送到自己的服务器 3. 服务器与 App Store 核对并向应用程序发送确认和内容 4. 应用程序存储内容。 --- 但是这个过程只进行一次。如果您绝对想将购买限制为 Game Center 帐户,您可以做的是将 GKPlayer.playerId 发送到您的服务器,将其存储在数据库中,并且下次有人想要安装该内容时,尽管应用商店确认已购买,如果...则拒绝发货 ...游戏中心用户不同。但我怀疑苹果会允许这样做。 @Joseph:两个问题 1) 设置您使用的服务器有多难? 2) 你觉得它有多必要?我不打算这样做,因为它看起来非常可选。 我没有在数据库中存储任何内容。所以基本上我会向 App Store 发送一个请求进行验证,然后将 JSON 响应发送到包含内容的应用程序。它有点像黑客攻击在一起,但只有大约 10 行代码。我不想将内容存储在应用程序中,因为我想独立于应用程序商店进行内容更新。【参考方案4】:

您能否在手机上记录特定用户购买了哪些成就,然后检查哪个用户正在使用并启用或禁用购买的内容 - 您必须有一种方法来跟踪不同的用户玩家进度(我可以看到用户可能没有登录到 GC 的潜在问题等)。我还没有这样做,我正在为我的下一场比赛做计划。

【讨论】:

以上是关于Game Center API + In-App Purchases API = 一个应用有两个不同的用户帐户?的主要内容,如果未能解决你的问题,请参考以下文章

我被迫使用Apple In-App Purchase API

Google Play In-app Billing API 版本低于 3

android in-app billing v3 api中的开发人员有效负载应该是啥?

在 Google In-App Billing API 中使用啥作为开发人员有效负载?

android in-app billing v3 api中的开发者有效负载应该是多少?

处理 Game Center 身份验证