Ios 为什么我的应用被拒绝用于应用内购买?

Ios 为什么我的应用被拒绝用于应用内购买?,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,您好,我正在App Store上发布我的应用,因为他们一直坚持我的应用内购买设置不正确 在沙箱中亲自测试后,一切正常 这是他们发给我的信息,我把代码贴在下面 感谢您抽出时间来帮助我 准则2.1-性能-应用程序完整性 我们发现您的应用内购买产品出现一个或多个bug 在Wi-Fi上运行iOS 12的iPhone和iPad上查看时 具体来说,应用内购买按钮不起作用 下一步 在服务器上验证收据时,服务器需要能够 处理一个生产签名应用程序,从苹果的 测试环境。建议的方法适用于您的生产 服务器始终根据生产应

您好,我正在App Store上发布我的应用,因为他们一直坚持我的应用内购买设置不正确

在沙箱中亲自测试后,一切正常

这是他们发给我的信息,我把代码贴在下面

感谢您抽出时间来帮助我

准则2.1-性能-应用程序完整性

我们发现您的应用内购买产品出现一个或多个bug 在Wi-Fi上运行iOS 12的iPhone和iPad上查看时


具体来说,应用内购买按钮不起作用

下一步

在服务器上验证收据时,服务器需要能够 处理一个生产签名应用程序,从苹果的 测试环境。建议的方法适用于您的生产 服务器始终根据生产应用商店验证收据 第一。如果验证失败,错误代码为“使用了沙盒收据” 在生产中,“您应该针对测试环境进行验证 相反


苹果的应用程序审查非常严格。从经验上讲,我曾多次遇到过这个问题。在进入
givePurchasedProduct
功能之前,您的代码对我来说似乎很好

好吧,我注意到:

  • 您的应用程序将处理付款,如果没有问题,我们将得到
    返回“已购买”
  • 如果案例是
    case.purchased:
    ,那么我们调用给定的PurchasedProduct
  • 关于你的职能。您可以将购买分开,以查看它是Zap购买还是删除广告

    不过。这一行让我很困惑——当
    包含最近引入的
    时,为什么要使用
    范围

    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)")
        }
    }