iPhone StoreKit - 无效的产品ID

时间:2009-06-25 00:42:36

标签: iphone iphone-sdk-3.0 storekit

我正在尝试在沙盒环境中测试In App Purchase。

为了测试代码,我做了以下事情:

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

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

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

  4. 在中设置断点 (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 回调

  5. 所有提交的产品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];
    

    我错过了一些明显的东西吗? 任何帮助表示赞赏。

    Achim的

22 个答案:

答案 0 :(得分:53)

如果您仍然收到无效的产品ID,我一直在积累所有各种原因的清单:

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

答案 1 :(得分:15)

我花了两天时间在我的所有productsRequest(for AppID)上苦苦挣扎,最终在response.invalidProductIdentifiers列表中,而不是在response.products列表中。 Apple在处理他们的商店套件时肯定做过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/)。确实没关系。确保检查“已售出”并且图标为绿色(填写表格后需要额外的步骤来批准)。另一个担心是我是否可以在调试模式下使用开发人员临时(不是分发临时),它确实也可以。我希望这可以帮助你们中的一些人。祝你好运并有信心。它最终会起作用。

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:5)

手机越狱了,你只需要在Cydia中卸载appSync,然后就可以了吗

答案 4 :(得分:4)

Apple有一个非常出色的文档,最后报道了这一点。它也消除了一些关于无效的事情的神话(例如提交二进制文件)。

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

答案 5 :(得分:3)

我们最终创建了一个新的配置文件,某个地方有一条线(无法回想起在应用程序购买的文档中,而不是在应用程序购买的文档中),表明您必须在配置文件中启用应用内购买。我们无法使用现有的配置文件,因此我们创建了一个新配置文件,然后我们就可以启用它。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

我尝试了在Apple论坛和这里建议的所有内容,仍然无法让它工作。找到解决方案 - 您的应用需要通过Xcode传输才能启用沙箱。

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

因此,请从您的设备中删除该应用。然后使用Build& amp;将应用程序安装回设备上。将您的设备连接到Mac上运行。它现在应该工作:)

答案 8 :(得分:2)

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

答案 9 :(得分:2)

在我的情况下,我没有完成银行信息,税务信息和联系信息。一旦完成此操作,我就可以获得我的产品ID,希望这会对某人有所帮助。

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

答案 12 :(得分:1)

@ 8为什么?你的产品被命名为com.super.duper.8吧?

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

答案 13 :(得分:1)

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

NSSet *productList = [NSSet setWithObjects:product id]

您可以从iTunes连接中获取此产品ID。

您需要确保已创建测试用户,并已退出原始iTunes帐户。请注意不要使用测试用户帐户登录,无论苹果文档说什么,只需在弹出窗口时使用它。

答案 14 :(得分:1)

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

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

取代:

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

使用:

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

答案 20 :(得分:0)

可能是另一个问题。如果您的xCode项目的名称不是英文的,或者其中包含其他字符,则包ID将具有“------”,其中应用的名称应该是。我认为这只是bundle id的约定,在xCode中有这个。事实证明,这是我的问题,所以用英语命名你的xCode项目)我知道这不是最多的情况,但无论如何)

答案 21 :(得分:0)

我尝试了每个人都在谈论的一切。我最初建立了一个访客帐户,看看是否可以找到产品ID ....这是。那么我开始退出活动监视器中的所有内容并发现问题。我不得不退出"商店"以下流程。我突然停止获取无效的产品ID。希望能帮到那里的人。

Quit these if you're getting the invalid product id null error