在iOS 13中请求应用内购买失败

61

我使用SwiftyStoreKit请求应用内购买,但仅在iOS 13上出现以下错误:

Error: Optional(Error Domain=ASDErrorDomain Code=507 "Error decoding object" UserInfo={NSLocalizedDescription=Error decoding object, NSLocalizedFailureReason=Attempted to decode store response})

我的沙盒账号无法查询产品信息或进行购买,但在我设备上的iOS 12.1却可以正常使用。然而,在iPhone 11模拟器或实际安装了iOS 13的设备上无法使用。

我发现很多人都在遇到这个问题,即Xcode 11 GM seed 1测试版模拟器上出现了此问题,但我还没有找到解决方法。我也尝试了新发布的Xcode 11 GM seed 2版本,但对我来说并没有解决问题。

有人知道如何在安装iOS 13后再次请求和购买应用内购买吗?


请问您能提供一下购买的代码吗?我使用的是Xcode 11 GM版本,但目前还没有出现任何错误。 - apphud
我遇到了同样的问题,但是使用RMStore,尽管它已经没有维护了,但在iOS 12上仍然正常工作。 - mstenroos
这个问题有进展了吗?我也遇到了非常类似的问题。 - SolidSnake4444
我已经尝试了一切可能让应用内购买在iOS 13的beta版本中正常工作。在iOS 13发布之前,我的应用被苹果拒绝了(使用购买按钮时没有任何反应)。后来,我能够使用iPhone 11和iOS 13的公共版本测试应用程序,一切都再次正常工作。我无法确定问题出在哪里,也没有更改代码。该应用程序现在又处于“等待审核”状态。如果它被接受,我会再更新一下。使用iPhone 11,iOS 13启动应用程序时控制台中没有更多错误。 - Timothy C.
Xcode 13.4.1:iOS 14模拟器出现相同问题,但SKProductsRequest在iOS 15模拟器上运行良好。在某些CI机器上,iOS 13模拟器会失败,但有时不会。 - mm2001
显示剩余3条评论
4个回答

135
重新启动Xcode和模拟器就解决了问题:现在我的应用内购买在iOS 13模拟器中可以正常加载。
编辑:这也发生在发布版的Xcode 11中。有时会出现此问题,但重新启动Xcode和模拟器仍然有帮助。
编辑2:在Xcode 12 beta中也存在此bug。但解决方法是创建新的StoreKit配置文件(在“文件->新建”菜单中)。

Adding StoreKit Configuration file

然后在那里添加所有你的产品。使用与AppStore Connect中相同的产品ID。

Adding products

然后将此文件添加到运行方案配置中。

Setting Scheme Run options


3
这对我也有用,在Xcode的发布版本(以及模拟器)上。在那之前,我在iPad模拟器中遇到了同样的错误,但是在iPhone模拟器中没有。 - Kendall Helmstetter Gelner
7
每次我开始新的模拟器时都会发生这种情况。苹果做得好。:( - Timur Bernikovich
1
我快要疯了。(2) 重新启动xCode和模拟器有帮助。非常感谢! - Raman Shyniauski
4
如果您对Xcode不熟悉(就像我一样):可以通过导航到Product > Scheme > Edit Scheme来编辑方案。 - Nathan Friend
@silvansky StoreKit配置非常简单。这就是应该处理IAP的方式! - software is fun
显示剩余2条评论

2
对于那些在iOS 14.0中遇到此问题的人,您仍然需要按照@silvansky的答案创建storekit配置文件。我们可以在进行任何产品请求之前启动SKTestSession,而不是将其添加到目标,以避免出现错误。
if #available(iOS 14.0, *) {
    do {
        let session = try SKTestSession(configurationFileNamed: "Your_StoreKit_Configuration_File_Name")
        session.disableDialogs = true
    } catch {
        // catch error here
    }

    // Start your product request here
    let productIdentifiers = Set(["product_identifier_1", "product_identifier_2"])
    let productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers)
    productsRequest.delegate = self

    // Run the request
    productsRequest.start()
}

您可以参考苹果公司关于SKTestSession的文档,了解更多信息:https://developer.apple.com/documentation/storekittest/sktestsession


1
我遇到了同样的问题,iOS13模拟器出现了相同的错误,而iOS12模拟器运行良好。 然后我在安装了iOS13的iPhone上尝试,那里的调用也非常顺畅。
希望Xcode模拟器能够很快修复这个问题,我想在那之前我们都会受困于这个错误。
编辑: 现在看起来iOS 13模拟器设备中的调用也可以正常工作。

即使您重置了所有内容和设置,在模拟器中仍然会发生这种情况。Xcode 11.2.1(11B500)。 - Kukiwon

1

注意:我已经更新了答案,请阅读编辑部分。

根据我的经验,似乎在Xcode 11.1 GM Seed中不再存在这个问题。现在不需要重新启动模拟器或Xcode就可以使应用内购买正常工作了。

我提交了一个应用进行审核,结果被拒绝了,因为出现了这个特定的错误。后来证明,这是一个愚蠢的原因,因为这不是我的应用程序的错误,但是我花了几个小时来解决它。

所以,只需更新到Xcode 11.1 GM Seed并再次运行即可。一切都会没问题的。

编辑

Xcode 11.1仍然存在这个问题,显然我很幸运没有再次遇到它。然而,我因为同样的原因被拒绝了第二次。 最终有效的方法 是这样的:

我必须通过编辑和保存IAP记录来更新我的App Store上的记录。

因此,我建议您尝试相同的方法;暂时更改您的IAP,保存,然后恢复您的更改(并再次保存),以刷新App Store上的记录。

FYI,在第二次拒绝后,苹果使我的应用内购无效,因此向我展示了正确的方式。看起来他们最终认识到这是一个已知问题。
有关详细信息,请阅读我在Reddit上发表的讨论

@TimurBernikovich 谢谢你的更新,其他人也告诉我同样的事情。我编辑了我的答案,并描述了它最终是如何工作的。 - Gabb
我在Xcode 11.2.1(11B500)仍然遇到这个问题。 - Kukiwon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接