StoreKit 返回无效的产品标识符 - 仅在真正的 App Store 上,仅在 iOS7 上

Posted

技术标签:

【中文标题】StoreKit 返回无效的产品标识符 - 仅在真正的 App Store 上,仅在 iOS7 上【英文标题】:StoreKit returns invalid product identifiers - only on the real App Store, only on iOS7 【发布时间】:2015-03-04 07:52:15 【问题描述】:

我们有一个应用程序可以像往常一样向 StoreKit 查询产品详细信息(您可以忽略它是一个 Xamarin 应用程序,除非 Xamarin 中存在错误,否则它应该不会产生影响):

        var request = new SKProductsRequest( new NSSet( ... ) );
        _runningRequests.Add( request );
        request.ReceivedResponse += HandleReceivedResponse;
        request.RequestFailed += HandleRequestFailed;
        request.RequestFinished += HandleRequestFinnished;
        request.Start();

    // ....

    void HandleReceivedResponse( object sender, SKProductsRequestResponseEventArgs e )
    
        ViewModel.IsProcessing = false;

        foreach (var item in e.Response.InvalidProducts)
            Console.WriteLine( "Invalid product: " + item );

        var products = e.Response.Products.Select( x => new InAppProductViewModel( x.LocalizedTitle, x.ProductIdentifier, x.LocalizedDescription, LocalizedPrice( x ), IsPurchased( x ), () => Purchase( x ) ) );
        var vms = products.ToList();

        ViewModel.UpdateProducts( vms );
    

会发生什么:

在沙盒/测试环境中,我们可以在 ios 7 和 iOS8 设备上很好地查询产品 ID 并接收正确的响应 该应用通过审核,我们已经成功销售商品,因此它适用于部分用户。 然而,我们有客户报告说他们在我们的 In App Store 中看不到任何内容。它们都有一个共同点,那就是运行 iOS 7 设备。 我们可以重现该问题 - 对于在控制台上的 App Store 上发布的版本,我们会看到我们传递到 SKProductRequest 的每个标识符的输出“无效的产品 ID”。标识符与我们在代码中指定的完全匹配。

这似乎只发生在 iOS 7 设备上,在实时 AppStore 环境中。我假设他们已经通过 iTunes 更新或其他方式破坏了 iOS 7 上的应用内购买。沙盒环境没有显示问题真的很奇怪。我们在多个设备和多个 iTunes 帐户上进行了测试,并安装了应用程序。客户也遇到了这些问题。

我已经与 Apple 开发者技术支持和 iTunes 提供商支持合作,他们无法/不愿意最终与工程团队一起诊断问题。因此,在这里问这个问题,看看是否有其他人遇到同样的问题,或者能够检查他们的应用程序。我们已经等待了超过 24 小时的“产品更新”,本应解决该问题,但它没有。

任何拥有应用内购买功能的应用程序的人都可以测试实时 App Store 版本是否仍可在 iOS7 上运行?


注意:这种情况已经超过 72 小时了,这表明这不是暂时的侥幸:

iOS In App Purchase - "Invalid Product ID" in release, NOT development version In-App-Purchase invalid product id only on release version

我们已经向 AppStore 发布了 2 次应用更新,但都没有解决问题。在 iOS8 上效果很好,在 iOS7 上无效产品标识符。

这是我们从应用程序获得的控制台输出(稍微修改了日志记录)。 TASK-ASSERT 错误可能暗示出现问题,但我找不到关于该错误的任何信息。

Mar 10 08:08:28 iDevPad01 itunesstored[832] <Error>: TASK-ASSERT: cfurlcache - ProcessCacheTask - FAILED to get task-assertion, going commando with 1 items to process.
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Received SKProductResponse, debugdescription: <SKProductsResponse: 0x1776d950>
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Received SKProductResponse, description: <SKProductsResponse: 0x1776d950>
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Received SKProductResponse, products: 0
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Invalid product: coach
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Invalid product: boat
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Invalid product: com.rowinginmotion.mobile.boatapp.ios.solo.boat
Mar 10 08:08:28 iDevPad01 RowingInMotionMobileBoatAppiOSSolo[855] <Warning>: Invalid product: com.rowinginmotion.mobile.boatapp.ios.solo.coach

我们三天前提交了支持 DTS 事件,终于收到了回复。他们同意我们的观点,这似乎是处理 InApp 购买的 iTC 网络服务的内部问题。我会保持这个线程是最新的。

【问题讨论】:

从发布更新到其 IAP 进入生产应用商店之间总是有几个小时。但通常会是一两个小时。你能推出一个更新(即使它的代码相同),也许这会戳苹果的服务器足以修复它?我知道你会等一个星期,但如果你没有其他尝试? @MarkJohnson:该应用已在 App Store 上架了一个多星期,并且可以在 iOS8 设备上运行。我们在队列中有更新 - 等待时间是 PITA,但是是的,我们确实在尝试。 【参考方案1】:

好消息 - Apple 终于找到了问题的原因。似乎 Xamarin.iOS 在构建过程中开始将 iTunesMetadata.plist 文件添加到 App 包中(即使我们没有构建 IPA 并通过 xcode 档案进行部署)。

引用我们的 iOS 支持工程师的话:

问题似乎在于,在您上传到 iTunesConnect 的可交付资产中,有一个“流氓 iTunesMetadata.plist”,它在 iOS 6/7 下运行的其他应用内购买应用程序中不存在。这里的问题是,当应用程序从商店安装到设备时,应用程序中内置了相同的文件。因为这个文件已经存在于 app bundle 中,所以没有使用 StoreKit 安装的那个。这是一个问题的原因是 iTunesMetaData.plist 缺少 2 个字段值,这些字段值通常包含在调用 SKProductsRequest 时生成的 fetchSoftwareAddOns URL 请求中。

作为临时解决方法,我已经修补了“_CompileITunesMetadata”msbuild 任务以防止生成 iTunesMetadata.plist

  <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
  <!-- NOP out CompileITunesMetadata task, which creates a rogue metadata plist file that can break In App Purchases on iOS7 -->
  <Target Name="_CompileITunesMetadata" DependsOnTargets="_DetectSdkLocations;_DetectAppManifest;_GenerateBundleName;_CompileAppManifest">
     <Message Text="Skipping CompileITunesMetadata task, which creates a rogue metadata plist file that can break In App Purchases on iOS7" />
  </Target>

我们的 iOS 支持工程师向我表示,iTunesConnect 可能会构建验证例程,以防止/拒绝包含流氓 iTunesMetadata.plist 的应用提交,希望其他人不会受到这种奇怪行为的影响。

【讨论】:

以上是关于StoreKit 返回无效的产品标识符 - 仅在真正的 App Store 上,仅在 iOS7 上的主要内容,如果未能解决你的问题,请参考以下文章

颤振:storekit_duplicate_product_object。有相同产品标识符的待处理交易

swift 4 中的应用内购买无效的产品标识符

在 App Purchase 中,30% 的产品标识符无效,为啥?

将应用内集成到 iOS 应用程序中的问题 [关闭]

在应用程序购买“无效的产品标识符”错误消息

IAP 产品标识符无效