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。有相同产品标识符的待处理交易