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

我们有一个应用程序查询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 ); } 

会发生什么是:

  • 在Sandbox / Test环境中,我们可以在iOS 7和iOS8设备上查询产品ID,并获得适当的响应
  • 该应用程序通过审查,我们已经成功地销售项目,所以这是为一些用户的工作。
  • 然而,我们有客户报告说,他们无法在我们的应用程序商店看到任何东西。 他们都有共同点,他们正在运行iOS 7设备。 我们可以重现这个问题 – 在控制台上的App Store上发布的版本中,我们看到每个标识符都输出到SKProductRequest的输出“Invalid product id”。 标识符完全匹配我们在代码中指定的内容。

看来这只发生在iOS 7设备上,在实时AppStore环境中。 我认为他们已经打破了iOS 7的应用程序购买与iTunes更新或任何。 沙盒环境不显示问题真的很奇怪。 我们在多个设备和多个iTunes帐户上进行了testing,并安装了应用程序。 客户也有这些问题。

我已经与苹果开发者技术支持和iTunes提供商支持合作过了,他们不能/不愿意在工程团队中诊断问题。 因此,在这里问这个问题,看看其他人是否遇到相同的问题,或者能够检查他们的应用程序。 我们已经等待了超过24小时的“产品更新”,本来应该解决这个问题,但事实并非如此。

任何具有“应用内购买”function的应用都可以testingiOS7上的app store版本是否仍然适用?


注意:这已经超过72小时了,暗示它并不是像下面这样的暂时的侥幸:

  • iOS应用内购买 – 发行版中的“无效产品ID”,不是开发版本
  • 应用内购买无效的产品ID只在发布版本

我们已经发布了两个App到AppStore的更新,但没有一个解决了这个问题。 在iOS8上效果很好,iOS7上的invalidProductIdentifiers效果非常好。

这是我们从我们的应用程序得到的控制台输出(稍微修改日志logging)。 什么可能是一个错误的提示是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购买的iTCnetworking服务中的一个内部问题。 我会保持这个线程最新。

好消息 – 苹果终于找出了问题的原因。 看起来,Xamarin.iOS开始在构build过程iTunesMetadata.plist文件添加到应用程序包(即使我们不构buildIPA并通过xcode存档进行部署)。

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

问题似乎是,在您上传到iTunesConnect的可交付资产中,有一个“stream氓iTunesMetadata.plist”,在iOS 6/7下工作的应用程序购买应用程序中不存在。 这里的问题是,应用程序从应用程序从应用程序安装到设备时,存在相同的文件。 由于此文件已存在于应用程序包中,因此不使用StoreKit安装的文件。 这是一个问题,原因是iTunesMetaData.plist缺less通常包含在调用SKProductsRequest时生成的fetchSoftwareAddOns URL请求中的2个字段值。

作为临时的解决方法,我已经修补了“_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可能build立在validation例程中,以防止/拒绝包含恶意iTunesMetadata.plist应用程序提交,所以希望其他人不会受到这种奇怪的行为。