【问题标题】:In-App Purchase not working, showing No Products应用内购买不起作用,显示没有产品
【发布时间】:2016-09-21 12:06:30
【问题描述】:

我正在了解 Apple 提供的应用内购买。所以我正在关注本教程: http://www.appcoda.com/in-app-purchase-tutorial/

我遵循了本教程中的所有步骤。首先,我创建了一个应用程序 ID,然后使用该应用程序 ID 在 iTunes 中创建了一个应用程序。然后我创建了两个产品 ID 为“com.outlines.feature1”和“com.outlines.feature2”的应用内购买,它们都是消耗品。 其余代码我只是按照上述教程中的步骤进行操作

import UIKit
import StoreKit

protocol IAPurchaceViewControllerDelegate {
    func didBuyColorsCollection(collectionIndex: Int)
}


class IAPurchaceViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, SKProductsRequestDelegate, SKPaymentTransactionObserver {

@IBOutlet weak var tblProducts: UITableView!

var delegate: IAPurchaceViewControllerDelegate!

var selectedProductIndex: Int!
var transactionInProgress = false

let productIdentifiers = NSSet(array: ["com.outlines.feature1", "com.outlines.feature2"])
 var product: SKProduct?
var productsArray = Array<SKProduct>()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    tblProducts.delegate = self
    tblProducts.dataSource = self

    //checks whether the In-App feature is activated or not
    requestProductInfo()

    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}

func requestProductInfo(){
    if SKPaymentQueue.canMakePayments() {
        let request = SKProductsRequest(productIdentifiers:
            productIdentifiers as! Set<String>)
        print("This is the request to be sent \(request)")
        request.delegate = self
        request.start()//calls productsRequest() function
    }
    else {
        print("Cannot perform In App Purchases.")
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// MARK: IBAction method implementation

@IBAction func dismiss(sender: AnyObject) {
    dismissViewControllerAnimated(true, completion: nil)
}


// MARK: UITableView method implementation

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return productsArray.count
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("idCellProduct", forIndexPath: indexPath) as UITableViewCell

    let product = productsArray[indexPath.row]
    cell.textLabel?.text = product.localizedTitle
    cell.detailTextLabel?.text = product.localizedDescription

    return cell
}


func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    selectedProductIndex = indexPath.row
    showActions()
    tableView.cellForRowAtIndexPath(indexPath)?.selected = false
}

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 80.0
}




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    if response.products.count != 0 {
        for product in response.products {
            productsArray.append(product as SKProduct)
        }

        tblProducts.reloadData()
    }
    else {
        print("There are no products.")
    }

    if response.invalidProductIdentifiers.count != 0 {
        print("Invalid "+response.invalidProductIdentifiers.description)
    }
}

func showActions() {
    if transactionInProgress {
        return
    }

    let actionSheetController = UIAlertController(title: "IAPDemo", message: "What do you want to do?", preferredStyle: UIAlertControllerStyle.ActionSheet)

    let buyAction = UIAlertAction(title: "Buy", style: UIAlertActionStyle.Default) { (action) -> Void in
        let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
        SKPaymentQueue.defaultQueue().addPayment(payment)
        self.transactionInProgress = true
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (action) -> Void in

    }

    actionSheetController.addAction(buyAction)
    actionSheetController.addAction(cancelAction)

    presentViewController(actionSheetController, animated: true, completion: nil)
}

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions as [SKPaymentTransaction] {
        switch transaction.transactionState {
        case SKPaymentTransactionState.Purchased:
            print("Transaction completed successfully.")
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            transactionInProgress = false
            delegate.didBuyColorsCollection(selectedProductIndex)

        case SKPaymentTransactionState.Failed:
            print("Transaction Failed");
            SKPaymentQueue.defaultQueue().finishTransaction(transaction)
            transactionInProgress = false

        default:
            print(transaction.transactionState.rawValue)
        }
    }
}  
}

没有错误,但是当我在 iPhone 上运行时,控制台显示:

This is the request to be sent <SKProductsRequest: 0x15d86210>
There are no products.
Invalid ["com.outlines.feature1", "com.outlines.feature2"]

控制台没有显示任何产品,但是我在我的 iTunes id 中添加了两个应用内功能。这是屏幕截图:

谁能告诉我我做错了什么??

