【问题标题】:iPhone StoreKit - invalid product id'siPhone Store Kit - 无效的产品 ID
【发布时间】:2010-11-05 17:07:33
【问题描述】:

我正在尝试在沙盒环境中测试应用内购买。

为了测试代码,我做了以下操作:

  1. 在 iTunes Connect 的“管理用户”下创建了一个应用内购买测试用户帐户

  2. 在“管理您的应用内购买”下创建了一些应用内购买产品。我对产品 ID 使用了数字值和字母数字值。

  3. 将应用程序加载到 iPhone 上,进入设置->商店并退出常规商店并进入在步骤 1 中创建的测试帐户

  4. 在 (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 回调

所有提交的产品 ID 都在 response.invalidProductIdentifiers 属性中。 提交请求时,我首先尝试了在第 2 步中创建的确切产品 ID。我还尝试在它们前面加上 Bundle ID:

NSString *id2 = @"com.super.duper.8";
NSSet *productList = [NSSet setWithObjects:id2, @"8", nil];

SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:productList];

我是否遗漏了一些明显的东西? 任何帮助表示赞赏。

阿奇姆

【问题讨论】:

  • 就我而言,以前的银行账户不再有效。

标签: iphone iphone-sdk-3.0 storekit


【解决方案1】:

如果您仍然收到无效的产品 ID,我已经积累了一份包含所有各种原因的清单:

http://troybrant.net/blog/2010/01/invalid-product-ids/

【讨论】:

  • 令人惊讶的是,从我的设备中删除应用程序并重新安装解决了这个问题。谢谢特洛伊!
  • 这对我也有用。当 iap 上线时,这不会发生,对吧?它目前在沙盒中。
  • 我想在这里添加一些东西。特洛伊在帮助我们所有人解决这些问题方面表现出色,谢谢特洛伊!
  • 我在这里的发现是在指定整个 bundle.productID 时它不起作用。我决定在集合中创建我的“产品 ID 字符串”的不同版本的列表,看看会发生什么。我的例子: setWithObjects: @"com.blah.appname.purchase1", @"com.blah.appname", @"purchase1", nil ...奇怪的是最后一个有效!其他人都失败了。 (希望这对任何人都有帮助)
  • "您的 PHP 安装似乎缺少 WordPress 所需的 MySQL 扩展。"
【解决方案2】:

我花了两天时间来处理我所有的 productsRequest(对于 AppID)最终都在 response.invalidProductIdentifiers 列表中,而不是在 response.products 列表中。 Apple 在处理他们的 storekit 方面确实做得 F 级。它令人困惑、交织和复杂。

我终于解决了。正如论坛中少数人指出的那样,我学到的一个非常重要的教训是:您在 itunesconnect.apple.com 上输入的内容可能需要几个小时才能生效。

有两部分:您的 xcode 中的应用程序名称和 AppID 以及您在 itunesconnection 中输入的内容,它们必须完全匹配(区分大小写)。如果您注册或修改了您的应用内 AppleID(我还完成了我的所有合同和银行信息,正如一些人建议的那样,如果没有完成这部分,购买操作将无法正常工作),您不妨先去睡觉再测试一遍因为在我的情况下确实需要几个小时才能生效。在我 9 岁的孩子把我拖到睡前故事之前,我非常沮丧地与这个问题作斗争,然后惊讶地发现当我醒来时问题就消失了。

我发现 Eddy71 在http://www.iphonedevsdk.com/forum/iphone-sdk-development/21035-problems-creating-test-user-app-purchase.html 中的建议非常有帮助。在解决它之前,我在 Eddy 的检查清单中做了所有我可能做的事情,但仍然得到零个产品,我担心的一个问题是,如果不上传二进制代码来完成在 itunesconnect 中的应用程序注册是否可以(不需要按照所教的那样上线http://blog.mugunthkumar.com/coding/iphone-tutorial-%E2%80%93-in-app-purchases/)。确实没问题。确保选中“已批准出售”并且图标为绿色(填写表格后您需要一个额外的步骤来批准它)。另一个担心是我是否可以在调试模式下使用开发人员临时(不是分发临时),它也确实可以。我希望这可以帮助你们中的一些人。祝你好运,有信心。它最终会起作用。

