Ios 为什么我的应用被拒绝用于应用内购买?
您好,我正在App Store上发布我的应用,因为他们一直坚持我的应用内购买设置不正确 在沙箱中亲自测试后,一切正常 这是他们发给我的信息,我把代码贴在下面 感谢您抽出时间来帮助我强> 准则2.1-性能-应用程序完整性 我们发现您的应用内购买产品出现一个或多个bug 在Wi-Fi上运行iOS 12的iPhone和iPad上查看时Ios 为什么我的应用被拒绝用于应用内购买?,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,您好,我正在App Store上发布我的应用,因为他们一直坚持我的应用内购买设置不正确 在沙箱中亲自测试后,一切正常 这是他们发给我的信息,我把代码贴在下面 感谢您抽出时间来帮助我 准则2.1-性能-应用程序完整性 我们发现您的应用内购买产品出现一个或多个bug 在Wi-Fi上运行iOS 12的iPhone和iPad上查看时 具体来说,应用内购买按钮不起作用 下一步 在服务器上验证收据时,服务器需要能够 处理一个生产签名应用程序,从苹果的 测试环境。建议的方法适用于您的生产 服务器始终根据生产应
具体来说,应用内购买按钮不起作用 下一步 在服务器上验证收据时,服务器需要能够 处理一个生产签名应用程序,从苹果的 测试环境。建议的方法适用于您的生产 服务器始终根据生产应用商店验证收据 第一。如果验证失败,错误代码为“使用了沙盒收据” 在生产中,“您应该针对测试环境进行验证 相反
苹果的应用程序审查非常严格。从经验上讲,我曾多次遇到过这个问题。在进入
givePurchasedProduct
功能之前,您的代码对我来说似乎很好
好吧,我注意到:
返回“已购买”
case.purchased:
,那么我们调用给定的PurchasedProduct包含最近引入的时,为什么要使用范围
if productID.contains("Zap") {
// No Zapp? it has to be Ads then
NotificationCenter.default.post(name: Notification.Name.init("zapPurchased"), object: nil)
} else {
NotificationCenter.default.post(name: Notification.Name.init("noAdsPurchased"), object: nil)
}
旁注。你可能忘了:
到导入基础
我不知道通知的背后是什么,因为没有包含代码。但是它不能交付
还有很多<代码>收据验证
是一个令人头痛的问题,但在需要时。这让你的应用程序更轻松、更安全
如果你在验证收据。这些问题及其答案对我帮助很大。请参阅:
SwiftyStoreKit
。收据验证就像点击一个按钮:
使用此方法(可选)一步刷新收据并执行验证
let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "your-shared-secret")
SwiftyStoreKit.verifyReceipt(using: appleValidator, forceRefresh: false) { result in
switch result {
case .success(let receipt):
print("Verify receipt success: \(receipt)")
case .error(let error):
print("Verify receipt failed: \(error)")
}
}
另一方面。对于审阅者,购买的内容未交付。所以他们认为这是一个错误
您如何验证购买?交付内容?请更新您的问题。我相信我会帮上忙的
祝你好运我认为你的iOS代码没有问题。从苹果的回复中,他们说,您的服务器指向Apple InApp购买的生产环境,并验证从应用程序中使用的Apple InApp购买测试环境收到的收据。
苹果有两个InApp采购环境——测试和生产环境。两种环境的行为相同。当您在iPhone上运行应用程序以通过QA进行测试时,或者在调试时,它会连接到测试环境。在使用测试环境时,您不需要实际付费。但产生的收益与实际生产环境几乎相同
现在,当您将应用程序提交到应用商店时,它将自动从生产环境中进行购买。向用户收费并生成实际收据
我认为您的应用程序正在将这些收据发送到服务器,而您的服务器使用了错误的InApp服务器环境来验证收据。
在您的服务器上,确保根据您的InApp采购收据正确选择Apple InApp采购环境URL。如果您或您的团队正在测试应用程序,您的服务器必须使用测试URL,并且当应用程序提交到生产时,您的服务器必须使用InApp购买的生产URL。“您的应用程序内购买按钮不起作用”,那么响应按钮的代码在哪里?他们告诉过你,这就是问题的症结所在。-此外,singleton如何作为SKPaymentTransactionObserver工作?你需要展示更多的架构来证明这是可能的;在成功保存购买之前,您正在调用
finishTransaction
。在确认您的应用程序已识别购买之前,您不得完成交易。由于您只是简单地触发了一个通知,因此无法确定是否发生了这种情况。此外,恢复完成的事务将创建一个无限循环。在您的事务观察器中,还原的
状态应与购买的
状态相同。@matt为什么事务观察器不能是单例(除了不使用单例的一般原因之外)?。事务观察者实际上需要与应用程序本身相同的生存期。如果我不使用单例,我将对象实例作为app委托的属性,这与effect@Paulw11我毫不怀疑您很早就创建了这个单例,并将其分配到一个持久变量/属性中,并将其设置为观察者。我没有理由认为OP也在这样做。我要求OP给我看证据,仅此而已。代码不起作用,所以我为什么要想当然呢?好吧,我同意。我们需要知道如何以及何时实例化它们的对象。在我阅读您的评论时,我认为您是在向Singleton观察家提出一个问题,而不是关于此代码实例化的细节。您好,感谢您花时间回答!不幸的是,我不认为这适用于我,因为我没有一个服务器,这个应用程序是一个小游戏,不需要后端那么,你在处理接收吗
let appleValidator = AppleReceiptValidator(service: .production, sharedSecret: "your-shared-secret")
SwiftyStoreKit.verifyReceipt(using: appleValidator, forceRefresh: false) { result in
switch result {
case .success(let receipt):
print("Verify receipt success: \(receipt)")
case .error(let error):
print("Verify receipt failed: \(error)")
}
}