【问题讨论】:

  • 在InApp Purchase所在的地方放一张屏幕截图。并查看状态是否更改为Ready to Submit 然后它会起作用。最好关注InApp Tutorial
  • @krazzie KAy 虽然我已经完成了许可协议流程,但我也遇到了同样的问题。你能帮我解决这个问题吗?

标签: ios in-app-purchase


【解决方案1】:

我终于解决了。代码和应用内购买过程中没有错误。之前提到的上传快照的解决方案也不是问题。

问题是协议、税收和烘焙中的合同。教程中没有提到,但我们需要在 iTunes 中完成协议、税务和银行业务中的合同,我没有这样做。填写合同表格后,将进行处理。然后合同将生效,然后在 iTunes 中创建的应用内购买将被识别。

【讨论】:

  • 我也有同样的问题。我已经填写了所有银行和税务信息,但我仍然没有可用的产品。我已经在 4-5 小时前设置了所有需要的信息,但仍然没有。需要更多时间吗?
  • 抱歉回复晚了,但是如果我没记错的话,确实需要 2-4 天的时间......
  • 在 iTunes Connect 中添加完我的信息后大约 5-10 分钟它对我有用
  • 协议、税收和烘焙在哪里?我没有找到用户帐户。需要管理员帐号吗?
  • omg 也发现了它的艰难方式.. 不敢相信它没有记录在任何地方并且需要进行测试!为什么他们需要它进行测试
【解决方案2】:

要在您的设备上测试 IAP,您无需提交屏幕截图。只有在提交应用时才需要。

确保您可以对以下每个问题回答“是”:

  1. 您是否为您的 App ID 启用了应用内购买?
  2. 您是否已为您的产品检查过清仓销售?
  3. 您项目的 .plist Bundle ID 是否与您的 App ID 匹配?
  4. 您是否为新的 App ID 生成并安装了新的配置文件?
  5. 您是否已将项目配置为使用此新的配置文件进行代码签名?
  6. 您在发出 SKProductRequest 时是否使用了完整的产品 ID?
  7. 您是否在将产品添加到 iTunes Connect 后等待了几个小时?
  8. 您是否尝试过从设备中删除该应用并重新安装?
  9. 您的设备是否越狱了?如果是这样,您需要恢复越狱才能使 IAP 正常工作。

如果您对这些问题中的任何一个回答“否”,那就是您的问题。

您正在使用 tableView,请确保您已设置正确的参数以加载到单元格中。可能您的问题与 tableview 有关。

【讨论】:

  • 在所有这些中,我不得不对最后两个选项说不。但是,我下载了教程项目并在模拟器中运行它,它似乎显示了IAP产品,只有购买功能在模拟器中不起作用。但就我而言,IAP 产品无效,我不明白,因为我已按照教程中的确切步骤进行操作。
  • 你使用的是你下载的同一个项目吗?还是换了新的?
  • 我从那个教程下载了启动项目,并开始工作
  • 那个问题。在编写教程时,我会创建新项目并复制类...
  • 毕竟,确保您在真正的 Apple TV(通过 USB 连接)上而不是在模拟器上进行测试!这是我没有获得有效产品 ID 的问题。
【解决方案3】:

您需要在 productID 字段中包含完整的字符串 com.product.productID。该界面让您相信您只需要最后一部分:productID,但它对我不起作用,直到我使用整个显式 ID 重新创建新的应用内购买:(

可能与前一天接受税收/银行业务有关。

【讨论】:

    【解决方案4】:

    您的应用内购买尚未完全设置,如您所见,它们的状态为“等待截图”:

    在您提交应用内购买以供审核之前,您必须上传 截屏。此屏幕截图仅用于查看目的。它会 不会在 App Store 上显示。屏幕截图必须至少 312x390 像素和至少 72 DPI。

    通常我会制作带有应用内购买建议警报的屏幕截图,将其剪切并上传到 iTunesConnect。

    完成此操作后,您当前的购买应具有“准备提交”状态:

    附:使新的更改生效需要一些时间,所以请耐心等待:)

    【讨论】:

    • 我应该上传什么截图??我的意思是它只是一个示例测试应用程序,我没有截图或任何东西......
    • 没关系,编辑你的购买,你会在底部看到一个应该上传屏幕的部分。
    • 好的,我试试,我应该尝试任何随机图片吗?
    • 我认为是的,您应该在上传构建以供审核时设置正确的屏幕截图。
    • 它不工作。我刚刚上传了一个截图,应用内购买显示“准备提交”,我刚刚运行我的项目,它仍然显示同样的错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多