【讨论】:

    【解决方案3】:

    我们的问题是 Apple 常见问题解答中的最后一个要点,“Why are my product identifiers being returned in the invalidProductIdentifiers array?”:

    • 您没有完成所有财务要求(请参阅本文档的“合同、税务和银行信息”部分)。
    • 您没有使用明确的 App ID。
    • 您没有使用与您的显式应用 ID 关联的配置文件。
    • 您没有在代码中使用正确的产品标识符。有关产品标识符的更多信息,请参阅技术问答、QA1329、“应用内购买产品标识符”。
    • 您没有清除在 iTunes Connect 中出售的应用内购买产品。
    • 您可能已经修改了您的产品,但这些更改尚不适用于所有 App Store 服务器。
    • 如果您或 App Review 拒绝了您在 iTunes Connect 中的最新二进制文件。

    我通过点击 iTunes Connect 中的“准备上传二进制文件”将最新版本(已被拒绝)更改为“等待上传”,大约 10 分钟后问题得到解决。

    【讨论】:

      【解决方案4】:

      手机越狱没问题,你只需要在Cydia中卸载appSync就可以了

      【讨论】:

      • 我第 6 次遇到这个问题,第 6 次这个确切的帖子有帮助。真的应该收藏这个页面:-)
      【解决方案5】:

      Apple 有一个非常棒的文档,该文档最后涵盖了这一点,但鲜为人知。它还消除了一些关于无用的神话(例如,提交二进制文件)。

      Technote 2259 "Adding In-App Purchase to your iOS and Mac Applications"

      【讨论】:

        【解决方案6】:

        我们最终创建了一个新的配置文件,在某处有一行(不记得在哪里,不在应用内购买的文档中)说明您必须在配置文件中启用应用内购买。我们现有的配置文件无法做到这一点,因此我们创建了一个新配置文件,然后我们可以启用它。

        【讨论】:

          【解决方案7】:

          尝试重置 iphone 设置并从 iphone 中删除应用程序并直接使用请求产品 ID 而不使用 Bundle ID

          【讨论】:

          • 好点 - 如果它是消耗品,您必须获取没有捆绑 ID 的产品 ID。非消耗品并非如此。谢谢!
          【解决方案8】:

          对于遇到这些问题的其他人,我强烈建议您阅读 Apple 论坛上的 this thread

          【讨论】:

            【解决方案9】:

            我尝试了 Apple 论坛和此处的所有建议,但仍然无法正常工作。找到了解决方案 - 您的应用需要通过 Xcode 传输才能启用沙箱。

            很明显,对吧?好吧,如果您正在对现有应用程序进行更新,该设备仍会将其视为 App Store 安装的应用程序。

            因此,请从您的设备中删除该应用。然后使用 Build & Run 将应用程序重新安装到设备上,并将您的设备连接到 Mac。它现在应该可以工作了:)

            【讨论】:

            • 运行 Xcode 4.5,在它必须在模拟器中运行之前,您不必为此烦恼。
            【解决方案10】:

            就我而言,我没有填写银行信息、税务信息和联系信息。完成后,我可以获得我的 productID,希望这对某人有所帮助。

            【讨论】:

              【解决方案11】:

              这是你出错的地方,你需要在你的代码中:

              NSSet *productList = [NSSet setWithObjects:product id]

              您可以从 iTunes connect 获取此产品 ID。

              并且您需要确保您已经创建了一个测试用户,并且已经退出了您原来的 iTunes 帐户。请注意不要使用测试用户帐户登录,不管苹果文档怎么说,只要在出现弹出窗口时使用它。

              【讨论】:

                【解决方案12】:

                @"8" 是干什么用的?你的产品被命名为 com.super.duper.8 对吧?

                http://blog.mugunthkumar.com/coding/iphone-tutorial-%e2%80%93-in-app-purchases/

                【讨论】:

                  【解决方案13】:

                  我遇到的另一个问题是我必须转到 Xcode 中的 Window > Organizer 并删除我的应用程序和配置文件,然后重新添加我的开发配置文件。作为额外措施,我重新启动了设备和 xcode。

                  【讨论】:

                    【解决方案14】:

                    我已经尝试了互联网上所有可用的解决方案,但没有任何效果,绝对没有。我的问题:我的设备已经越狱并且上面有 Cydia。我将设备恢复为出厂默认设置(未越狱),它第一次工作并返回产品 ID 没有问题。

                    【讨论】:

                      【解决方案15】:

                      对我来说,问题是我在设置应用内购买时选择了“打开内容托管”。所以我不得不把它关掉,问题就解决了。

                      【讨论】:

                        【解决方案16】:

                        商店需要一些时间才能将产品提供给所有服务器(请参阅文档)。因此,在 iTunes Connect 中创建产品和在设备上进行测试时将该产品 ID 视为有效产品 ID 之间可能会出现延迟。对我来说,我的产品出现大约需要 12 个小时。

                        【讨论】:

                          【解决方案17】:

                          给其他人的注意事项:不要将 NSMutableSet 用于产品 ID。它必须是一个 NSSet!

                          【讨论】:

                            【解决方案18】:

                            如果您想保留应用数据,但又想尝试删除应用以解决此问题,请先同步您的设备。然后删除您的应用程序并从 Xcode 重新安装——这为我解决了这个问题。一旦它开始工作,您就可以从其备份中恢复您的设备 - 这只需要几分钟,并且产品请求在恢复后仍然有效。

                            【讨论】:

                              【解决方案19】:

                              不完全确定为什么,但是当我将请求的产品 ID 从“com.mycompany.myapp.product”更改为“产品”时,它开始工作。也许是因为我在 iTunes Connect 中配置产品的方式。

                              试一试,可能对你们中的一些人有用...

                              【讨论】:

                              • 简单地说,产品 ID 必须与您在 iTunes Connect 中输入的内容完全匹配。 bundle id 不会自动引入,您可以在创建应用内购买时选择是否包含它
                              【解决方案20】:

                              替换:

                              NSSet *productList = [NSSet setWithObjects:id2, @"8", nil];
                              

                              与:

                              NSSet *productList = [NSSet setWithObjects:@"8", nil];
                              

                              【讨论】:

                                【解决方案21】:

                                可能是另一个问题。如果您的 xCode 项目的名称不是用英文写的,或者其中包含其他字符,则 bundle ID 将在您的应用程序名称所在的位置带有“------”。我认为这只是捆绑ID的约定,在xCode中有这个。原来,这是我的问题,所以用英文命名你的 xCode 项目)我知道这不是大多数情况,但无论如何)

                                【讨论】:

                                  【解决方案22】:

                                  我尝试了每个人都在谈论的一切。我最终创建了一个访客帐户,以查看是否可以找到产品 ID.... 是的。所以然后我开始退出活动监视器中的所有内容并发现了问题。我不得不退出下面的“商店”进程。突然间,我不再获得无效的产品 ID。希望能帮助到那里的人。

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多