SKProduct 的快速应用内购买问题

Posted

技术标签:

【中文标题】SKProduct 的快速应用内购买问题【英文标题】:swift In App Purchase issue with SKProduct 【发布时间】:2018-02-03 13:39:16 【问题描述】:

我正在制作一个带有一些 IAP 的应用程序,但我遇到了一个无聊的问题,这让我感觉很疯狂.. 我测试了我的 IAP,但它不起作用。 (什么都没发生)我检查了问题所在,发现问题来自SKProduct。 所以我尝试使用SKProductsRequest(productIdentifiers: productIds) 请求产品,然后如果我打印:response.products.count,结果将是0。 (response:SKProductsResponse)

这是我请求产品的代码:

class IAPHandler: NSObject 
static let shared = IAPHandler()

fileprivate var productID = ""
public var productIdentifiers:NSSet = ["com.company.app.IAP1","com.company.app.IAP2"]
public var iapProducts = [SKProduct]()
var productsRequest = SKProductsRequest()

var purchaseStatusBlock: ((IAPHandlerAlertType) -> Void)?


func canMakePurchases() -> Bool   return SKPaymentQueue.canMakePayments()  

func purchaseMyProduct(index: Int)

    print(iapProducts.count)

    if iapProducts.count == 0  return  .    //// return 0 !

    if self.canMakePurchases()  .   //// return true

        let product = iapProducts[index]
        let payment = SKPayment(product: product)
        SKPaymentQueue.default().add(self)
        SKPaymentQueue.default().add(payment)


        productID = product.productIdentifier
     else 

        purchaseStatusBlock?(.disabled)
    
  

 func fetchAvailableProducts()

    productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)

    productsRequest.delegate = self
    productsRequest.start()
  
 

但是response.product 没有捕捉到任何值..

如果我的结果等于0,有人知道这意味着什么吗? 请帮我解决这个问题。 不要犹豫,向我询问更多信息。

【问题讨论】:

这是使用 Swift 3,但没有太大变化。 code.tutsplus.com/tutorials/… 它会引导您完成从创建沙盒帐户到通过购买和恢复购买来寻找产品的所有过程。一个问题 - productIds 是类型 Set&lt;String&gt;... 你为此提供了什么。您不需要给出具体的值,但至少需要给出“格式”。好的,第二个问题。 :-) 你能提供你的代码吗? 我邀请您阅读我编辑的问题以及我的代码示例。 在这里评论而不是我的回答。 :-) 你正在做一些我还没有做的事情——多个 IAP。也许只尝试一个 - 如果找到它,您就知道问题与您如何处理倍数有关。另一件事是我没有看到类似于我的fetchAvailableProducts 的电话。您在原始代码中有它。也许您在编辑时不小心遗漏了它? 是的,对不起,我刚刚在上面添加了这个功能。我也尝试只设置一个产品 ID,但它仍然不起作用.. 该值始终返回为零。我会再次检查问题是否来自代码或我的 iTunes Connect 配置,即使我不相信。 还有一件事 - 我在第一条评论的链接中对此进行了解释,但也许你没有这样做。如果 IAP 尚未获得批准,您需要在 iTuneConnect 沙箱中工作。您也可能不想想使用您的 Apple ID,而是创建一个沙盒帐户(或多个用于不同地区和货币的测试)。然后从设备(我不知道这是否适用于模拟器)使用 that 帐户登录到应用商店。希望对你有用。 【参考方案1】:

这是我使用的代码:

public var productIdentifiers:NSSet = "com.company.app.inapp1"
public var iapProducts = [SKProduct]()
var productsRequest = SKProductsRequest()

func fetchAvailableProducts()  
    let productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
    productsRequest.delegate = self
    productsRequest.start()


public func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) 
    if (response.products.count > 0) 
        iapProducts = response.products
    

最后,iapProducts 是一个可用产品数组。

我发现您发布的代码与此代码之间存在两个差异。

我记得我在创建 Swift Set&lt;String&gt; 时跌跌撞撞地发现,如果您首先设置一个包含您的产品的 NSSet,然后将其封装起来,它就可以工作。 即使在那之后,我也得到了零回报。原来我正在使用我创建的“SKU”,认为它应该可以工作。我需要将 StoreKit 产品 ID 设为我在 iTuneConnect 中设置的产品 ID - 通常是“com.company.app.iapname”。

【讨论】:

感谢您的意见!我用我正在使用的整个班级再次编辑了我的问题。它包含您对NSSet 的建议。对于产品 ID,我使用的不是“SKU”,而是我为每个 IAP 产品创建的产品 ID。 @dfd 在 iphone 中启用面部锁定时,应用内购买无法正常工作...。有什么建议为什么不能正常工作吗? @ParthBarot,这里没有建议。 App Store 购买 - 各种 - 都可以设置为使用 Face ID,但我认为这种事情嵌入在 StoreKit 中,并且发生在您将处理传递给 Apple 之后。对不起。【参考方案2】:

好的,答案很简单。有人告诉我设置“协议、税收和银行”iTunes 连接信息... 现在它就像一个魅力!

【讨论】:

以上是关于SKProduct 的快速应用内购买问题的主要内容,如果未能解决你的问题,请参考以下文章

iPhone - 如何检索应用内购买的自动续订订阅的持续时间

更新应用内购买价格

(iOS) 应用内购买失败?

SKProduct Swift - 信息从何而来?

快速获取用户的App购买价格

如何获得 iOS 11.2 以下的应用内购买订阅期?